برق و الکترونیک *دانلود پروژه رایگان @microstm32 Channel on Telegram

برق و الکترونیک *دانلود پروژه رایگان

@microstm32


بسمه تعالی
دانلود پروژه و پی سی بی رایگان

برق و الکترونیک *دانلود پروژه رایگان (Persian)

با عرض سلام و احترام به دوستان عزیز علاقه‌مند به علوم برق و الکترونیک! آیا به دنبال پروژه‌های جذاب در زمینه برق و الکترونیک هستید؟ اگر پاسخ شما بله است، پس کانال تلگرام "برق و الکترونیک *دانلود پروژه رایگان" یک انتخاب عالی برای شماست. این کانال حاوی پروژه‌های متنوع و جذاب در زمینه برق و الکترونیک می‌باشد که می‌توانید آنها را به صورت رایگان دانلود کنید. از آموزش‌های تخصصی تا پروژه‌های عملی، این کانال همه‌چیز را برای شما در نظر گرفته است. اگر به دنبال یادگیری و آموزش عملی در زمینه برق و الکترونیک هستید، این کانال یک منبع عالی برای شماست. از چراغ‌های LED گرفته تا مدارات الکترونیکی پیشرفته، همه چیز را می‌توانید در این کانال پیدا کنید. به کانال "برق و الکترونیک *دانلود پروژه رایگان" بپیوندید و از بهترین و جذاب‌ترین پروژه‌های برق و الکترونیک بهره‌مند شوید. منتظر حضور گرم و فعالیت شما در این کانال هستیم.

برق و الکترونیک *دانلود پروژه رایگان

16 Feb, 03:10


https://youtu.be/YII_LE2IDmA?si=6DiTKVV9VeA_UaKX

برق و الکترونیک *دانلود پروژه رایگان

15 Feb, 17:37




GregorianDate hijri_to_gregorian(HijriDate hDate) {
uint32_t jdn = hijri_to_jdn(hDate);
return jdn_to_gregorian(jdn);
}

// تابع ارسال رشته از طریق UART
void send_uart(char *str) {
HAL_UART_Transmit(&huart2, (uint8_t*)str, strlen(str), HAL_MAX_DELAY);
}

// بازنویسی تابع `printf` برای UART
int _write(int file, char *ptr, int len) {
HAL_UART_Transmit(&huart2, (uint8_t*)ptr, len, HAL_MAX_DELAY);
return len;
}

// تابع اصلی
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USART2_UART_Init();

// مثال ۱: تبدیل میلادی به هجری
GregorianDate gregDate = {2023, 10, 7}; // تاریخ میلادی ورودی
HijriDate hijriDate = gregorian_to_hijri(gregDate);
printf("Gregorian: %04u-%02u-%02u => Hijri: %04u-%02u-%02u\r\n",
gregDate.year, gregDate.month, gregDate.day,
hijriDate.year, hijriDate.month, hijriDate.day);

// مثال ۲: تبدیل هجری به میلادی
HijriDate hijriInput = {1445, 3, 21}; // تاریخ هجری ورودی
GregorianDate gregResult = hijri_to_gregorian(hijriInput);
printf("Hijri: %04u-%02u-%02u => Gregorian: %04u-%02u-%02u\r\n",
hijriInput.year, hijriInput.month, hijriInput.day,
gregResult.year, gregResult.month, gregResult.day);

while (1) {}
}

// ------------ توابع راه‌اندازی HAL ------------
void SystemClock_Config(void) {
// پیکربندی کلاک (متناسب با MCU شما)
}

void MX_USART2_UART_Init(void) {
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&huart2);
}


---

### مراحل راه‌اندازی در STM32CubeIDE:
1. ایجاد پروژه جدید:
- میکروکنترلر STM32 مورد نظر خود را انتخاب کنید (مثلاً STM32F103C8T6).
- در CubeMX**، پین `USART2_TX` را به یک پین مناسب (مثلاً PA2) و `USART2_RX` را به PA3 وصل کنید.

2. **پیکربندی UART
:
- در تب Connectivity**، `USART2` را در حالت **Asynchronous فعال کنید.
- Baud Rate را روی 115200 تنظیم کنید.

3. پیکربندی کلاک:
- در تب Clock Configuration**، کلاک سیستم را متناسب با میکروکنترلر خود تنظیم کنید (مثلاً 72 MHz برای STM32F1).

4. **تولید کد
:
- پروژه را در STM32CubeIDE تولید کنید و کدهای بالا را در main.c جایگذاری کنید.

5. اتصال به کامپیوتر:
- میکروکنترلر را از طریق USB به کامپیوتر وصل کنید.
- از یک ترمینال سریال (مثل Putty یا Tera Term) با Baud Rate 115200 برای مشاهده خروجی استفاده کنید.

---

### خروجی مورد انتظار:
Gregorian: 2023-10-07 => Hijri: 1445-03-21
Hijri: 1445-03-21 => Gregorian: 2023-10-07


---

### نکات مهم:
- دقت: این الگوریتم یک تقریب است و ممکن است تا ۱-۲ روز اختلاف داشته باشد.
- بهینه‌سازی: برای میکروکنترلرهای ضعیفتر، محاسبات را ساده کنید یا از Lookup Tables استفاده کنید.
- پیکربندی UART: مطمئن شوید پینهای USART2 به درستی تنظیم شدهاند.
- تست: تاریخهای مختلف را برای بررسی صحت تبدیل آزمایش کنید.

برق و الکترونیک *دانلود پروژه رایگان

15 Feb, 17:36


در زیر یک برنامه کامل برای تبدیل تاریخ میلادی به هجری قمری و بالعکس برای میکروکنترلر STM32 (با استفاده از HAL Library و محیط STM32CubeIDE) آورده شده است. این کد شامل راهاندازی UART برای ارسال خروجی به کامپیوتر است.

---

### کد کامل برای STM32 (با استفاده از UART):

#### 1. فایل `main.c`:
#include "main.h"
#include <stdio.h>
#include <stdint.h>

UART_HandleTypeDef huart2;

// تعریف ساختارهای تاریخ
typedef struct {
uint16_t year;
uint8_t month;
uint8_t day;
} GregorianDate;

typedef struct {
uint16_t year;
uint8_t month;
uint8_t day;
} HijriDate;

// آرایه سالهای کبیسه هجری (در چرخه 30 ساله)
const uint8_t hijriLeapYears[] = {1, 4, 6, 9, 12, 15, 17, 20, 23, 25, 28};

// --------- توابع تبدیل تاریخ ----------
// [همان توابع قبلی برای JDN و تبدیل تاریخ]
// ---------------------------------------

// تابع محاسبه JDN از میلادی
uint32_t gregorian_to_jdn(GregorianDate date) {
uint16_t Y = date.year;
uint8_t M = date.month;
uint8_t D = date.day;
return (1461 * (Y + 4800 + (M - 14)/12))/4
+ (367 * (M - 2 - 12 * ((M -14)/12)))/12
- (3 * ((Y + 4900 + (M - 14)/12)/100))/4
+ D
- 32075;
}

GregorianDate jdn_to_gregorian(uint32_t jdn) {
GregorianDate date;
uint32_t l = jdn + 68569;
uint32_t n = (4 * l) / 146097;
l = l - (146097 * n + 3) / 4;
uint32_t i = (4000 * (l + 1)) / 1461001;
l = l - (1461 * i) / 4 + 31;
uint32_t j = (80 * l) / 2447;
date.day = l - (2447 * j) / 80;
l = j / 11;
date.month = j + 2 - 12 * l;
date.year = 100 * (n - 49) + i + l;
return date;
}

uint32_t hijri_to_jdn(HijriDate date) {
uint16_t year = date.year;
uint8_t month = date.month;
uint8_t day = date.day;
uint32_t totalYears = year - 1;
uint16_t cycles = totalYears / 30;
uint16_t remainingYears = totalYears % 30;

uint8_t leapCount = 0;
for (uint8_t i = 0; i < remainingYears; i++) {
for (uint8_t j = 0; j < 11; j++) {
if (i == hijriLeapYears[j]) {
leapCount++;
break;
}
}
}

uint32_t totalLeapYears = cycles * 11 + leapCount;
uint32_t totalDays = totalYears * 354 + totalLeapYears;

uint16_t cyclePos = (year - 1) % 30;
uint8_t isLeap = 0;
for (uint8_t j = 0; j < 11; j++) {
if (cyclePos == hijriLeapYears[j]) {
isLeap = 1;
break;
}
}

uint8_t monthLengths[] = {30,29,30,29,30,29,30,29,30,29,30, isLeap ? 30 : 29};

for (uint8_t m = 0; m < month - 1; m++) {
totalDays += monthLengths[m];
}

totalDays += day - 1;
return 1948440 + totalDays;
}

HijriDate jdn_to_hijri(uint32_t jdn) {
HijriDate date;
uint32_t daysSinceEpoch = jdn - 1948440;
uint32_t totalDays = daysSinceEpoch;
uint16_t year = 1;

while (1) {
uint16_t cyclePos = (year - 1) % 30;
uint8_t isLeap = 0;
for (uint8_t j = 0; j < 11; j++) {
if (cyclePos == hijriLeapYears[j]) {
isLeap = 1;
break;
}
}
uint32_t daysInYear = isLeap ? 355 : 354;
if (totalDays >= daysInYear) {
totalDays -= daysInYear;
year++;
} else {
break;
}
}

uint16_t cyclePos = (year - 1) % 30;
uint8_t isLeap = 0;
for (uint8_t j = 0; j < 11; j++) {
if (cyclePos == hijriLeapYears[j]) {
isLeap = 1;
break;
}
}

uint8_t monthLengths[] = {30,29,30,29,30,29,30,29,30,29,30, isLeap ? 30 : 29};
uint8_t month, day;

for (month = 1; month <= 12; month++) {
uint8_t length = monthLengths[month - 1];
if (totalDays < length) {
day = totalDays + 1;
break;
}
totalDays -= length;
}

date.year = year;
date.month = month;
date.day = day;
return date;
}

HijriDate gregorian_to_hijri(GregorianDate gDate) {
uint32_t jdn = gregorian_to_jdn(gDate);
return jdn_to_hijri(jdn);
}

برق و الکترونیک *دانلود پروژه رایگان

14 Feb, 13:08


https://github.com/jorgebianchetti/W25X0XGV/tree/master

برق و الکترونیک *دانلود پروژه رایگان

09 Feb, 06:56


https://github.com/lbthomsen/stm32-w25qxx/tree/master

برق و الکترونیک *دانلود پروژه رایگان

09 Feb, 06:51


https://github.com/Crazy-Geeks/STM32-W25Q-QSPI/tree/main

برق و الکترونیک *دانلود پروژه رایگان

08 Feb, 21:11


# قابلیت DMA در تایمرهای میکروکنترلر STM32H743IIT6 و کاربردهای آن

DMA (Direct Memory Access) یکی از ویژگی‌های مهم در STM32H743IIT6 است که امکان انتقال داده‌ها بین تایمر (TIMx) و حافظه را بدون نیاز به مداخله CPU فراهم می‌کند. این ویژگی باعث افزایش کارایی پردازنده و کاهش مصرف انرژی می‌شود، به‌ویژه در پردازش سیگنال‌های سریع و کارهای بلادرنگ.

---

## ۱. کاربرد DMA در تایمرهای STM32H743IIT6
DMA در تایمرها می‌تواند در موارد زیر به کار رود:

به‌روزرسانی مقدار مقایسه‌ای PWM (Auto Update PWM)
ذخیره مقدار Capture در حافظه (Input Capture DMA Mode)
استفاده برای تولید امواج PWM با داده‌های متغیر (Waveform Generation)
ارسال خروجی به DAC یا پردازش داده‌های ورودی از ADC
کنترل موتور و مدولاسیون سیگنال‌های پیچیده

---

## ۲. انواع درخواست‌های DMA در تایمرها
در STM32H743IIT6**، تایمرها می‌توانند چندین درخواست **DMA داشته باشند:

| نوع درخواست DMA | توضیح |
|--------------------|-----------|
| Update DMA Request (UDE) | ارسال داده هنگام بروزرسانی تایمر (مثلاً برای PWM با داده‌های متغیر) |
| Capture Compare DMA Request (CCxDE) | ارسال داده هنگام مقایسه مقدار تایمر با مقدار تنظیم‌شده (مناسب برای ذخیره وقایع در حافظه) |
| Trigger DMA Request (TDE) | ارسال داده هنگام فعال شدن تریگر تایمر |
| Commutation DMA Request (COMDE) | مخصوص کنترل موتورهای الکتریکی |

---

## ۳. پیاده‌سازی مثال عملی
### مثال ۱: تولید PWM با مقادیر متغیر با استفاده از DMA
در این مثال، از DMA برای تغییر مقدار PWM در زمان اجرا استفاده می‌کنیم.

### 🛠 تنظیمات در CubeMX:
1. فعالسازی TIM1 در مد PWM
2. فعالسازی DMA Stream برای TIM1_CH1
3. انتخاب Memory to Peripheral برای انتقال داده به رجیستر مقایسه‌ای (CCR1)
4. تنظیم Circular Mode در DMA

---

### 💻 کدنویسی برای تغییر مقدار PWM با DMA
#### ۱) مقداردهی اولیه DMA و تایمر
#include "main.h"

extern TIM_HandleTypeDef htim1;
extern DMA_HandleTypeDef hdma_tim1_ch1;

uint32_t pwmValues[5] = {200, 400, 600, 800, 1000}; // مقادیر متغیر برای PWM

void TIM1_PWM_DMA_Init(void) {
// شروع انتقال داده از حافظه به تایمر با استفاده از DMA
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, pwmValues, 5);
}


#### ۲) راه‌اندازی در تابع `main.c`
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_TIM1_Init();

TIM1_PWM_DMA_Init(); // اجرای تابع مقداردهی اولیه

while (1) {
HAL_Delay(1000);
}
}

🔹 تحلیل عملکرد:
مقدار PWM به صورت متناوب تغییر می‌کند.
مقدار CCR1 با استفاده از DMA بروزرسانی می‌شود.
CPU هیچ پردازشی انجام نمی‌دهد، زیرا انتقال داده‌ها به تایمر مستقیماً توسط DMA انجام می‌شود.

---

### مثال ۲: ذخیره مقدار Capture در حافظه با استفاده از DMA
در این مثال، مقدار ورودی ثبت‌شده توسط تایمر را در یک آرایه حافظه‌ای ذخیره می‌کنیم.

### 🛠 تنظیمات در CubeMX:
1. فعالسازی TIM2 در مد Input Capture
2. فعالسازی DMA برای TIM2_CH1
3. Memory to Peripheral Mode را انتخاب کنید

---

### 💻 کدنویسی برای ذخیره مقدار Capture با DMA
#### ۱) مقداردهی اولیه
#include "main.h"

extern TIM_HandleTypeDef htim2;
extern DMA_HandleTypeDef hdma_tim2_ch1;

uint32_t captureValues[10]; // آرایه ذخیره مقادیر ورودی

void TIM2_Capture_DMA_Init(void) {
HAL_TIM_IC_Start_DMA(&htim2, TIM_CHANNEL_1, captureValues, 10);
}


#### ۲) اجرای کد در `main.c`
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_TIM2_Init();

TIM2_Capture_DMA_Init(); // مقداردهی اولیه تایمر و DMA

while (1) {
HAL_Delay(1000);
}
}


🔹 تحلیل عملکرد:
مقدار Capture در آرایه captureValues[] ذخیره می‌شود.
هر بار که لبه سیگنال ورودی رخ دهد، مقدار آن ثبت خواهد شد.
CPU پردازش خاصی انجام نمی‌دهد و این وظیفه به DMA سپرده شده است.

---

## ۴. جمع‌بندی
💡 DMA یکی از ویژگی‌های مهم تایمرهای STM32H743IIT6 است که باعث کاهش بار پردازنده و افزایش کارایی می‌شود.
💡 با استفاده از DMA، می‌توان PWM با مقادیر متغیر، ثبت داده‌های ورودی و کنترل پیشرفته موتور را انجام داد.
💡 در این آموزش دو مثال عملی برای انتقال داده‌های PWM و ذخیره مقادیر Capture ارائه شد.

برق و الکترونیک *دانلود پروژه رایگان

08 Feb, 19:04


https://youtu.be/2N_T7VFymFg?si=qh8FKfYTTY3iIjno

برق و الکترونیک *دانلود پروژه رایگان

08 Feb, 18:18


https://youtu.be/9N1_8vz6R78?si=DpD6qNNRa21LyWBi

برق و الکترونیک *دانلود پروژه رایگان

08 Feb, 17:23


https://youtube.com/shorts/mrBz9-9qgGw?si=Ube9M1Kwpcz-M8pX

برق و الکترونیک *دانلود پروژه رایگان

07 Feb, 16:35


## آموزش تایمر LPTIM در میکروکنترلر STM32 با مثال عملی

LPTIM (Low-Power Timer) یک تایمر کم‌مصرف در میکروکنترلرهای STM32 است که برای کاربردهایی که نیاز به مصرف انرژی پایین، دقت بالا و قابلیت اجرای وظایف در حالت کم‌مصرف (Low Power Mode) دارند، طراحی شده است.

---

# ۱. ویژگی‌های اصلی LPTIM
مصرف انرژی بسیار کم (قابل اجرا در حالت Stop و Standby)
دقت بالا برای زمان‌بندی‌های طولانی (32 بیتی)
امکان اجرای PWM، تایمر شمارشی و Encoder Interface
قابلیت ورودی خارجی برای شمارنده و Event Trigger
پشتیبانی از خروجی PWM در مدهای مختلف

موارد استفاده:
🔹 زمان‌بندی‌های طولانی با مصرف انرژی کم
🔹 تولید پالس PWM در حالت کم‌مصرف
🔹 اندازه‌گیری فرکانس و شمارش رویدادها
🔹 کنترل توان و بیدار کردن پردازنده

---

# ۲. نحوه راه‌اندازی و استفاده از LPTIM
در اینجا دو مثال کاربردی را بررسی خواهیم کرد:
1. تولید PWM کم‌مصرف
2. استفاده از LPTIM به‌عنوان شمارنده خارجی

---

## مثال ۱: تولید سیگنال PWM کم‌مصرف
### 🛠 مراحل راه‌اندازی در CubeMX:
1. CubeMX را باز کنید و میکروکنترلر خود را انتخاب کنید.
2. در قسمت Timers**، تایمر **LPTIM1 را در مد PWM Output فعال کنید.
3. یک پین GPIO را به LPTIM1_OUT متصل کنید.
4. مقدار Prescaler را روی DIV1 بگذارید (یا مقدار دلخواه).
5. مقدار Counter Period را تنظیم کنید.
6. روی Generate Code کلیک کنید تا کد HAL تولید شود.

---

### 💻 کدنویسی برای راه‌اندازی LPTIM در مد PWM
در main.c**، ابتدا مقداردهی اولیه LPTIM را انجام دهید:

```c
#include "main.h"

extern LPTIM_HandleTypeDef hlptim1; // تایمر LPTIM1

void LPTIM1_Init(void) {
HAL_LPTIM_PWM_Start(&hlptim1, 1000, 500); // مقدار 1000 دوره و 500 Duty Cycle (50%)
}
```

🔹 تحلیل عملکرد:
**PWM فعال می‌شود
و با دوره 1000 و Duty Cycle = 50% سیگنال تولید می‌کند.
این تایمر حتی در حالت کم‌مصرف هم کار خواهد کرد.

---

### 💡 تغییر مقدار Duty Cycle در زمان اجرا
می‌توان مقدار Duty Cycle را در هنگام اجرا تغییر داد:

void Set_PWM_DutyCycle(uint32_t duty) {
if (duty > 100) duty = 100; // محدود کردن مقدار به 100%
uint32_t compare_value = (1000 * duty) / 100; // محاسبه مقدار مقایسه‌ای
HAL_LPTIM_PWM_SetOnce(&hlptim1, 1000, compare_value);
}


🔹 با این تابع، مقدار PWM را تغییر می‌دهیم تا بتوانیم سیگنال را تنظیم کنیم.

---

## مثال ۲: استفاده از LPTIM به‌عنوان شمارنده خارجی
در این مثال، LPTIM ورودی رویدادهای خارجی (External Events) را می‌شمارد.

### 🛠 تنظیمات در CubeMX:
1. در CubeMX**، تایمر **LPTIM1 را در مد External Counter Mode تنظیم کنید.
2. یک پین ورودی را برای LPTIM1_IN1 تنظیم کنید.
3. کد را تولید کنید و تغییرات زیر را اعمال کنید.

---

### 💻 کدنویسی برای استفاده از LPTIM به‌عنوان شمارنده خارجی
void Start_LPTIM_ExternalCounter(void) {
HAL_LPTIM_Counter_Start(&hlptim1, 0xFFFF); // شمارنده را روی مقدار حداکثر قرار می‌دهیم.
}

uint32_t Get_LPTIM_Count(void) {
return HAL_LPTIM_ReadCounter(&hlptim1); // خواندن مقدار شمارش شده
}


🔹 تحلیل عملکرد:
LPTIM به‌عنوان شمارنده خارجی عمل می‌کند.
می‌توان تعداد پالس‌های ورودی را با خواندن مقدار شمارنده LPTIM مشاهده کرد.
مناسب برای اندازه‌گیری فرکانس و تعداد پالس‌های دریافتی از سنسورها و سایر منابع خارجی است.

---

# ۳. مقایسه LPTIM با سایر تایمرها
| ویژگی | LPTIM | TIMx (Advanced/General-Purpose) |
|-----------|----------|----------------------------------|
| مصرف توان کم | بله | خیر |
| پشتیبانی از حالت STOP و Standby | بله | خیر |
| رزولوشن تایمر | 16 یا 32 بیت | 16 یا 32 بیت |
| قابلیت PWM | بله | بله |
| قابلیت شمارش رویداد خارجی | بله | خیر |
| کاربرد در کنترل توان و مدیریت مصرف انرژی | بله | خیر |

---

# ۴. جمع‌بندی
💡 LPTIM تایمری کم‌مصرف و کاربردی در میکروکنترلرهای STM32 است که برای PWM، شمارنده‌های خارجی و کنترل توان استفاده می‌شود.
💡 در این آموزش، دو مثال برای تولید سیگنال PWM و شمارنده خارجی ارائه شد.
💡 در مقایسه با تایمرهای معمولی، LPTIM حتی در حالت کم‌مصرف هم کار می‌کند و انرژی زیادی صرفه‌جویی می‌کند.

برق و الکترونیک *دانلود پروژه رایگان

07 Feb, 16:08


# قابلیت Oversampling در ADC میکروکنترلر STM32

Oversampling یکی از قابلیت‌های ADC در میکروکنترلرهای STM32 است که باعث افزایش دقت (Resolution) و کاهش نویز (Noise) در تبدیل آنالوگ به دیجیتال می‌شود. این روش با جمع‌آوری چندین نمونه از سیگنال ورودی و پردازش آن‌ها، باعث افزایش کیفیت داده‌های ADC می‌شود.

---

## ۱. Oversampling چیست و چگونه کار می‌کند؟
در ADC معمولی، هر مقدار ولتاژ آنالوگ تنها یک بار خوانده شده و به مقدار دیجیتال تبدیل می‌شود. در حالی که در Oversampling**، ADC چندین نمونه از ورودی را جمع‌آوری کرده و سپس با اعمال **میانگین‌گیری یا فیلترینگ دیجیتال**، مقدار دقیق‌تری را به‌دست می‌آورد.

**فرآیند کلی به این صورت است:

1. نمونه‌برداری چندگانه: ADC به جای گرفتن یک مقدار، 2^N نمونه از سیگنال را جمع‌آوری می‌کند.
2. جمع کردن مقادیر: تمامی مقادیر نمونه‌برداری شده جمع می‌شوند.
3. انتخاب روش پردازش: این داده‌ها می‌توانند به‌صورت جمع ساده (Accumulation) ذخیره شوند یا با تقسیم بر یک مقدار توان ۲ (Shifting Right) پردازش شده و مقدار میانگین گرفته شود.
4. افزایش دقت مؤثر (Effective Resolution): با افزایش تعداد نمونه‌ها، دقت مؤثر ADC تا 16 بیت می‌تواند افزایش یابد، حتی اگر ADC اصلی 12 بیتی باشد.

---

## ۲. مزایای استفاده از Oversampling
افزایش دقت موثر (Effective Resolution)
کاهش نویز تصادفی (Random Noise Reduction)
افزایش کیفیت اندازه‌گیری برای سیگنال‌های کم‌دامنه
ایده‌آل برای کاربردهای حساس مانند پردازش سیگنال‌های حسگرها

---

## ۳. نحوه استفاده از Oversampling در STM32 (HAL Library)
### ۱) مقداردهی اولیه ADC
ابتدا باید ADC را پیکربندی کنیم و قابلیت Oversampling را فعال کنیم.

ADC_HandleTypeDef hadc1;

void MX_ADC1_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};

/** تنظیمات اولیه ADC **/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // دقت اصلی 12 بیت
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
HAL_ADC_Init(&hadc1);

/** تنظیمات کانال ADC **/
sConfig.Channel = ADC_CHANNEL_0; // کانال 0 برای نمونه‌برداری
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}


---

### ۲) فعال‌سازی Oversampling
برای فعال کردن Oversampling در STM32، از ساختار ADC_OversamplingTypeDef استفاده می‌شود.

void Configure_ADC_Oversampling(void) {
ADC_OversamplingTypeDef sOversamplingConfig = {0};

sOversamplingConfig.OversamplingMode = ENABLE; // فعال‌سازی Oversampling
sOversamplingConfig.RightBitShift = ADC_RIGHTBITSHIFT_4; // تقسیم مقدار کل به 16 (۲^۴)
sOversamplingConfig.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; // شروع با یک تریگر
sOversamplingConfig.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; // ادامه تبدیل‌ها

sOversamplingConfig.OversamplingRatio = ADC_OVERSAMPLING_RATIO_16; // جمع‌آوری 16 نمونه

HAL_ADCEx_OversamplingConfig(&hadc1, &sOversamplingConfig);
}


> نکته:
> - RightBitShift تعیین می‌کند که داده‌های جمع‌شده چند بیت به راست شیفت شوند تا مقدار میانگین گرفته شود.
> - OversamplingRatio مشخص می‌کند که چند نمونه برای افزایش دقت جمع‌آوری شود. مقدار 16 به معنای جمع‌آوری 16 نمونه پشت سر هم است.
> - TriggeredMode تعیین می‌کند که همه نمونه‌ها در یک تریگر گرفته شوند یا هر نمونه با یک تریگر جداگانه انجام شود.

---

### ۳) شروع تبدیل ADC
پس از تنظیم ADC و Oversampling، باید تبدیل آنالوگ به دیجیتال را شروع کنیم.

void Start_ADC(void) {
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
uint32_t adc_value = HAL_ADC_GetValue(&hadc1);

printf("مقدار ADC با Oversampling: %lu\n", adc_value);
}


---

برق و الکترونیک *دانلود پروژه رایگان

07 Feb, 16:08


## ۴. افزایش دقت مؤثر ADC با Oversampling
با توجه به نسبت Oversampling Ratio**، دقت ADC به صورت زیر افزایش پیدا می‌کند:

| **Oversampling Ratio
| افزایش دقت مؤثر |
|------------------|-----------------|
| 2 | +0.5 بیت |
| 4 | +1 بیت |
| 8 | +1.5 بیت |
| 16 | +2 بیت |
| 32 | +2.5 بیت |
| 64 | +3 بیت |
| 128 | +3.5 بیت |
| 256 | +4 بیت |

> مثال:
> اگر ADC اصلی 12 بیتی باشد و Oversampling Ratio = 16 انتخاب شود، دقت مؤثر آن 14 بیت (12+2) خواهد شد.

---

## ۵. کاربردهای Oversampling
سنجش سنسورهای کم‌دامنه و حساس به نویز (مانند ترموکوپل و سنسورهای فشار)
بهبود دقت داده‌های ADC بدون نیاز به سخت‌افزار اضافی
پردازش سیگنال در تجهیزات پزشکی و صنعتی
فیلترینگ نویز در سیگنال‌های کم‌قدرت

---

## ۶. جمع‌بندی
- Oversampling یک روش پردازش دیجیتال است که با نمونه‌برداری چندگانه و میانگین‌گیری، دقت ADC را افزایش داده و نویز را کاهش می‌دهد.
- در STM32، می‌توان Oversampling Ratio را از 2 تا 256 تنظیم کرد.
- با استفاده از Oversampling + Right Bit Shift می‌توان ADC را تا 16 بیت مؤثر افزایش داد.
- این قابلیت برای پردازش سیگنال‌های دقیق، حذف نویز و افزایش دقت خواندن سنسورها بسیار مفید است.

🚀 اگر سوالی دارید، بپرسید! 😊

برق و الکترونیک *دانلود پروژه رایگان

07 Feb, 15:58


یک تابع در زبان C مینویسیم که دو رشته را دریافت کرده و تعداد تکرارهای رشته دوم در رشته اول و موقعیتهای آنها را مشخص میکند. در این راهحل، از الگوریتم جستجوی ساده برای بررسی زیررشتهها استفاده میشود و موقعیتها با استفاده از حافظه پویا ذخیره میشوند.

### کد نهایی

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int find_substrings(const char *str1, const char *str2, int **positions) {
if (str1 == NULL || str2 == NULL) {
*positions = NULL;
return 0;
}

int len1 = strlen(str1);
int len2 = strlen(str2);
int count = 0;
int i, j;

// بررسی شرایطی که زیررشته نمیتواند وجود داشته باشد
if (len2 == 0 || len1 < len2) {
*positions = NULL;
return 0;
}

// حداکثر تعداد ممکن موقعیتها
int max_positions = len1 - len2 + 1;
*positions = (int *)malloc(max_positions * sizeof(int));
if (*positions == NULL) {
return -1; // خطای تخصیص حافظه
}

// بررسی هر موقعیت ممکن در رشته اول
for (i = 0; i <= len1 - len2; i++) {
for (j = 0; j < len2; j++) {
if (str1[i + j] != str2[j]) {
break; // عدم تطابق، بررسی موقعیت بعدی
}
}
if (j == len2) { // اگر تمام کاراکترها مطابقت داشتند
(*positions)[count++] = i;
}
}

// تنظیم مجدد اندازه آرایه به تعداد واقعی موقعیتهای یافت شده
if (count == 0) {
free(*positions);
*positions = NULL;
} else {
int *temp = (int *)realloc(*positions, count * sizeof(int));
if (temp != NULL) {
*positions = temp;
}
}

return count;
}

// مثال استفاده از تابع
int main() {
const char *str1 = "ababa";
const char *str2 = "aba";
int *positions;
int count = find_substrings(str1, str2, &positions);

if (count > 0) {
printf("تعداد تکرارها: %d\nموقعیتها: ", count);
for (int i = 0; i < count; i++) {
printf("%d ", positions[i]);
}
printf("\n");
free(positions);
} else {
printf("زیررشته یافت نشد.\n");
}

return 0;
}

### شرح کد

1. بررسی ورودیهای نامعتبر: اگر هر یک از رشتههای ورودی NULL باشند یا طول رشته دوم از رشته اول بیشتر باشد، تابع بلافاصله خروجی را صفر برمیگرداند.

2. تخصیص حافظه پویا: آرایهای برای ذخیره موقعیتهای احتمالی با حداکثر اندازه ممکن (تفاضل طول دو رشته به علاوه یک) ایجاد میشود.

3. جستجوی زیررشته: با استفاده از دو حلقه تو در تو، هر موقعیت در رشته اول بررسی میشود تا مشخص شود آیا زیررشته مورد نظر از آنجا شروع میشود یا خیر.

4. ذخیره موقعیتها: در صورت یافتن زیررشته، موقعیت آن در آرایه ذخیره شده و شمارنده افزایش مییابد.

5. تنظیم مجدد اندازه آرایه: پس از اتمام جستجو، اگر موقعیتی یافت شده باشد، اندازه آرایه به تعداد واقعی موقعیتها کاهش مییابد. در غیر این صورت، حافظه آزاد میشود.

6. نمونه استفاده: در تابع main، مثال سادهای از استفاده از تابع نشان داده شده است که نتیجه را چاپ کرده و حافظه اختصاص داده شده را آزاد میکند.

این کد به گونهای طراحی شده است که کارایی مناسبی داشته باشد و شرایط مرزی مختلف را به درستی مدیریت کند.

برق و الکترونیک *دانلود پروژه رایگان

07 Feb, 10:46


🟠 سعدبن‌عبداللَّه قمی حدیثی طولانی از امام مهدي عجل الله تعالی فرجه الشریف نقل می‌کند و گوید: از امام صاحب‌الزمان صلوات الله علیه[که آن وقت در دامن پدر نشسته بودند] پرسیدم: به چه دلیل مردم نمی‌توانند برای خود امام انتخاب کنند؟ فرمودند: امام خوب یا بد؟ گفتم: امام خوب و شایسته. فرمودند: امکان دارد انتخابی که می‌کنند به جای خوب بد از کار درآید با اینکه هیچ‌کس اطّلاع از دل دیگری ندارد که چه چیز به خاطرش می‌گذرد، فکر خوب یا فکر بد؟ گفتم: آری ممکن است. فرمودند: همین موجب نداشتن چنین اختیاری است که با دلیلی برای تو توجیه کردم که عقلت بپذیرد. فرمودند: بگو ببینم پیامبرانی که خداوند آن‌ها را برگزیده و کتاب آسمانی بر آن‌ها نازل‌کرده و ایشان را به وحی ممتاز نموده و عصمت بخشیده چون برجسته‌ترین افراد مردم‌اند و از همه بهتر می‌توانند انتخاب نمایند که از جمله‌ی این پیامبران موسی و عیسی علیهما السلام نیز هستند، اگر به ایشان اختیار بدهند با توجه به کمال عقل و دانشی که این دو داشتند آیا ممکن است انتخاب آن‌ها در مورد کسی که خیال می‌کردند مؤمن است منافق از کار در آید؟ گفتم: نه. فرمودند: همین موسی علیه السلام با کمال عقل و دانشی که داشت و به او وحی شد: از میان قوم خود برای میقات خدا هفتادنفر را انتخاب کن. و او با اینکه یقین داشت منتخبان او مؤمن و مخلص هستند این انتخاب بر خلاف تصوّر او، بر منافقین قرارگرفت. خداوند در این آیه به همین مطلب اشاره می‌کند: موسی از قوم خود، هفتاد تن از مردان را برای میعادگاه ما برگزید ... (اعراف/۱۵۵)؛ وقتی انتخاب پیامبری که خدا او را برگزیده بر شخص فاسدی قرار گیرد با اینکه او خیال می‌کرد صالح است می‌فهمیم اجازه‌ی انتخاب فقط به کسی داده شده که از راز دلها و افکار پنهان و آینده‌ی اشخاص خبر دارد، داده شده، با این حال انتخاب مهاجرین و انصار چه اهمیتی دارد وقتی که انتخاب بهترین پیامبران وقتی قصد انتخاب صالحان را داشتند، اهل فساد از آب درآمد؟!

📚تفسیر اهل بیت علیهم السلام ج۱۱، ص۲۶۰
📚الإحتجاج؛ ج۲، ص۴۶۴

برق و الکترونیک *دانلود پروژه رایگان

07 Feb, 10:37


یک تابع در زبان C مینویسیم که دو رشته را دریافت کرده و بررسی میکند آیا رشته دوم درون رشته اول وجود دارد یا خیر. اگر وجود داشت، موقعیت اولین وقوع آن را برمیگرداند. در غیر این صورت مقدار -1 را بازمیگرداند.

### کد نهایی:
#include <stdio.h>
#include <string.h>

int findSubstring(const char *str1, const char *str2) {
// اگر رشته دوم خالی باشد، موقعیت 0 برگردانده میشود
if (*str2 == '\0') {
return 0;
}

int len1 = strlen(str1);
int len2 = strlen(str2);

// اگر طول رشته دوم از رشته اول بیشتر باشد، قطعا وجود ندارد
if (len2 > len1) {
return -1;
}

// بررسی تمام موقعیتهای ممکن در رشته اول
for (int i = 0; i <= len1 - len2; i++) {
// اگر کاراکتر اول تطابق داشت، بقیه را بررسی کن
if (str1[i] == str2[0]) {
int match = 1;
for (int j = 1; j < len2; j++) {
if (str1[i + j] != str2[j]) {
match = 0;
break;
}
}
// اگر تمام کاراکترها تطابق داشتند
if (match) {
return i;
}
}
}

// اگر هیچ تطابقی یافت نشد
return -1;
}

// مثال استفاده از تابع
int main() {
const char *str1 = "hello world";
const char *str2 = "world";

int position = findSubstring(str1, str2);
if (position != -1) {
printf("زیررشته در موقعیت %d یافت شد.\n", position); // خروجی: 6
} else {
printf("زیررشته یافت نشد.\n");
}

return 0;
}

### شرح کد:
1. بررسی حالتهای خاص:
- اگر رشته دوم خالی باشد (str2 == "")، موقعیت 0 برگردانده میشود.
- اگر طول رشته دوم از رشته اول بیشتر باشد، بلافاصله -1 برگردانده میشود.

2. حلقه بیرونی:
- تمام موقعیتهای ممکن در رشته اول را بررسی میکند (تا جایی که جای کافی برای رشته دوم باقی مانده باشد).

3. حلقه داخلی:
- اگر کاراکتر اول رشته دوم با موقعیت فعلی در رشته اول تطابق داشت، بقیه کاراکترها را مقایسه میکند.
- اگر تمام کاراکترهای رشته دوم با بخشی از رشته اول مطابقت داشت، موقعیت آن را برمیگرداند.

4. مقدار بازگشتی:
- اگر زیررشته یافت نشد، مقدار -1 برگردانده میشود.

### مثالهای تست:
- findSubstring("hello", "ll")2
- findSubstring("abc", "abcd")-1
- findSubstring("", "")0
- findSubstring("apple", "app")0

### نکات مهم:
- این تابع حسّاس به بزرگی و کوچکی حروف است.
- موقعیتها از ایندکس 0 شمارش میشوند.
- اگر رشته دوم چندبار در رشته اول تکرار شده باشد، موقعیت اولین وقوع برگردانده میشود.

برق و الکترونیک *دانلود پروژه رایگان

07 Feb, 10:36


یک تابع در زبان C مینویسیم که تعداد متغیری از رشتهها را دریافت کرده و آنها را به هم متصل میکند. برای مدیریت پارامترهای متغیر از کتابخانه stdarg.h استفاده میکنیم. در این روش، لیست رشتهها با یک NULL خاتمه مییابد تا تابع تشخیص دهد چه زمانی باید پردازش را متوقف کند.

### کد نهایی:
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* concatenate(const char* first, ...) {
if (first == NULL) {
char* result = malloc(1);
if (result) *result = '\0';
return result;
}

va_list args;
size_t total_length = 0;
const char* current = first;

// محاسبه طول کل تمام رشته‌ها
va_start(args, first);
do {
total_length += strlen(current);
current = va_arg(args, const char*);
} while (current != NULL);
va_end(args);

// اختصاص حافظه برای رشته نهایی
char* result = (char*)malloc(total_length + 1);
if (!result) return NULL;

char* ptr = result;

// الحاق رشته‌ها
va_start(args, first);
current = first;
do {
size_t len = strlen(current);
memcpy(ptr, current, len);
ptr += len;
current = va_arg(args, const char*);
} while (current != NULL);
va_end(args);

*ptr = '\0'; // پایان‌دهی رشته

return result;
}

// مثال استفاده از تابع
int main() {
char* str = concatenate("Hello", " ", "World!", NULL);
if (str) {
printf("%s\n", str); // خروجی: Hello World!
free(str);
}

str = concatenate("C", " ", "Programming", " ", "Language", NULL);
if (str) {
printf("%s\n", str); // خروجی: C Programming Language
free(str);
}

return 0;
}

### شرح کد:
1. محاسبه طول کل رشتهها: با استفاده از va_list و حلقه do-while، طول تمام رشتهها را جمع میزنیم تا حافظه لازم را اختصاص دهیم.
2. اختصاص حافظه: با توجه به طول کل محاسبهشده، حافظه مورد نیاز را اختصاص میدهیم.
3. الحاق رشتهها: دوباره از va_list استفاده کرده و هر رشته را به ترتیب به رشته نهایی اضافه میکنیم.
4. اتمام رشته: در انتها کاراکتر نول ('\0') را اضافه میکنیم تا رشته به درستی خاتمه یابد.

### نکات مهم:
- اگر اولین رشته NULL باشد، تابع یک رشته خالی برمیگرداند.
- کاربر باید آخرین آرگومان را NULL قرار دهد تا پایان لیست رشتهها مشخص شود.
- حافظه بازگشتی توسط تابع باید توسط کاربر آزاد شود (free()).

برق و الکترونیک *دانلود پروژه رایگان

06 Feb, 15:42


printf("نام کاربری: %s\n", username); // User123

return 0;
}

---

### **۷. اشتباهات رایج**
#### خطا ۱: عدم استفاده از `&` برای متغیرها

c
int num;
// غلط: sscanf(input, "%d", num);
// صحیح: sscanf(input, "%d", &num);

#### خطا ۲: عدم تطابق فرمت و دادهها

c
char input[] = "Hello";
int num;

// غلط: sscanf(input, "%d", &num); // خطای Undefined Behavior
`

---

۸. جدول فرمتهاها**
| فرمت | توضیح | مثال |
|--------|--------------------------------|-------------|
| `%d` | عدد صحیح (`int`) | `-42` |
| `%f` | عدد اعشاری (`float`) | `3.14` |
| `%lf` | عدد اعشاری (`double`) | `2.71828` |
| `%c` | یک کاراکتر | `'A'` |
| `%s` | رشته (تا فاصله یا خط جدید) | `"Hello"` |
| `%[^,]`| خواندن تا ویرگول | `"apple,"` |
| `%x` | عدد هگزادسیمال | `"1A3F"` |
| `%%` | خواندن کاراکتر `%` | `"50%"` |

---

۹. جمعبندیدی**
- `sscanf` برای تجزیه (Parse) دادهها از رشتهها بسیار قدرتمند است.
- هممقدار بازگشتیتی** را بررسی کنید تا از موفقیت عملیات مطمئن شوید.
- برای جلوگیری از خطاهایی ماBuffer Overflowow**، از Width Specifier (مثلاً `%9s` برای آرایه ۱۰ کاراکتری) استفاده کنید.

برق و الکترونیک *دانلود پروژه رایگان

06 Feb, 15:42


بیایید با جزئیات کامل به آموزش تابع sscanf در زبان C بپردازیم. این تابع برای خواندن دادههای قالببندیشده از یک رشته (String) استفاده میشود و شباهت زیادی به تابع scanf دارد، با این تفاوت که بهجای خواندن از ورودی استاندارد (مانند صفحهکلید)، از یک رشته بهعنوان منبع داده استفاده میکند.

---

### **۱. ساختار تابع sscanf**
int sscanf(const char *str, const char *format, ...);

- **پارامترها:**
- str: رشته ورودی که دادهها از آن خوانده میشوند.
- format: رشته فرمت که مشخص میکند چگونه دادهها خوانده شوند.
- ...: متغیرهای آدرسی که دادههای خواندهشده در آنها ذخیره میشمقدار بازگشتی:زگشتی:**
- تعداد متغیرهایی که با موفقیت خوانده شدهاند.
- اگر خطایی رخ دهد، EOF برمیگرداند.

-۲. مثالهای پایهی پایه**
#### مثال ۱: خواندن یک عدد صحیح از رشته
#include <stdio.h>

int main() {
char input[] = "42";
int num;

int result = sscanf(input, "%d", &num);

printf("خوانده شده: %d\n", num); // خروجی: 42
printf("تعداد متغیرهای خواندهشده: %d\n", result); // خروجی: 1

return 0;
}

#### مثال ۲: خواندن چند متغیر با انواع مختلف
#include <stdio.h>

int main() {
char input[] = "Ali 25 75.5";
char name[50];
int age;
float score;

int result = sscanf(input, "%s %d %f", name, &age, &score);

printf("نام: %s\n", name); // Ali
printf("سن: %d\n", age); // 25
printf("امتیاز: %.1f\n", score); // 75.5
printf("تعداد خواندهشده: %d\n", result); // 3

return 0;
}

-۳. خواندن دادههای پیچیدهترچیدهتر**
#### مثال ۳: خواندن تاریخ با فرمت مشخص (dd/mm/yyyy)
#include <stdio.h>

int main() {
char input[] = "31/12/2023";
int day, month, year;

int result = sscanf(input, "%d/%d/%d", &day, &month, &year);

printf("تاریخ: %d-%d-%d\n", day, month, year); // 31-12-2023
printf("تعداد خواندهشده: %d\n", result); // 3

return 0;
}

#### مثال ۴: خواندن بخشی از رشته با استWidth Specifiercifier**
#include <stdio.h>

int main() {
char input[] = "1234567890";
char first_part[5];
int num;

// خواندن ۴ کاراکتر اول و سپس یک عدد
sscanf(input, "%4s%d", first_part, &num);

printf("بخش اول: %s\n", first_part); // 1234
printf("عدد: %d\n", num); // 567890

return 0;
}

-۴. کار با کاراکترهای خاصای خاص**
#### مثال ۵: خواندن تا رسیدن به یک کاراکتر خاص (با استفاده از %[^])
#include <stdio.h>

int main() {
char input[] = "apple,banana,cherry";
char fruits[3][20];

// خواندن تا ویرگول
sscanf(input, "%[^,],%[^,],%s", fruits[0], fruits[1], fruits[2]);

printf("میوه ۱: %s\n", fruits[0]); // apple
printf("میوه ۲: %s\n", fruits[1]); // banana
printf("میوه ۳: %s\n", fruits[2]); // cherry

return 0;
}

#### مثال ۶: نادیده گرفتن کاراکترهای خاص (با استفاده از *)
#include <stdio.h>

int main() {
char input[] = "Product: 1234 Price: 99.99$";
int id;
float price;

// نادیده گرفتن کلمه "Product:" و خواندن عدد
sscanf(input, "Product: %d Price: %f$", &id, &price);

printf("شناسه: %d\n", id); // 1234
printf("قیمت: %.2f\n", price); // 99.99

return 0;
}

-۵. کنترل خطاها و اعتبارسنجیارسنجی**
#### مثال ۷: بررسی موفقیت عملیات با مقدار بازگشتی
#include <stdio.h>

int main() {
char input[] = "Error: Invalid Data";
int code;

int result = sscanf(input, "Error: %d", &code);

if (result == 1) {
printf("کد خطا: %d\n", code);
} else {
printf("فرمت رشته نادرست است!\n"); // این خط اجرا میشود
}

return 0;
}

-۶. خواندن دادههای پیشرفتهیشرفته**
#### مثال ۸: خواندن اعداد هگزادسیمال (با %x)
#include <stdio.h>

int main() {
char input[] = "Color: #FF5733";
unsigned int color;

sscanf(input, "Color: #%x", &color);

printf("مقدار هگز: %X\n", color); // FF5733

return 0;
}

#### مثال ۹: خواندن با استScansetcanset** (%[])
`c
#include <stdio.h>

int main() {
char input[] = "Username: User123!";
char username[20];

// خواندن فقط حروف و اعداد (تا رسیدن به کاراکتر غیرمجاز)
sscanf(input, "Username: %[A-Za-z0-9]", username);

برق و الکترونیک *دانلود پروژه رایگان

06 Feb, 15:27


برای پیادهسازی تابع split در زبان C که یک رشته را بر اساس یک جداکننده تقسیم میکند، میتوان از روش زیر استفاده کرد. این تابع تمام توکنها از جمله توکنهای خالی را در نظر میگیرد و آرایهای از رشتههای تقسیمشده را برمیگرداند.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** split(const char* str, char separator, int* count) {
int len = strlen(str);
int num_separators = 0;

// شمارش تعداد جداکنندهها
for (int i = 0; i < len; i++) {
if (str[i] == separator) {
num_separators++;
}
}

// محاسبه تعداد توکنها
int num_tokens = (len == 0) ? 0 : num_separators + 1;
if (num_tokens == 0) {
*count = 0;
return NULL;
}

// ذخیره اندیسهای جداکنندهها
int* separator_indices = malloc(num_separators * sizeof(int));
if (!separator_indices) {
return NULL;
}

int idx = 0;
for (int i = 0; i < len; i++) {
if (str[i] == separator) {
separator_indices[idx++] = i;
}
}

// اختصاص حافظه برای آرایه توکنها
char** tokens = malloc((num_tokens + 1) * sizeof(char*));
if (!tokens) {
free(separator_indices);
return NULL;
}

int token_index = 0;
int start = 0;

// استخراج توکنها بین جداکنندهها
for (int i = 0; i < num_separators; i++) {
int end = separator_indices[i] - 1;
int token_length = end - start + 1;
char* token = malloc(token_length + 1); // +1 برای نال ترمیناتور
if (!token) {
// آزادسازی حافظه در صورت خطا
for (int j = 0; j < token_index; j++) {
free(tokens[j]);
}
free(tokens);
free(separator_indices);
return NULL;
}
if (token_length > 0) {
strncpy(token, str + start, token_length);
}
token[token_length] = '\0';
tokens[token_index++] = token;
start = separator_indices[i] + 1;
}

// آخرین توکن بعد از آخرین جداکننده
int end = len - 1;
int token_length = end - start + 1;
char* token = malloc(token_length + 1);
if (!token) {
for (int j = 0; j < token_index; j++) {
free(tokens[j]);
}
free(tokens);
free(separator_indices);
return NULL;
}
if (token_length > 0) {
strncpy(token, str + start, token_length);
}
token[token_length] = '\0';
tokens[token_index++] = token;

// پایان آرایه با NULL
tokens[token_index] = NULL;
free(separator_indices);

*count = num_tokens;
return tokens;
}

// تابع برای آزاد کردن حافظه اختصاصدادهشده توسط split
void free_split_result(char** tokens) {
if (tokens) {
for (int i = 0; tokens[i] != NULL; i++) {
free(tokens[i]);
}
free(tokens);
}
}

// مثال استفاده از تابع
int main() {
const char* str = "hello,,world";
char separator = ',';
int count;
char** tokens = split(str, separator, &count);

if (tokens) {
printf("تعداد توکنها: %d\n", count);
for (int i = 0; i < count; i++) {
printf("توکن %d: '%s'\n", i, tokens[i]);
}
free_split_result(tokens);
}

return 0;
}

### توضیحات:
1. شمارش جداکنندهها: ابتدا تعداد جداکنندهها در رشته اصلی شمارش میشود.
2. محاسبه تعداد توکنها: تعداد توکنها برابر با تعداد جداکنندهها بهعلاوه یک است. اگر رشته خالی باشد، تعداد توکنها صفر در نظر گرفته میشود.
3. ذخیره اندیس جداکنندهها: اندیسهای تمام جداکنندهها در یک آرایه ذخیره میشوند.
4. استخراج توکنها: توکنها بین اندیسهای جداکنندهها استخراج میشوند. هر توکن شامل کاراکترهای بین دو جداکننده متوالی است.
5. آزادسازی حافظه: بعد از استفاده از توکنها، باید حافظه اختصاصدادهشده توسط تابع split با استفاده از تابع free_split_result آزاد شود.

### مثال خروجی:
برای رشته ورودی "hello,,world" با جداکننده ','، خروجی به صورت زیر خواهد بود:
تعداد توکنها: 3
توکن 0: 'hello'
توکن 1: ''
توکن 2: 'world'

این تابع تمام حالات از جمله توکنهای خالی در ابتدا، انتها یا بین جداکنندهها را بهدرستی پردازش میکند.

برق و الکترونیک *دانلود پروژه رایگان

06 Feb, 10:52


یک تابع به زبان C مینویسیم که تعداد مشخصی از کاراکترها را از ابتدا و انتهای یک رشته حذف کرده و رشته جدید را برگرداند. این تابع مواردی مانند مقادیر منفی یا بزرگتر از طول رشته را نیز مدیریت میکند.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* trim_string(const char* str, int n, int m) {
if (str == NULL) {
return NULL;
}

int len = strlen(str);

// اطمینان از عدم منفی بودن n و m
n = (n < 0) ? 0 : n;
m = (m < 0) ? 0 : m;

// محدود کردن n و m به طول رشته
if (n > len) {
n = len;
}
if (m > (len - n)) {
m = len - n;
}

int new_len = len - n - m;
char* result = (char*)malloc(new_len + 1); // +1 برای نال ترمیناتور
if (result == NULL) {
return NULL;
}

// کپی بخش مورد نظر از رشته اصلی
memcpy(result, str + n, new_len);
result[new_len] = '\0'; // پایان رشته

return result;
}

// مثال استفاده از تابع
int main() {
const char* str = "Hello, World!";
int n = 3;
int m = 4;

char* trimmed = trim_string(str, n, m);
if (trimmed != NULL) {
printf("Original: %s\n", str);
printf("Trimmed (%d from start, %d from end): '%s'\n", n, m, trimmed);
free(trimmed); // آزادسازی حافظه
}

// تست موارد خاص
char* test1 = trim_string("Example", 0, 0);
printf("\nTest 1: '%s'\n", test1);
free(test1);

char* test2 = trim_string("Test", 5, 2);
printf("Test 2: '%s'\n", test2);
free(test2);

char* test3 = trim_string("Hello", 1, 1);
printf("Test 3: '%s'\n", test3);
free(test3);

return 0;
}

### توضیحات:
1. ورودی تابع: رشته اصلی (str)، تعداد کاراکترهای حذف از ابتدا (n)، و تعداد کاراکترهای حذف از انتها (m).
2. بررسی مقادیر منفی: اگر n یا m منفی باشند، به صورت خودکار صفر در نظر گرفته میشوند.
3. محدود کردن مقادیر: اگر n یا m از طول رشته بیشتر باشند، به حداکثر مقدار ممکن محدود میشوند.
4. محاسبه طول جدید: طول رشته جدید پس از حذف کاراکترها محاسبه میشود.
5. اختصاص حافظه: حافظه لازم برای رشته جدید همراه با نال ترمیناتور اختصاص مییابد.
6. کپی بخش مورد نظر: بخش مربوطه از رشته اصلی به رشته جدید کپی میشود.
7. خروجی: رشته جدید برگردانده میشود که باید توسط کاربر آزاد شود.

### مثال خروجی:
Original: Hello, World!
Trimmed (3 from start, 4 from end): 'lo, Wo'

Test 1: 'Example'
Test 2: ''
Test 3: 'ell'

این تابع تمام حالات مرزی مانند رشته خالی، مقادیر منفی، یا مقادیر بزرگتر از طول رشته را به درستی مدیریت میکند.

برق و الکترونیک *دانلود پروژه رایگان

05 Feb, 19:00


https://youtu.be/eEbZA8cNpnU?si=8LZHFhmdJNxMML4n

برق و الکترونیک *دانلود پروژه رایگان

01 Feb, 17:06


https://www.youtube.com/watch?v=QbYkXtpWQFg

برق و الکترونیک *دانلود پروژه رایگان

28 Jan, 18:04


https://youtu.be/T_hVzTvqnzk?si=HBXF00oAR7ksvLCN

برق و الکترونیک *دانلود پروژه رایگان

25 Jan, 18:19


https://www.youtube.com/watch?v=OePcprDTicU

برق و الکترونیک *دانلود پروژه رایگان

21 Jan, 21:53


https://github.com/jfm92/microByte

برق و الکترونیک *دانلود پروژه رایگان

21 Jan, 18:41


https://youtu.be/TksaowiMMYk?si=ek0i4GYKfDOIxA0y

برق و الکترونیک *دانلود پروژه رایگان

19 Jan, 21:31


https://youtu.be/7Kd3R_RlXgc?si=KW9Yk-_MpLljbTix

برق و الکترونیک *دانلود پروژه رایگان

09 Jan, 18:01


https://youtu.be/UMrZAp4bFlM?si=k9Wcqwee3YAffADq

برق و الکترونیک *دانلود پروژه رایگان

08 Jan, 10:07


https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32p4/esp32-p4-function-ev-board/user_guide.html#hardware-reference

برق و الکترونیک *دانلود پروژه رایگان

08 Jan, 10:07


https://github.com/OLIMEX/ESP32-P4-DevKit/tree/main

برق و الکترونیک *دانلود پروژه رایگان

08 Jan, 10:03


https://www.waveshare.com/wiki/ESP32-P4-Nano-StartPage#Resources

برق و الکترونیک *دانلود پروژه رایگان

04 Jan, 17:12


https://github.com/GrzHeller/STM32H750B-DK_TouchGFX_FreeRTOS_MQTT_Example?tab=readme-ov-file

برق و الکترونیک *دانلود پروژه رایگان

04 Jan, 16:40


https://github.com/kotetsuy/TouchGFXDemo/tree/master

برق و الکترونیک *دانلود پروژه رایگان

01 Jan, 21:25


http://en.liontron.cn/listinfo-15-0.html

برق و الکترونیک *دانلود پروژه رایگان

28 Dec, 18:35


https://www.engicam.com/products/som

برق و الکترونیک *دانلود پروژه رایگان

27 Dec, 21:39


https://youtu.be/brZUlTTlQ74?si=KxKkvyY4HdjxVRJ_

برق و الکترونیک *دانلود پروژه رایگان

24 Dec, 03:13


🔴 قالت سیدة نساء العالمین فاطمة الزهرا سلام الله علیها: روحى لروحك الفداء، و نفسى لنفسك الوقاء يا أبا الحسن، ان كنت فى خير كنت معك، و ان كنت فى شرّ كنت معك. فبكيا جميعا صلوات اللّه عليهما.

🟠 حضرت فاطمه زهرا سلام الله علیها خطاب به امیرالمومنین سلام الله علیه فرمودند: ای اباالحسن! روحم به فدای روح تو و جانم سپر بلای تو! هماره همراه تو خواهم بود؛ چه در خیر و نیکی به سر بری و چه در سختی و بلا گرفتار شوی! پس هر دو گریستند. صلوات خداوند بر آن دو باد.

📚الكوكب الدّرّيّ ص۱۹۶
📚فاطمة الزهراء بهجة قلب المصطفى ص۷۷۱

برق و الکترونیک *دانلود پروژه رایگان

14 Dec, 15:50


https://github.com/DhamuVkl/FluidGuard

برق و الکترونیک *دانلود پروژه رایگان

14 Dec, 15:49


https://github.com/DhamuVkl/HDMI-MUX-HAT

برق و الکترونیک *دانلود پروژه رایگان

14 Dec, 15:49


https://github.com/DhamuVkl/BlackPill-MCU-Development-Board

برق و الکترونیک *دانلود پروژه رایگان

14 Dec, 15:47


https://github.com/DhamuVkl/BLE-MUX

برق و الکترونیک *دانلود پروژه رایگان

09 Dec, 10:43


https://youtu.be/S5QfAdH57sE?si=bM4HEs-Sg1xy05JN

برق و الکترونیک *دانلود پروژه رایگان

08 Dec, 02:39


https://youtu.be/7J7X7aZvMXQ?si=ry4ZLfw2IZiHZv_8

برق و الکترونیک *دانلود پروژه رایگان

07 Dec, 09:26


https://youtu.be/j_wNk6gX-lE?si=adP-oP6Dx17ob1Sp

برق و الکترونیک *دانلود پروژه رایگان

02 Dec, 21:08


https://youtu.be/08XGs7pZSlE?si=uIfnna1Cz9pz2Vr8

برق و الکترونیک *دانلود پروژه رایگان

26 Nov, 11:06


🔴 قَالَ آيَةُ اَللهِ اَلْعُظْمَى أَمِيرُاَلْمُؤْمِنِينَ عَلِيُّ بْنُ ابي طَالِبٍ صَلَوَاتُ اَللهِ عَلَيْهما : لَا يَصْلُحُ الْحُكْمُ وَ لَا الْحُدُودُ وَ لَا الْجُمُعَةُ إِلَّا بِإِمَامٍ عدل.

🟠 حضرت آیت الله العظمی امیرالمؤمنین علی بن ابی طالب صلوات الله علیهما می فرمایند : صدور حكم و اجرای حدود و اقامه نماز جمعه، جز به‌وسیله امام عادل نمی باشد.

📚بحارالأنوار ج۷۶ ص۱۰۱

برق و الکترونیک *دانلود پروژه رایگان

25 Nov, 14:59


https://github.com/JiaChangGit/Embedded-operating-systems-NCKU

برق و الکترونیک *دانلود پروژه رایگان

24 Nov, 17:32


https://www.youtube.com/watch?v=coGERYQkYag

برق و الکترونیک *دانلود پروژه رایگان

21 Nov, 20:31


https://youtu.be/2oeMzbcmmHI?si=B9mFB-snFQIWPTag

برق و الکترونیک *دانلود پروژه رایگان

18 Nov, 16:24


https://youtu.be/t7D_8QSaiNU?si=PEfgtoFAI1_vAjN0

برق و الکترونیک *دانلود پروژه رایگان

16 Nov, 20:54


https://youtu.be/QDcPQivC8cw?si=paQk-pf171YVf7eL

برق و الکترونیک *دانلود پروژه رایگان

15 Nov, 14:46


امام صادق علیه‌السلام فرمودند :

اهل شهری به نام زوراء که در آخرالزمان ساخته می شود، بوسیله خونهای ما (امامان) در خواست شفاعت دارند؛

و بوسیله بغض ما (با گریه بر ما) به ما نزدیک می شوند.

اما بوسیله دشمنی با ما، به ما اظهار دوستی می کنند و جنگ با ما را فرض می دانند و کشتن ما را واجب می شمرند.

ای فرزند بپرهیز از آنها باز هم بپرهیز از آنها

📚 بحارالأنوار ج السما و العالم
📚جهان در آینده ص ۶۸

برق و الکترونیک *دانلود پروژه رایگان

31 Oct, 07:26


https://youtu.be/F_7IPm7f1vI?si=LY9T-C2nRMqWPowS

برق و الکترونیک *دانلود پروژه رایگان

26 Oct, 18:36


https://youtu.be/m3Ny3j5nH0U?si=OSUeP3CjEBq5BwR0

برق و الکترونیک *دانلود پروژه رایگان

25 Oct, 16:09


https://youtu.be/a9uP8A94VsQ?si=SfD03a-mt1wLa6Wj

برق و الکترونیک *دانلود پروژه رایگان

16 Oct, 18:28


https://youtu.be/5R4Uh0MJs6g?si=zKULhIvP7rIkPoUf

برق و الکترونیک *دانلود پروژه رایگان

09 Oct, 18:31


https://youtube.com/shorts/o_8svApdJzg?si=yQnJXcgAmicxQrQf

برق و الکترونیک *دانلود پروژه رایگان

09 Oct, 18:29


https://youtube.com/shorts/otySKnqxqxo?si=qhdOW6xHAlBQxHOT

برق و الکترونیک *دانلود پروژه رایگان

09 Oct, 18:22


https://youtube.com/shorts/Je_e1-vAj9Y?si=PZ9S4ebBcwyRE_f-

برق و الکترونیک *دانلود پروژه رایگان

07 Oct, 17:55


https://youtu.be/S5KYlAQw2lw?si=w3pn6oAfYwPPoYkA

برق و الکترونیک *دانلود پروژه رایگان

26 Sep, 15:51


https://youtu.be/Egphr3cpnlI?si=XjqViGY6wOAQVq-6

برق و الکترونیک *دانلود پروژه رایگان

26 Sep, 01:45


https://youtu.be/7OKjYQD2xhs?si=z18I5J0YfxXL6J6V

برق و الکترونیک *دانلود پروژه رایگان

22 Sep, 20:28


https://youtube.com/shorts/lR36anDRsIc?si=S6wAwK6QgCcjUlRs

برق و الکترونیک *دانلود پروژه رایگان

14 Sep, 17:43


https://youtu.be/tQ1nMJDWj3I?si=sagXV1sutdt0b-D8

برق و الکترونیک *دانلود پروژه رایگان

14 Sep, 17:17


https://youtu.be/dCS8TIrsZgI?si=NjzXF7-4PfDCWnnV

برق و الکترونیک *دانلود پروژه رایگان

13 Sep, 21:08


Table of Allwinner based boards

برق و الکترونیک *دانلود پروژه رایگان

13 Sep, 21:08


https://linux-sunxi.org/Table_of_Allwinner_based_boards

برق و الکترونیک *دانلود پروژه رایگان

13 Sep, 11:36


https://youtu.be/1fmq1EXSBRg?si=QLj8HEFacfAuHTwr

برق و الکترونیک *دانلود پروژه رایگان

12 Sep, 16:51


کانال یوتیوب عالی برای آموزش stm32

برق و الکترونیک *دانلود پروژه رایگان

12 Sep, 16:51


https://www.youtube.com/@bluewat/videos

برق و الکترونیک *دانلود پروژه رایگان

12 Sep, 16:31


https://www.youtube.com/watch?v=KlG2doCkREM

برق و الکترونیک *دانلود پروژه رایگان

12 Sep, 16:25


https://blog.csdn.net/tianizimark/article/details/121640588

برق و الکترونیک *دانلود پروژه رایگان

12 Sep, 13:59


🏴 ولی خودشان از فرزند من بیزارند

🔴 قَالَ آيَةَ اَللهِ اَلْعُظْمَى أَمِيرُاَلْمُؤْمِنِينَ الإمامُ عَلِيُّ بْنُ ابي طَالِبٍ صَلَوَاتُ اَللهِ عَلَيْهما : یَقُومُ الْقَائِمُ (عجل الله تعالی فرجه الشریف) حَتَّی تُفْقَأَ عَیْنُ الدُّنْیَا وَ تَظْهَرَ الْحُمْرَهًُْ فِی السَّمَاءِ وَ تِلْکَ دُمُوعُ حَمَلَهًِْ الْعَرْشِ عَلَی أَهْلِ الْأَرْضِ وَ حَتَّی یَظْهَرَ فِیهِمْ قَوْمٌ لا خَلاقَ لَهُمْ یَدْعُونَ لِوَلَدِی وَ هُمْ بِرَاءٌ مِنْ وَلَدِی.

⚫️ حضرت آیت الله العظمی امیرالمؤمنین علی بن ابی طالب صلوات الله علیهما می فرمایند : قائم (عجل الله تعالی فرجه الشریف) قیام نمی‌کند تا اینکه چشم دنیا شکافته شود و سرخی در آسمان پدید آید. و آن اشک‌های حاملان عرش است که بر مردم روی زمین می‌گریند. تا وقتی که مردمی پیدا شوند که از مواهب الهی بهره‌ای نبرند! آن‌ها مردم را دعوت به پیروی از فرزند من می‌کنند ولی خودشان از فرزند من بیزارند.

📚بحارالأنوار، ج۵۲، ص۲۲۶

برق و الکترونیک *دانلود پروژه رایگان

11 Sep, 07:06


میکروکنترولرهای ۶۴ بیتی جدید شرکت st با امکانات فوق العاده

برق و الکترونیک *دانلود پروژه رایگان

11 Sep, 07:06


https://www.st.com/en/microcontrollers-microprocessors/stm32mp2-series.html?ecmp=tt38228_gl_video_mar2024

2,236

subscribers

839

photos

94

videos