طراح

زندگی یعنی پژوهش و فهمیدن چیز جدید (پروفسور حسابی)

زندگی یعنی پژوهش و فهمیدن چیز جدید (پروفسور حسابی)

طراح

شاکری لیسانس کنترل - دانشگاه خراسان
designer2100@outlook.com
اینستاگرام:
designer2013.blogsky@
تلگرام:
Abolfazl_shakeri@

طبقه بندی موضوعی


کاری کنیم که کتابخانی یک امر رایج بشود



این کتاب را بخوانید



این کتاب را بخوانید



این کتاب را بخوانید



این کتاب را بخوانید





















pixel wifi - درایور پیکسلی دارای WIFI

درایور RGB پیکسل داراری wifi و اپلیکیشن اندروید و وینفون جهت:

 1- نورپردازی تابلو چلنیوم 

2- نورپردازی نما

3- نور مخفی




پشتیبانی از آی سی های:

WS2811 - WS2812 -  WS2812B -  UCS1903 - UCS1912 - xh6897

دارای افکتهای متنوع

امکان ساخت لیست افکت

امکان تغییر نام و رمز وای فای

درایو 8۰۰ پیکسل 

اپلیکیشن اندروید




قیمت ۹۰ هزار تومان

خرید بیشتر از ۵ عدد ، ۷۳ هزار تومان


درایور پیکسل


دانلود کاتالوگ



دانلود دیتاشیت









درایور پیکسلی

نکته ای در تعریف ماکروها در زبان C

do { } while(0)

You may see a do loop with the conditional expression set to a constant value of zero (0). This creates a loop that will execute exactly one time. This is a coding idiom that allows a multi-line macro to be used anywhere that a single statement can be used.

Since the conditional expression of the do loop is a constant value, the compiler will not generate any additional code to process the loop, so this idiom does not add any overhead to the code when it is executed.

This technique is frequently used in macro definitions where the body of the macro is not a single or simple statement. Since you do not know where the macro will be used, it is important that body of the macro has a syntax that is equivalent to the statement it replaces. For example, the following macro will replace a single statement with two statements.

#define foo \

statement_1; \

statement_2

If this macro is used in an if statement like the one below, it will not have the intended effect.

if (condition)

foo;

After replacing the macro in this code, the if condition will be followed by two statements rather than one. This is probably not what you want because the if condition will only control the execution of the first statement.

if (condition)

statement_1;

statement_2;

The following example shows what the macro looks like when it is rewritten using the do loop idiom. Notice there is no ending semicolon in the definition; the semicolon will be provided by the statement that is replaced.

#define foo \

do { \

statement_1; \

statement_2; \

} while (0)

Now, when the macro is used, the if condition is followed by a single, compound statement, which will behave as you would expect.

if (condition)

do {

statement_1;

statement_2;

} while (0);

A similar problem occurs when the body of the macro contains an if statement without an else statement.

#define foo \

if (condition) \

statement

If this macro is used in another if statement that does have an else statement, the if statement in the macro body will steal the else that follows it.

if (condition)

foo;

else

bar;

Although the indentation of the else statement shows the intention that it should belong to the first if statement, it will actually be associated with the second if statement.

if (condition)

if (condition)

statement;

else

bar;

Using the do loop idiom in this instance, will terminate the if statement in the macro, so that it will not steal an else statement that happens to follow it.

if (condition)

do {

if (condition)

statement;

} while (0);

else

bar;

Using an empty do-while(0) loop is also a common way to write an empty statement in a macro definition. In older compilers, this was necessary to prevent the compiler from issuing a warning. For example:

#define do_nothing do {} while (0)

The current gcc compiler provides another method that can be used in place of the do-loop idiom as shown in the following example.

#define foo ({ \

statement_1; \

statement_2; \

})

افکت طیف نور

دانلود سخنرانی حجه الاسلام کشمیری

تبدیل رشته به عدد

برای تبدیل رشته به عدد مجموعه ای از توابع در stdlib.h (در بعضی کامپایلر ها cstdlib.h) تعریف شده که نحوه استفاده شان تقریبا یکسان است، یک پارامتر ورودی دریافت می کنند که همان رشته *char است و خروجی شان یک عدد که البته در هر کدام از این توابع نوع داده خروجی فرق می کند.

تابع ()atoi یک رشته را به عددی از نوع داده int تبدیل می کند که طبیعتا بدون اعشار خواهد بود، مثلا :

char a[] = "1234";
int i = atoi(a);

تابع ()atol یک رشته را به عددی از نوع داده long int تبدیل می کند که آن هم بدون اعشار خواهد بود، مثلا :

char a[] = "123456789";
long int i = atol(a);

تابع ()atof یک رشته را به عددی از نوع داده double تبدیل می کند که عددی اعشاری خواهد بود، مثلا :

char a[] = "1234.56";
double i = atof(a);

تابعی با نام ()strtol می تواند یک رشته را از مبنای عددی مشخصی به معادل عددی در مبنای 10 تبدیل کند،
مثلا یک رشته A3E که در مبنای 16 (هگزادسیمال) است را معادل عددی 2622 تبدیل کند.
پارامتر اول رشته مورد نظر است.
پارامتر دوم اختیاری است و می تواند انتهای رشته عددی را مشخص کند که غالبا با null یا 0 مشخص می شود.
پارامتر سوم مبنای عددی رشته است، مثلا 2 برای باینری (Binary) و 10 برای دسیمال (Decimal) و 8 برای اکتال (Octal) و ... 
خروجی این تابع یک عدد صحیح در مبنای long int است.


مثلا:

char a[] = "A3E";
long int i = strtol(a, 0, 16);

تابعی با نام ()strtod شبیه ()atof است، با این تفاوت که پارامتر اختیاری دوم می تواند انتهای رشته عددی
را مشخص کند که البته عموما با همان مقدار 0 نادیده گرفته می شود.

مثلا :

char a[] = "3.14159";
double i = strtod(a, 0);

تابعی هم با نام ()strtoul شبیه به ()strtol می باشد، فقط فرق شان در این است که strtoul اعداد را بدون علامت
مثبت و منفی (unsigned) محاسبه می کند، یعنی خروجی اش unsigned long int است.

مثلا :

char a[] = "1010011";
unsigned long int i = strtoul(a, 0, 2);

گیرنده ریموت کد لرن

برنامه ای که قرار داده میشود تست شده و به خوبی کار میکند. منبع برنامه از سایت sisoog.com میباشد. با کمی تغییرات برای مگا64 تست شده. 

تغییراتی که در برنامه باید ایجاد کنید با توجه به سخت افزار خودتان: 1- تغییر در شماره وقفه ( Any change وقفه مورد استفاده باید قابلیت تشخیص هر تغییر در پایه را داشته باشد) 2- تغییر در خواندن وضعیت پایه وقفه در کتابخانه EV17xx_Decoder.c خط 57.


از این کتابخانه برای خواندن ریموت های کد فیکس هم میتوانید استفاده کنید.


متن توضیح گرفته شده از سایت sisoog.com :


متأسفانه سورس های زیادی وجود دارند که از منابع متن‌باز (OpenSource) کپی شده‌اند و به‌صورت تجاری در فضای اینترنت به فروش می‌رسند. سورس ریموت های کدلرن نیز از این دسته است. اگر سورس های متن‌باز وجود نداشتند شاید این میزان از پیشرفت در حوزه علم و تکنولوژی حاصل نمی‌شد. پس شایسته است که به‌جای منفعت شخصی خود به منفعت جمعی بیندیشم و سورس هایی ازاین‌دست را بفروش نرسانیم و با انتشار رایگان آنها نقشی در بالا بردن سطح دانش داشته باشیم.

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است. بسترهای متفاوتی برای ارسال اطلاعات وجود دارد که از پرکاربردترین آن‌ها، امواج مادون‌قرمز است که نمونه‌اش را همگی در ریموت‌های تلویزیون و وسایل خانگی دیده‌ایم و نوع دیگر، ریموت‌های رادیویی هستند که از امواج رادیویی برای ارسال داده‌ها استفاده می‌کنند. موضوع بحث ما، مورد دوم است: ریموت‌های رادیویی. این ریموت‌ها برای این‌که بتونند اطلاعات را منتقل کنند نیاز دارند که اول اطلاعات را روی یه موج دیگر که به آن موج حامل گفته می‌شود سوار (مدولاسیون) کنند. با این کار اطلاعات قابلیت انتشار در فضا را به‌دست خواهند آورد.

مدلاسیون دو نوع آنالوگ و دیجیتال دارد که خود به انواع دیگری تقسیم‌بندی می‌شوند. در مدولاسیون، سیگنال فرکانس بالا (حامل) بر اساس سیگنال پیام تغییر داده می‌شود. سیگنال حامل خواص مختلفی ازجمله دامنه، فرکانس و فاز دارد که می‌توانند بر اساس سیگنال پیام تغییر داده شوند و ازاین‌رو انواع مختلفی از مدولاسیون پدید می‌آید. (عکس زیر)

انواع مدلاسیون

همان‌طور که در عکس فوق مشاهده می‌کنید، در مدلاسیون AM سیگنال داده بر روی دامنه‌ی موج حامل تأثیر می‌گذارد و در مدلاسیون FM سیگنال داده بر روی فشردگی سیگنال حامل (فرکانس) تأثیر می‌گذارد. این مدلایسون به‌مراتب داری برد بیشتری نسبت به مدلاسیون AM است؛ چراکه در مدلاسیون AM کاهش دامنه به معنی کاهش توان فرستنده است. نوع بعدی مدلاسیون دیجیتال (Keying) است که درواقع نوعی از مدلاسیون FM محسوب می‌شود.

در مدارات دیجیتال ما با دو منطق صفر و یک سروکار داریم که برای انتقال به فرکانس‌های F0 و F1 تبدیل می‌شوند. فرکانس F0 یعنی منطق 0 و فرکانس F1 یعنی منطق 1. در این روش کار گیرنده خیلی ساده است و باید بتواند تفاوت بین فرکانس F0 و F1 را تشخیص دهد و آشکار کند. در ریموت‌کنترل‌های رادیویی برای ارسال داده از این نوع مدلاسیون یا مدلاسیون های مشابه استفاده می‌شود.

ریموت‌های کدلرن از مدلایسون ASK برای ارسال داده استفاده می‌کنند. مدلاسیون ASK زیرشاخه‌ی ساده‌شده‌ای از مدلاسیون دیجیتال است؛ فرکانس F0 از آن حذف شده است و فقط فرکانس F1 در آن استفاده می‌شود. یعنی وقتی‌که منطق 1 باشد فرکانس F1 تولید می‌شود و وقتی‌که منطق صفر است فرستنده خاموش می‌شود و هیچ سیگنالی تولید نمی‌شود.

مدلاسیون ASK


ترفند هم باعث ساده‌سازی فرستنده و هم گیرنده می‌شود؛ چراکه در فرستنده فقط باید فرکانس حامل با فرکانس F1 تولید شود و در گیرنده هم فقط باید فرکانس F1 شناسایی شود.

انواع گیرنده ریموت

تا اینجا با نحوه‌ی ارسال اطلاعات آشنا شدیم. برای ساخت یک ریموت کنترل ابتدا لازم است که امواج ارسالی از ریموت (فرستنده) را دریافت کنیم که بعد از پردازش بتوانیم عملی مناسب با درخواست کاربر را اجرا کنیم. با توجه به نوع فرستنده نیاز داریم که یک گیرنده ASK داشته باشیم که فرکانس آن با فرکانس ریموت یکی باشد، یعنی اگر از ریموت با فرکانس 433 مگاهرتز استفاده می‌کنیم گیرنده ASK نیز باید با همان فرکانس کار کند. در غیر این صورت مدار به‌درستی کار نخواهد کرد.

مطابق عکس زیر می‌توانیم مدار گیرنده را خودمان بسازیم؛ اما با توجه به پیچیدگی‌های بحث RF این کار توصیه نمی‌شود و بهتر است که از مدارها و ماژول‌های آماده‌ی موجود در بازار استفاده کنید.


مدار گیرنده ask


معمولاً ریموت‌ها در دو فرکانس 433 و 315  مگاهرتز موجود هستند. در خرید گیرنده دقت کنید که گیرنده‌ی تهیه‌شده با فرکانس ریموت شما هم‌خوانی داشته باشد. در حال حاضر دو نوع گیرنده ASK در بازار ایران یافت می‌شود:

مدل قدیمی‌تر درواقع یک گیرنده‌ی ترانزیستوری ساده از نوع super regenerative است که دارای حساسیت و دقت کمتر و قیمت پایین‌تری است. این گیرنده نیاز به ولتاژ کاری 55 ولت دارد و خروجی داده صفر و یک دارد، ولی به دلیل ساختار و نحوه آشکارسازی، بسیار تحت تأثیر نویزهای محیطی قرار می‌گیرد. (عکس زیر)


مدل جدیدتر درواقع یک گیرنده super heterodyne است و دارای مدار پیچیده‌تری برای آشکار‌سازی داده است. این گیرنده از کریستال کوارتز استفاده می کند؛ همین امر سبب می‌شود که هم کیفیت گیرندگی و هم دقت بالاتری داشته باشد.


این گیرنده‌ها علاوه بر 5 ولت قادرند با 3.3 ولت نیز به خوبی کار کنند و خروجی داده هم دارند. درواقع چینش پایه‌های این دو نمونه گیرنده به نحوی است که به‌راحتی می‌توان آن‌ها را جایگزین هم کرد. پس اگر گیرنده‌ای دارید که از برد آن راضی نیستید می‌توانید فقط ماژول ASK را به super heterodyne تغییر دهید و شاهد برد بهتر باشید.

پروتکل ریموت کدلرن

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


کد دادن ریموت مد فیکس


دلیل نام‌گذاری کدفیکس هم این است که گیرنده‌های این نوع ریموت، کد ثابتی دارند و اگر بخواهید ریموت دیگری نیز با این گیرنده کار کند باید دقیقاً مطابق دیگر ریموت‌ها کددهی شود. که البته این موضوع به لحاظ امنیتی مساله ساز است؛ چراکه اگر کد انتخابی شما را کسی متوجه شود به‌راحتی می‌تواند یک ریموت سازگار با گیرنده شما بسازد.

اما ریموت‌های کدلرن دارای امنیت بالاتری هستند. به این معنی که توسط شرکت یک کد 20 بیتی اتفاقی در حافظه آنها نوشته شده است. هر ریموت یک کد منحصربه‌فرد دارد و دو ریموت با کد یکسان وجود ندارد: بنابر این برای همگام کردن ریموت‌ها با گیرنده، گیرنده باید قادر باشد که کد هر ریموت را در خود ذخیره کند تا در مواقع درخواست، چک کند که آیا ریموت معتبر هست یا نه. این عمل را  اصطلاحاً لرن کردن می‌گویند. یعنی شما باید ریموت موردنظر خود را در گیرنده لرن کنید و برای همین هم به آنها ریموت‌های کدلرن می‌گویند.

خوشبختانه پروتکل مورداستفاده در ریموت‌های کد لرن مشابه است و فرقی نمی‌کند که شما از آی‌سی HS1527 یا EV1527 یا خانواده‌های مشابه استفاده می‌کنید. همه از انکدر OTP استفاده می‌کنند.

OTP ENCODER


در این روش 24 بیت داده از ریموت ارسال می‌شود که بیست بیت اول همان کد منحصربه‌فرد برای هر ریموت است و 4 بیت انتهایی مربوط به وضعیت کلیدهای فشرده‌شده ریموت است. در ابتدای هر ارسال، یک وضعیت همزمانی (Preamble) ارسال می‌شود که ما با دریافت این همزمانی باید منتظر دریافت 24 بیت داده باشیم. با توجه به توضیحات ارائه‌شده، ما نیاز 3 حالت منحصربه‌فرد داریم: حالت اول برای ایجاد سیگنال همزمانی (Preamble)، حالت دوم برای ایجاد وضعیت 1 منطقی و حالت سوم برای ایجاد 0 منطقی.

  1. حالت همزمانی: در این حالت اگر میزان یک بودن سیگنال مثلاً 1 میکروثانیه باشد، میزان صفر آن باید 30 میکروثانیه باشد.
  2. حالت یک منطقی : در این حالت اگر میزان یک بودن سیگنال مثلا 3 میکروثانیه باشد میزان صفر بودن آن باید 1 میکروثانیه باشد.
  3. حالت صفر منطقی: در این حالت اگر میزان یک بودن سیگنال مثلا 1 میکروثانیه باشد میزان صفر بودن آن باید 3 میکروثانیه باشد.

توجه داشته باشید زمان‌های ذکرشده به‌عنوان مثال هستند. برای روشن‌تر شدن موضوع و درواقع میزان این زمان‌ها با توجه به نوسان‌ساز داخلی آی‌سی تعیین می‌شود ولی نسبت‌ها به‌صورت توضیح داده شده حفظ می‌شوند.


اصلاحات مربوط به کتابخانه‌ی ریموت کدلرن

با توجه به این‌که کتابخانه‌ی ریموت کدلرن در سال 2009 نوشته شده و بعدازآن هیچ تصحیحی روی آن صورت نگرفته بود، بخش‌هایی از کتابخانه برای عملکرد بهتر و اصولی‌تر شدن کد نوشته‌شده، بازنویسی شد. اصلی‌ترین قسمت بازنویسی شده مربوط به روال دکد کتابخانه است. در کتابخانه‌ی قدیمی، حداکثر و حداقل طول پالس بر اساس میکروثانیه در برنامه تعریف شده بود. این مقادیر هنگام تغییر فرکانس کاری تایمر، مشکل‌ساز می‌شدند و با تغییر این فرکانس، کد دیگر به‌درستی کار نمی‌کرد.

#define Min_Pulse_Len 200 /* In us */
#define Max_Pulse_Len 15000 /* In us*/
مقادیر فوق به‌کلی از برنامه حذف شد تا در صورت نیاز و تغییر فرکانس کاری تایمر موردنظر، خللی در اجرای برنامه و دکد به وجود نیاید. در بخش جایگزین شده، فقط از نسبت پالس‌ها برای شناسایی نوع آنها استفاده شده است. با این راهکار شما می‌توانید فرکانس کاری تایمر را با خیال آسوده تغییر دهید.
#define IS_Sync_Start_Pulse(T1,T2) (T2 > (T1*29) && T2 < (T1*32))
#define Bit_IS_Zero(T1,T2) (T2 > (T1*2)  && T2 < (T1*4))
#define Bit_IS_One(T1,T2) (T1 > (T2*2)  && T1 < (T2*4))

فرکانس 1 مگاهرتز و 2 مگاهرتز به‌عنوان فرکانس شمارش تایمر مورد تست قرار گرفت که در هیچ‌کدام مشکلی وجود نداشت و برنامه به‌درستی کار می‌کرد.

تغییر صورت گرفته‌ی بعدی، مربوط به روال ذخیره‌سازی بیت‌های دریافتی از ریموت است. در کتابخانه قدیمی از یک آرایه برای نگهداری هر بیت استفاده می‌شد که 24 بایت از حافظه Ram را اشغال می‌کرد.

uint8_t Remode_Data[24];
.
.
.
.
if(Start_Sync==1) // Start Sended
{
if(Bit_Index < 24)
{
Remode_Data[Bit_Index] = !Bit_IS_Zero(Time_Rising,Time_Falling);
Bit_Index++;
}
else
{ // All Bit Recive
Bit_Index = 0;
Start_Sync = 0;
Revice_Flag = 1;
}
} // End of Start Sync Send
.
.
در بازنویسی کتابخانه، هر بیت واقعاً یک بیت از حافظه را اشغال می‌کند و داده‌ها در یک متغییر Long ذخیره می‌شوند که تنها 4 بایت از حافظه را اشغال می‌کند. البته جدول lookup برای افزایش سرعت اضافه شده است که 128 بایت از حافظه Flash را اشغال می‌کند که با توجه به حجم 32 کیلوبایتی فلش، مقدار زیادی نیست.
volatile uint32_t    EV_Code = 0;
 
const uint32_t Bit_Shift[32] PROGMEM =
{
0x00000001,0x00000002,0x00000004,0x00000008,
0x00000010,0x00000020,0x00000040,0x00000080,
0x00000100,0x00000200,0x00000400,0x00000800,
0x00001000,0x00002000,0x00004000,0x00008000,
0x00010000,0x00020000,0x00040000,0x00080000,
0x00100000,0x00200000,0x00400000,0x00800000,
0x01000000,0x02000000,0x04000000,0x08000000,
0x10000000,0x20000000,0x40000000,0x80000000,
};
 
.
.
.
.
if(Start_Sync==1) // Start Sended
{
if(Bit_Index < 23)
{
if(Bit_IS_Zero(Time_Rising,Time_Falling))
{
Bit_Index++;
}
else if(Bit_IS_One(Time_Rising,Time_Falling))
{
Receive_Code |= pgm_read_dword(&Bit_Shift[(23-Bit_Index)]);
Bit_Index++;
}
else
{
Start_Sync = 0;
Bit_Index = 0;
}
 
}
.
و البته چند تغییر کوچک دیگر که باعث بهبود عملکرد کتابخانه شده است.

توضیح عملکرد برنامه ریموت 4 کاناله


برنامه دارای 3 حالت مختلف، جهت عملکرد است:


enum
{
Nurmal = 0,
Learn,
Erase,
};
  • حالت نرمال
  • حالت لرن
  • حالت پاک کردن

حالت نرمال:

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

در حالت نرمال، با فشردن هر یک از کلیدهای ریموت خروجی مربوطه تغییر وضعیت می‌دهد.

حالت لرن:

برای استفاده از یک یا چند ریموت خاص در کنترل خروجی‌ها، لازم است ریموت‌ها را به دستگاه معرفی کنیم. برای معرفی هر ریموت دستگاه باید در مود لرن باشد.

برای این‌که دستگاه وارد حالت لرن شود، کلید دستگاه را به مدت 1.5 ثانیه نگه‌دارید و سپس رها کنید. LED  دستگاه شروع به چشمک زدن با سرعت زیاد خواهد کرد. بعدازآن یکی از کلیدهای ریموتی که قصد داریم از آن استفاده کنیم را می‌فشاریم تا دستگاه کد آن را به خاطر بسپارد. بعد از لرن کردن، ریموت دستگاه به حالت نرمال بازخواهد گشت.

حالت پاک کردن:

برای حذف ریموت‌های ذخیره‌شده در حافظه‌ی دستگاه، باید کلید را به مدت 10 ثانیه بفشارید و سپس رها کنید. LED  به مدت 3 ثانیه روشن می‌شود و خاموش می‌شود. بعد از این کار تمام ریموت‌های ذخیره‌شده از حافظه‌ی دستگاه پاک خواهند شد.

ریموت کنترل وای فای

Wi-Fi & Remote Controler


امکانات:
دارای 11 خروجی رله ای 
یک خروجی آژیر
دو زون چشمی دزدگیر
دارای نرم افزار اندروید و وینفون
امکان افزایش خروجی ها
امکان اتصال به کنترلر پیامکی و کنترل خروجی ها توسط پیامک

تلگرام: designer2100@

نمونه کد ارسال رشته به پورت سریال با استفاده از DMA ایکسمگا

for (int i=0; i<2; i++)
        {
            DMA.CTRL = 0;
            DMA.CTRL = DMA_RESET_bm;
            while ((DMA.CTRL & DMA_RESET_bm) != 0)
            DMA.CTRL = DMA_ENABLE_bm;
            DMA.CH0.SRCADDR0 = (((uint16_t)addr[i]) >> 0) & 0XFF;
            DMA.CH0.SRCADDR1 = (((uint16_t)addr[i]) >> 8) & 0XFF;
            DMA.CH0.SRCADDR2 = 0;
            DMA.CH0.DESTADDR0 = (((uint16_t)&USARTC0.DATA)>>0 & 0XFF);
            DMA.CH0.DESTADDR1 = (((uint16_t)&USARTC0.DATA)>>8 & 0XFF);
            DMA.CH0.DESTADDR2 = 0;
            DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTRELOAD_NONE_gc | DMA_CH_DESTDIR_FIXED_gc;
            DMA.CH0.TRFCNT = 5;
            DMA.CH0.REPCNT = 0;
            DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_DRE_gc;
            DMA.CH0.CTRLA = DMA_CH_ENABLE_bm | DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_1BYTE_gc /*| DMA_CH_REPEAT_bm*/;
            while(!(DMA.INTFLAGS & DMA_CH0TRNIF_bm));
            _delay_ms(500);
        }


دانلود

جواب دادن به تماس ورودی GSM - SIM900


جواب دادن به تماس ورودی - GSM  :

ارسال دستور "ATA" به ماژول

نمایش شماره ی  تماس ورودی:

ارسال دستور "AT+CLIP=1" به ماژول

Direct connect & relief connection - آلتیوم دیزاینر

*تعیین نوع اتصال via از نوع direct connect و اتصال pad از نوع relief connect:


1- در محیط آلتیوم دیزاینر کلید d و سپس r را فشار دهید.
2- از پنجره باز شده،  قسمت design Rules گزینه polygon Connect Style سپس Polygon Connect  را انتخاب کنید.
3- در قسمت first object matches گزینه Advanced را انتخاب کنید. روبروی آن در قسمت Full Query عبارت:
"Ispad AND InNet('GND')"
را تایپ کنید.

4- در قسمت second object matches گزینه all را انتخاب کنید.
5- قسمت Connect Style را بر روی Relief Connect قرار دهید.
6- پنجره را با کلیک روی ok ببندید.
7- روی polygon مورد نظر دبل کلیک کنید و با انتخاب ok و تایید پیام پلیگان مجدد رسم میشود و via ها به صورت direct connect و pad ها به صورت Relife Connect به پلیگان متصل خواهند شد.

*برای حالت معکوس از عبارت زیر استفاده کنید:
"IsVia AND InNet('GND')"



Direct connect   &    relief connection:

A thermal relief pad is a printed circuit board (PCB) pad connected to a copper pour using a thermal connection. It looks like a normal pad with copper "spokes" connecting it to the surrounding copper.

A typical pad on a printed circuit board is only connected to a few narrow tracks. A pad directly connected to the copper pour is difficult to solder since the heat quickly leaks away from the pad into the copper pour due to high thermal conductivity of copper. A thermal connection restricts the heat flow, making the pad easier to solder. Via holes that only connect one layer to another, without having soldering wires or pins into the hole, do not normally need thermal restriction. Wire leaded components that are either carrying radio frequency currents, where the additional inductance would be problematic, or where very high current densities are expected, and the spokes of the thermal relief may act as a fuse, may require the thermal relief pattern to be customised or even omitted, in which case the parts may require additional hand soldering during assembly.


کتابخانه جدید و حرفه ای 74HC595

کتابخانه جدید و حرفه ای شیفت رجیستر 74HC595

74HC595


دانلود

کتابخانه RTC - DS3231

کتابخانه استفاده از RTC-DS3231

ds3231

کتابخانه atXmega


کتابخانه aTmega

کتابخانه ماژول SIM900 - GSM

مدتی است که کتابخانه ای برای استفاده از ماژول های GSM نوشته ام و در پروژه های مرتبط با gsm  استفاده میکنم. جهت کمک به دوستان و توسعه و بهینه سازی بیشتر توسط سایر اساتید آن را منتشر میکنم.


کتابخانه را به برنامه تان اضافه کنید و :

ماژول را روشن و کانفیگ کنید

پیامک ها را دریافت و بخوانید

پیامک بفرستید

تماس ها را رد کنید

به تماس پاسخ دهید

پیامک فارسی ارسال کنید

شارژ سیم کارت را چک کنید

از وضعیت شبکه مطلع شوید

از وضعیت سیگنال مطلع شوید

اپراتور سیم کارت را تشخیص دهید

هیچ پیامکی را از دست ندهید(صف انتظار پیام)


gsm_lib


دانلود راهنما


دانلود کتابخانه ایکسمگا


دانلود کتابخانه aTmega



در توسعه و بهینه سازی این کتابخانه شرکت کنید


حق نشرکتابخانه برای designer2013.blogsky.com محفوظ است. از کپی برداری بدون ذکر منبع خودداری کنید


برد افزایش رله RS485

نوع ارتباط : RS485

8 رله

افزایش تعداد رله ها از طریق شیفت رجیستر






دانلود فایل PCB

سلف

EM18

RFID READER

در مداری که از کارت خوان RFID استفاده شده بود (EM18 & RF01D) ؛ تغدیه با رگولاتور LM2576 اورجینال تامین میشد.

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


سلفهای بشکه ای از پرمابیلیته بالایی برخوردارند و استفاده از این سلف ها جهت فیلتر مبدل باک باعث به اشباع رفتن هسته میشه و هیچ انرژی داخل سلف ذخیره نمیشه که به خازن خروجی انتقال پیدا کنه و در واقع تحت بار کم میاره ؛ ولی هسته های تیروئیدی زرد یا آبی کم رنگ بخاطر اینکه از پودر آهن ساخته شدن به سختی به اشباع میرن و انرژی لازم برای بار خروجی را تامین میکنند.

saeidjabbarie@

کالیبراسیون اسیلاتور داخلی AVR

در صورتی که از اسیلاتور داخلی میکروهای avr استفاده میکنید. حتما رجیستر OSCCAL اسیلاتور را ابتدای شروع برنامه با مقدار صحیح بارگزاری کنید تا خطای فرکانس حداقل باشد.
برای این کار با استفاده از پروگرمر MKII و نرم افزار اتمل استودیو میتوانید مقدار صحیح کالیبراسیون اسیلاتور برای فرکانس مورد نظر را از ناحیه signature row بخوانید و در آدرسی دلخواه از اییپرام ذخیره کنید سپس ابتدای برنامه مقدار را از اییپرام داخل رجیستر کالیبراسیون اسیلاتور بارگزاری نمایید.

مانند:

OSCCAL = eeprom_read_byte(0);

درایور RGB بدون محدودیت در تعداد خروجی

دارای اپلیکیشن اندروید جهت انتخاب رنگ، انتخاب افکت، روشن و خاموش کردن

مجهز به WI-FI

کتابخانه SSD1306 برای ایکسمگا - SSD1306 LIB

SSD1306


ارتباط با میکرو I2C


دانلود

کتابخانه GPS برای میکرو Xmega

کتابخانه استفاده از ماژول GPS:

دریافت و جداسازی داده های جغرافیایی

تبدیل از درجه دسیمال به درجه, دقیقه, ثانیه

تبدیل از درجه,دقیقه,ثانیه به درجه دسیمال


دانلود

کتابخانه FDB520 راه انداز اثرانگشت R301

convert decimal degrees to degrees,minutes,seconds

convert decimal degrees to degrees,minutes,seconds

One degree (º) is equal to 60 minutes (') and equal to 3600 seconds ("):

1º = 60' = 3600"

The integer degrees (d) are equal to the integer part of the decimal degrees (dd):

d = integer(dd)

The minutes (m) are equal to the integer part of the decimal degrees (dd) minus integer degrees (d) times 60:

m = integer((dd - d) × 60)

The seconds (s) are equal to the decimal degrees (dd) minus integer degrees (d) minus minutes (m) divided by 60 times 3600:

s = (dd - d - m/60) × 3600

Example

Convert 30.263888889º angle to degrees,minutes,seconds:

d = integer(30.263888889º) = 30º

m = integer((dd - d) × 60) = 15'

s = (dd - d - m/60) × 3600 = 50"

So

30.263888889º = 30º 15' 50"

ساخت هدر برد Xmega32A4U

هدر برد XMEGA32A4U

دسترسی به تمام پایه های میکرو - دو ردیف پین هدر برای نری (زیر برد) مادگی (روی برد)
تغذیه:  8-12 ولت
یک LED متصل به پایه میکرو
ابعاد 71x43 mm
PDI PROGRAMING
ماژول ESP8266
power led





ویدئو آموزش ساخت

برنامه های نمونه برای این برد به زودی روی وبلاگ قرار میگیره.

برای سفارش برد به آی دی designer2100@ تلگرام پیام بدید

کتابخانه جدید UART ایکسمگا

کتابخانه سنسور DHT22 - AM2301

Baudrate_Calculations XMEGA - محاسبه باود ریت

فایل اکسل جهت محاسبه باودریت ایکسمگا و بدست آوردن مقادیر BSCALE و BSEL و میزان باودریت حقیقی و خطای باود ریت


دانلود

راه اندازی سنسور دما و رطوبت SHT20

کتابخانه و برنامه نمونه راه اندازی ال سی دی SSD1306

راه اندازی OLED LCD - SSD1306







ویدوئو



دانلود رایگان برنامه

نمایش اعداد بزرگ روی LCD2X16



دانلود برنامه

اتمل استودیو

سیستم جوجه کشی





                                  ویدئو


ویژگی های سیستم:

1-      استفاده از سنسور SHT20

2-      تعداد سنسور 2 عدد

3-      خروجی های سیستم:

1-           رله موتور چپ گرد

2-           رله موتور راست گرد

3-           رله فرمان هیتر

4-           رله فرمان فن (جهت کاهش رطوبت یا دما)

5-           رله فرمان رطوبت ساز

6-           رله فرمان فن تهویه هوا

7-           نشانگر انتخاب پرنده (مرغ – بلدر چین – کبک)

8-           نشانگر دوره (ستر/هچر)

9-           یک خروجی رزرو

4-      امکان تنظیم دما ؛ رطوبت و زمان گردش موتور ها به صورت تفکیک شده برای هر پرنده. (اطلاعات با قطع برق پاک نمیشوند)

5-      امکان تنظیم دما ؛ رطوبت و زمان گردش موتور ها به صورت تفکیک شده برای دوره ستر/هچر

6-      دارای مد اتومات (که با توجه به مدت دوره ستر و هچر وارد شده. زمان شروع ؛ پایان دوره ستر و پایان دوره هچر محاسبه شده و در طی این مدت میزان دما و .... با توجه به نوع پرنده و دوره آن کنترل میشود و در پایان دوره سیستم متوقف میشود)

7-      دارای مد دستی (کنترل دما و رطوبت و چرخش موتورها انجام میشود اما دوره ستر/هچر در نظر گرفته نمیشود)

8-      پخش آلارم در صورتی که بعد از گذشت مدت زمان تعیین شده میزان دما یا رطوبت از مقدار تعیین شده کمتر/بیشتر شود.

9-      امکان غیرفعال کردن آلارم.

10-  دارای نمایشگر رنگی 3.2 اینچ با وضوح مناسب

11-  دو زبانه (دارای منوی فارسی و انگلیسی)

12-  پخش آلارم در صورتی که سنسورها از سیستم قطع یا به هر دلیلی خراب شوند.(در این حالت سیستم STOP میشود)

 

امکان شخصی سازی :

امکان اضافه کردن Wi-Fi به سیستم و ساخت اپلیکیشن اندروید.

امکان اضافه کردن سیستم پیامکی.


درایور 30 کانال RGB

تعداد کانال: 5 تا 30 کانال بسته به نیاز

دارای اپلیکیشن اندروید جهت انتخاب رنگ، انتخاب افکت، روشن و خاموش کردن

مجهز به WI-FI

برد کنترل:


برد درایور:


دانلود اپلیکیشن اندروید