به نام خدا : سلام داشای گل خودم، رسیدیم به جلسه ۱۲ ام از آموزش آردوینو، این مطلب چیز ساده و مهمی هستش، قسمت انواع داده در آردوینو که چیز زیاد مهمی نیست و هموتون میدونید(البته ۲-۳ تا چیز مهم داره) و اصل مطلب تبدیل انواع داده در آردوینو هستش که تو قسمت دوم مطلب میگمش، این قسمت مهمه و باس یادش بگیرید(تو هر قسمت سعی کردم پروژهای از آردوینو هم براتون بزارم)
آموزش جامع آردوینو جلسه ۱۲ Data Types And Conversion
انواع داده در آردوینو
int : اعداد صحیح، مثال ۱و۲و۳و۰و۱-و۲۵- و…
در آردوینو uno که ۱۶ بیتی(۲ بایتی) هستش، به متغییر های از نوع int میشه مقادیر بین ۳۲,۷۶۸ تا ۳۲,۷۶۷- رو انتساب داد(۲به توان ۱۵ = ۳۲,۷۶۸)
توجه : برد آردوینو Due که ۳۲ بیتی(۴ بایت) هستش اعداد بین ۲,۱۴۷,۴۸۳,۶۴۸ تا ۲,۱۴۷,۴۸۳,۶۴۷- رو میشه انتساب داد(۲ به توان ۳۱ = ۲,۱۴۷,۴۸۳,۶۴۸)
1 |
int MyInt=1373; |
unsigned int : مثل متغییر int هستش، تنها فرقش اینا که فقط شامل اعداد بزرگتر مساوی ۰ هستش(اعداد منفی رو پشتیبانی نمیکنه)، که برا وقتایی که نیاز به عدد منفی نداریم میتونی از این نوع متغییر استفاده کنیم که حافظه کمتری هم نسبت به int مصرف میکنه.
اعداد بین ۰ تا ۳۲,۷۶۸ رو میشه به این متغییر نسبت داد(۲به توان ۱۵ = ۳۲,۷۶۸)
1 |
unsigned int MyUnsignedInt=1373; |
word : مثل متغییر unsigned int هستش فقط با تفاوت این که اعداد بین ۰ تا ۶۵,۵۳۵ رو پشتیبانی میکنه(۲ به توان ۱۶ = ۶۵,۵۳۵)
1 |
word MyWord=1373; |
long : این مثل متغییر int هستش، با این تفاوت که ۳۲ بیتی هستش(بر خلاف int که ۱۶ بیتی هستش) و اعداد ۲,۱۴۷,۴۸۳,۶۴۸ تا ۲,۱۴۷,۴۸۳,۶۴۷- رو پشتیبانی میکنه(۲ به توان ۳۱ = ۲,۱۴۷,۴۸۳,۶۴۸)
1 |
long MyLong=1373; |
unsigned long : مثل متغییر از نوع long هستش فقط این که اعداد بزرگتر مساوی ۰ رو پشتیبانی میکنه فقط(و حافظه کمتری مصرف میکنه نسبت به long، اگه با اعداد منفی کایر نداریم، این متغییر بهتره از long)
توجه : long شبیه unsigned int هم هستش که اعداد ۱۶ بیتی رو پشتیبانی میکنه و long اعداد ۳۲ بیتی رو.(تنها فرقشون همینه)
1 |
unsigned long MyUnsignedLong=1373; |
short : والا این دقیقا مثل int هستش، ۱۶ بیتی هستش و ۲ بایت از حافظه اشغال میکنه، دقیقا مثل int، حالا این دو په فرقی با هم دارن رو نمیدونم (کسی اگه میدونه به ما هم بگه
)
1 |
short MyShort=1373; |
تحقیق کنید : فرق int و short در آردوینو؟؟؟ >>>> اینو تحقیق کنید و تنیجش رو به ما بگید.
byte : یع متغییر هستش که فقط اعداد صحیح رو پشتیبانی میکنه و ۸ بیتی(۱بایتی) هستش و اعداد ۰ تا ۲۵۵ رو پشتیبانی میکنه(کمترین حافظه رو در بین متغییر های هم نوعش مصرف میکنه)
1 |
byte MyByte=13; |
float : متغییر های بالا همشون فقط اعداد صحیح رو پشتیبانی میکردن ولی float اعداد اعشاری رو هم پشتیبانی میکنه و محدوده این متغییر بین ۳٫۴۰۲۸۲۳۵E+38 تا ۳٫۴۰۲۸۲۳۵E+38- هستش(که یعنی ۳٫۴۰۲۸۲۳۵ ضرب در ۱۰ به توان ۳۸)>>>> ولی این که این عدد از کجا اومده نمیدونم و حال فکر کردن و سرچ رو هم ندارم(کسی اگه میدونه به ما هم بگه ) ، متغییر float از نوع ۳۲ بیتی(۴بایت) هستش و ۶-۷ رقم اعشار دقت داره
1 |
float MyFloat=1373.58; |
double : دقیقا مثل float هستش فقط با این تفاوت که دقتش تا ۱۵ رقم اعشار هستش.
1 |
double MyDouble=1373.58; |
boolean : متغییری که یا ۰(false) هستش یا ۱(true)، این متغییر ۱ بایت حافظه مصرف میکنه
تحقیق کنید : والا من از زمان غاجار تا الان فرق بین bool و boolean رو نفهمیدم، برید تحقیق کنید و فهمیدید بیاید و به ما هم بگید.
char : این متغییر ۱ بایت حافظه مصرف میکنه، و اعداد -۱۲۸ تا ۱۲۷ رو میگیره؛ میشه گفت یه تک کاراکتر ذخیره میکنه؛ هر چی بهش بدی به صورت کد اسکی ذخیره میکنه.
جدول کدهای اسکی
بهتره پروژه زیر رو رو بردتون پروگرام کنید و تو پورت سریال چیزی که دریافت میکنید رو ببینید؛ این طوری فک کنم بهتر با تابع آشنا میشید :
۱) چیزی که به جای MyChar1 نشون میده یه کاراکتر هستش که کد اسکیش ۳۵ هستش(و باس از لینک بالا ببینید که این کد اسکی برا چه کاراکتری هستش)
۲) چیزی که با جای MyChar2 نشون میده همون عدد ۹ هستش؛ در واقع وقتی ما عدد ۹ رو میزاریم داخل ‘ ‘ یعنی کد اسکی عدد ۹ میره داخل MyChar2 و به همین دلیل هنگام نمایش MyChar2 عدد ۹ رو نشون میده.
۳) و در نهایت چیزی که به جای MyChar3 نشون میده کاراکتر A هستش، دلیلش هم مثل دلیل بالا
به نظرم بهتره به جای این که فقط این چرندیات من رو بخونید، خودتون چن تا مثال بزنید و نحوه کار تابع رو ببینید، پروژه زیر رو هم تست کنید.
1 2 3 4 5 6 7 8 9 10 11 |
void setup() { Serial.begin(9600); char MyChar1=35; char MyChar2='9'; char MyChar3='A'; Serial.println(MyChar1); Serial.println(MyChar2); Serial.println(MyChar3); } void loop() {} |
unsigned char : اینم مثل char هستش فقط اعداد ۰ تا ۲۵۵ رو پشتیبانی میکنه.
تحقیق کنید : والا من نمیدونم فرق بین unsigned char و char تو چیه و این که کجا باس از کدوم استفاده کرد؛ چون تاجایی که میدونم نام گزاری کاراکتر ها، همون کد اسکی مد نظرمه، از ۰ شروع میشه تا ۲۵۵، کاراکتری ندیدم که کد اسکی منفی داشته باشه، اگه فهمیدید به ما هم بگید(ثواب داره جان داش )
String : خوب این نوع از متغییر تقریبا مثل char هستش، فقط با این تفاوت که متغییر های char فقط یه کاراکتر میتونن تو خودشون ذخیره کنن اما متغییر های String میتونن یه سری کاراکتر(یه رشته) رو تو خودشون ذخیره کنن.
مورد اول که معلومه، اما مورد دوم (char *myString) که میبینید یه * داره، که دقیقا مثل String هستش، حالا این که فرقشون چیه، دقیقا خاطرم نیست، اینو چند وقت پیش تو کتاب c خوندم،(فقط میدونم که برا پیام نور هستش) ، تو اون توضیح داده بود، منم الان یادم نیست، اگه شما فهمیدید فرق دو مورد زیر رو به من هم بگید.
1 2 3 4 5 6 7 8 9 |
void setup() { String myString = "This is my string"; char *myString = "This is my string"; char Str6[ ] = "arduino"; char Str7[8] = "arduino"; // Str5[7] = '\0' ---> خونه ی آخر آرایه همیشه برابر این مقدار هستش char Str8[15] = "arduino"; } void loop(){} |
والا الان دلم میخواد سریع ماست مالی کنم مطب رو بره، خیلی مونده تا تموم بشه، اینایی که من دارم میگم همش اموزش c هستش، آموزش c هم که الی ماشاالله تو نت پره….وای خدا………
Array : خب اینم یه نوع دیگه از متغییر ها، این متغییر موتونه چندین متغییر رو درون خودش نگه داره، هر کدوم از متغییر های int-float-double و… فقط یه مقدار میتونستن بگیرن ولی آرایه میتونه شونصد تا مقدار تو خودش ذخیره کنه.
- ۱) آرایه از نوع int :
همون طور که در زیر میبینید ما ۴ آرایه از نوع int تعریف کردیم، که همون طور که میبینید مثل توم متغییر های دیگه، آرایه رو هم میشه همون زمان تعریف مقدار دهی کرد و هم میشه بعدا، که در اینجا آرایه myInt1 بعدا مقدار دهی شده و بقیا آرایه ها هنگام تعریف مقدار دهی شده اند.
اون عدد داخل براکت [ ] هم اندازه آرایه رو تعیین میکنه که میتونید قرارش بدید یا قرارش ندید، ولی اگه مقدار آرایه رو تعیین کردی و تو این براکت عدد گزاشتی، حتما باید تعداد مقادیری که به اون آرایه میدی کوچکتر مساوی اندازه آرایمون باشه،
مثلا برا آرایه myInt2 ما اندازه آرایه رو تعیین نکردیم، لذا هر چند مقدار که بخوایم میتونیم به این آرایه بدیم و اطلاعات رو توش ذخیره کنیم.
ولی برا آرایه myInt3 ، اندازه آرایه رو هم تعیین کردیم و به همون اندازه مقادیر به آرایه دادیم، یعنی اندازه آرایه ۵ است، ما هم ۵ تا مقدار به آرایه دادیم، لذا دیگه نمیتونیم مقادیر دیگه ای به این آرایه بدیم.
آرایه myInt4 هم اندازش رو ۱۰ تعیین کردیم و ۵ خونه اول این آرایه رو مقدار دهی کردیم، و میتونیم در آینده ۵ خونه بعدی رو هم مقدار دهی کنیم یا نکنیم.
1 2 3 4 5 6 7 8 9 |
int myInt1[6]; int myInt2[] = {2, 4, 8, 3, 6}; int myInt3[5] = {2, 4, 8, 3, 6}; int myInt4[10] = {2, 4, 8, 3, 6}; myInt1[0] = 2; myInt1[1] = 4; myInt1[2] = 8; myInt1[3] = 3; myInt1[4] = 6; |
توجه مهم : در آرایه شمارش از ۰ شروع میشود، مثلا برا دسترسی به اولین خونه آرایه myInt1 باید از دستور [۰]myInt1 استفاده کنیم و برا دسترسی به خونه آخر آرایه فوق باید از دستور [myInt1[4 استفاده کنیم، و این در حالی هستش که ما داخل براکت [ ] اومدیم و عدد ۵ رو نوشتیم، این عدد بیانگر تعداد اعضای آرایه هستش و شمارش خونه های آرایه از ۰ تا ۴ هستش(در مورد آرایه myInt1 دارم صحیبت میکنم) و این ۰ تا ۴ میشه ۵ تا مقدار، فقط شمارش به جای شروع از ۱، از صفر شروع میشه..وسلااااااااااااااااااااااامممممممممممممممم.
- ۲) آرایه از نوع float : این مورد هم مثل آرایه های از نوع int هستش، فقط با این تفاوت که به جای int ما float قرار میدیم و اعدادی که تو آرایه ذخیره میشه، اعدادی اعشاری هستن.
- ۳) آرایه از نوع char : اینم مثل دو مورد بالا هستش.
- ۴) آرایه از نوع String در آردوینو : در زیر یه مثال از این مورد میبینید.
1 |
String Str[6] = {"ali", "reza", "DMF313.IR", "mahdi", "mehdi", "mahde"}; |
- ۵) برا بقیه موارد انواع داده هم به همین صورت هستش.
در زیر کد های مورد ۲ و ۳ رو قرار میدم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
float myFloat1[6]; float myFloat2[] = {2.1, 4.2, 8.3, 3.4, 6.5}; float myFloat3[6] = {2.1, 4.2, 8.3, 3.4, 6.5}; ///////////////////////////////////////////////////////// char Str1[7]; Str1[0]='a'; Str1[1]='r'; Str1[2]='d'; Str1[3]='u'; Str1[4]='i'; Str1[5]='n'; Str1[6]='o'; char Str2[7] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; char Str3[15] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; |
انتصاب انواع داده به یکدیگر در آردوینو
خوب تو این قسمت میخوایم به این موضوع بپردازم که اگه مثلا یه عدد از نوع int رو به یه عدد از نوع float انتصاب بدیم یا برعش یا انواع داده دیگه به همدیگه انتصاب بدیم چه اتفاقی میوفته(راستی انتساب درسته یا انتصاب؟ :-D)
البته این موضوع رو شما باس درک کنید و بفهمید وگرنه چیز حفظی ایی نیستش، درکش کنید
توجه ۱ : خودتون هم میتونید کد های زیر رو تو بردتون پروگرام کنید و تغیر بدید، ور برید و … تا ت اون قسمت مربوطه مطلب براتون جا بیوفت کامل.
توجه ۲ : با توجه به گستردگی این مطلب ، اگه چیزی جا افتاد لطفا بگید تا به این مطلب اضافه کنم.
توجه ۳ : این مطلب، مخصوصا این قسمت، خیلی مهمه، خوب و دقیق بخونید.
توجه ۴ : این مطلب شاید یکم گیج کننده باشه براتون، اگه متوجه نشدید، تو گول بسرچید و مطالب و فیلم در این مزنیه زیاد هستش و چند تا پروژه خودتون تست کنید و انواع حالات و تفاوت ها رو ببینید تا کامل متوجه بشید، اگه هم خواستین ما درخدمتیم، ولی اگه خودتون با کد ها ور برید و نتیجه رو ببینید خیلی بهتره تا…
۱) int to int
تو کد زیر وقتی a1 رو تقسیم بر ۲ میکنی مقدارش میشه ۲ و این ۲ درون a2 قرار میگیره، که درست هستش و مشکلی نداره.
اما وقتی b1 بر دو تقسیم میشه مقدار حاصل از این تقسیم میشه ۲٫۵، ولی یه مشکل، عدد اعشاری رو که نمیشه تو یه عدد از نوع int ریخت، اتفاقی که اینجا میوفته اینه که این عدد ۲٫۵ رند میشه و به عدد ۲ تبدیل میشه و این عدد ۲ در b2 قرار میگیره.
حالا اگه مقادیر ۲٫۱ ، ۲٫۵ و ۲٫۹ رو به اعداد صحیح b3 ، a3 و c3 انتصاب بدیم، فقط قسمت صحیح این اعداد(۲) به این ۳ متغییر انتصاب داده میشود.
نکته : تو آردوینو هنگام انتصاب عدد اعشاری به یه عدد صحیح عدد به سمت پایین گرد میشود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { Serial.begin(9600); ////////////////////////////////// int to int int a1 = 4, b1 = 5; int a2, b2; int a3 = 2.1, b3 = 2.5, c3 = 2.9; a2 = a1 / 2; b2 = b1 / 2; Serial.println(a2); Serial.println(b2); Serial.println(a3); Serial.println(b3); Serial.println(c3); } void loop() {} |
۲) float to int
خوب تو این قسمت ما اعداد اعشاری تو متغییر هایی از نوع float ذخیره کردیم، حالا میخوایم این عدد از نوع float رو انتصاب بدیم به یه عدد از نوع int ، بازم مشکل دارم، و اونم اینه که فقط قسمت صیحیح این عدد اعشاری(از نوع float) به متغییرمون(که از نوع Int هستش) انتصاب داده میشه، تو کد زیر هر سه متغییر a2,b2,c2 برابر ۴ میشن.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void setup() { Serial.begin(9600); ///////////////////////////////// float to int float a1 = 4, b1 = 4.4, c1 = 4.46; int a2, b2, c2; a2 = a1; b2 = b1; c2 = c1; Serial.println(a2); // a2 = 4 Serial.println(b2); // b2 = 4 Serial.println(c2); // c2 = 4 } void loop() {} |
۳) int to float
تو این مورد مشکلات بالا پیش نمیاد، چون این عدد از نوع int رو هر بلایی سرش بیاری آخر سر یا عدد صحیح میشه یا اعشاری که اگه انتصابتش بدی به float مشکلی ایجاد نمیشه.
ولی مشکلی که ممکنه پیش بیاد اینه که اگه یه عدد صحیح بر عدد صحیح دیگه ای تقسیم بشه حاصل هم یه عدد صحیح خواهد بود، برا حل مشکل باس یکی از این دو عدد (مقسوم یا مقسوم علیه) رو تبدیل به اعشاری کنیم :
تو کد زیر مقدار a2 برابر ۰ میشه، چون حاصل تقسیم دو عدد صحیح میشه صحیح و چون ۳ و a1 هر دو صحیح هستند لذا جاصل تقسیمشون عدد صحیح خواهد بود، و لذا مقدار ۰ در a2 ذخیره میشه و نه مقدار ۰٫۳۳
تو تقسیم b1 بر ۳ میبینید که ما اومدیم عدد ۳ رو به صورت ۳٫۰ نوشتیم یعنی تبدیل به عدد اعشاریش کردیم، حالا حاصل تقسیم b1 بر ۳٫۰ عدد اعشاری میشه، و لذا عدد اعشاری ۰٫۳۳ که حاصل این تقسیم هستش درون b2 قرار میگیره.
تو تقسیم c1 بر ۳ هم اومدیم کنار c1 نوشتیم (float) که یعنی عدد c1 رو float در نظر بگیر، و لذا مقدار ۰٫۳۳ درون c2 قرار میگیره.
نکته : هنگام تقسیم دو عدد صحیح بر هم و انتساب به یک عدد اعشاری باید حداقل یکی از دو عدد صحیح رو به عدد اعشاری تبدیل کرد(که در زیر کدش رو میبینید و در بالا هم توضیحش رو.)؛ حداقل باید یکی اعشاری بشه، حالا اگه هر دو رو هم اعشاری کردین فرقی نداره ولی یکی کافیه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void setup() { Serial.begin(9600); ///////////////////////////////// int to float int a1 = 1 , b1 = 1, c1 = 1; float a2, b2, c2; a2 = a1 / 3; b2 = b1 / 3.0; c2 = (float)c1 / 3; Serial.println(a2); // 0 Serial.println(b2); // 0.33 Serial.println(c2); // 0.33 } void loop() {} |
توجه مهم : ممکنه شما بخواین ۲ عدد (که یکیش حتما اعشاری هستش) رو بر هم تقسیم کنید و نتیجه حاصله هم صحیح باشه باید به صورت زیر عمل کنید :
همون طور که میبینید اومدیم و عدد اعشاری a2 رو بر یه عدد صحیح تقیسیم کردیم لذا جواب هم صحیح خواهد بود که همون طور میبینید جواب برابر ۱٫۱۷ میشد، یعنی a1 برابر ۱٫۱۷ میشه.
حالا تو خط بعد اومدیم و عدد اعشاری b2 رو بر عدد صحیحی تقیسیم کردیم ولی یه کار دیگه هم کردیم و اونم اینه که اومدیم و عدد b2 که اعشاری هستش رو با نوشتن دستور (int) در کنارش به عدد صحیح تبدیل کردیم، لذا این جا در واقع عدد ۳ بر ۳ تقسیم میشه و جواب ۱ میشه، یعنی b1 برابر ۱ میشه.
1 2 3 4 5 6 7 8 9 10 11 |
void setup() { Serial.begin(9600); ///////////////////////////////// int to float float a1, a2 = 3.5, b1, b2 = 3.5; a1 = a2/3; b1 = (int)b2/3; Serial.println(a1); // 1.17 Serial.println(b1); // 1 } void loop() {} |
خوب میبینم که خستگیتون در رفت، این پرسپولیس کیسه هم که به سایپا باخت
۴) float to int
خوب تو این حالت هر چی عدد اعشاری به یه عدد Int انتصاب بدید فقط قسمت صحیح عدد تو متغییر از نوع int ذخیره میشه.(تو این که مشکلی نیست)
حالا اگه یه عدد اعشاری رو بخوایم بر یه عدد دیگه تقسیم کنیم(صحیح یا اعشاری) و نتیجه تقسیم رو به یه عد صحیح انتساب بدیم فرقی نداره که از (int) استفاده کنیم یا نه، چون اگه از (int) استفاده کنیم و عدد اعشاری رو به عدد صحیح تبدیل کنیم و بعد تقسیم کنیم حاصل هر چی باشه تبدیل به عدد صحیح شده و در متغییر صحیح ما قرار میگیره و اگه هم از (int) استفاده نکنیم عدد اعشاری ما بر اون یکی عدد تقسیم شده و حاصل تبدیل به عدد صحیح میشه و درون متغییر صحیح ما قرار میگیره(فک کنم یکم پیچیده شد )، پروژه زیر رو ببینید متوجه میشید :
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { Serial.begin(9600); ///////////////////////////////// float to int int a1,b1; float a2 = 4.7, b2 = 4.7; a1 = a2/3; b1 = (int)b2/3; Serial.println(a1); // 1 Serial.println(b1); // 1 } void loop() {} |
۵ و ۶) int to double و double to int
این دو مورد هم مصل مورد ۳و ۴ هستن، که برا تبدیل اعداد به double میتونید از دستور (double) استفاده کنیم.
۷ و ۸ ) float to double و double to float
تو این ۲ مورد تنها زمانی مشکل میتونه ایجاد بشه که بخواین یه عدد از نوع double (که تعداد ارقام اعشارش از ۷ رقم بیشتر هستش) رو به یه عدد از نوع float انتصاب بدید، تو این حالت چون حداکثر اعشاری که یه عدد از نوع float میتونه گه داره ۷ رقم هستش،بقیه ارقام اعشار از بین میره، مثلا اگه عدد ۱٫۶۶۶۶۶۶۶۶۶۶۶۶۶۶۶۶ رو به یه عدد از نوع float انتصاب بدیم فقط ۷ رقم اعشار این عدد تو متغییر float ما دخیره میشه.
۹) …
خوب فعلا برا نپیچوندن مطلب همین ۸ تا کافیه، چون شونصد تا متغییر داریم که بخوام انتصاب همشون به همدیگه رو بگم کلی طول میکشه خودتون برید اون حالت ها رو بررسی کنید و اگه موردی رو مد نظرتون بود بگید تا توضیحاتش رو اینجا اضافه کنم.
توجه : ممکنه خودم هم این وسط قاطی کنم، اگه چیزی رو جا انداختم یا اشتب گفتم، اگه جایی رو کم توضیح دادم یا بد گفتم لطفا بهم بگید.
خوب این مطلب هم با تموم کم و کاستیش توم شد رفت، نمیدونم چرا جدیدا مطابی که مینویسم خیلی طولانی میشه…..ابته اون داستان اول مطلب رو هم حذف کنیم، بازم مطلب خیلی طولانیه و تعداد نظرات خیلی کم
خداییش نتیجه گیری رو حال کردی
داشای گلم فعلا با اجازتون ما بریم.
مهمان
سلام. میخوام یه آرایه با سایز متغییر داشته باشم که براساس ورودی کاربر تغییر میکنه ؟
مهمان
اقا اینطور که من فهمیدم سایز short و short int یکی هست و فرقی در کل با هم ندارن ولی سایز int بر عکس اون دوتا که 2 بایت هستن ،4 بایته
اینو با تابع sizeofهم تو c میشه فهمید
مهمان
با سلام و تشکر بابت مطالب خوبت لطفا رنج اعداد صحیح در UNO ر اصلاح کن: {بین ۳۲,۷۶۸ تا ۳۲,۷۶۷-}
درستش :بین ۳۲,۷۶۷ تا ۳۲,۷۶۸- هست
منبع: https://www.arduino.cc/reference/en/language/variables/data-types/int/
مهمان
با سلام لطفا در مورد nod 32 هم هر چی میدونی برای همه دوستان بزار هم پروزه هم کد نویسی هم راه اندازی بلوتوت با چند مثال ممنون
نویسنده این مطلب
سلام / nod 32 چیه دیگه؟
مهمان
منظورش همون nodemcu هست
مهمان
آنتی ویروسه 😉
مهمان
سلام مهندس جان
ممنون از مطالب مفیدت
مهندس من یه مداری ساختم که رله ها رو کنترل میکنه
دستوراتش رو از وای فای میگیره از طریق esp8266
از طریق آپ wifi controler براش میتونم دستور بفرسته
یه آی سی دی اس 1307 هم گذاشتم
حالا تاریخ و زمان رو از آی سی میخونم
اما نمیتونم بفرسام به موبایل
مهمان
سلام یکی منو ریست کنه از بس که مطلب کامل و جامع بود ماشاءالله،هنگگگگگگگ کردم

مهمان
سلام بر دوستان عزیز مخصوصا جناب دمیرچیلو.نحوه تبدیل char به string رو توضیح میدید؟من یک مقداری رو از یک تابعی که خروجیش از نوع char هست میگیرم ومیخوام همونو به ورودی یک تابع دیگه که ورودیش از نوع string هست بدم.باید چیکار کنم؟
مهمان
من خیلی گشتم چیزی پیدا نکردم…وقتی پتانسیومترو میچرخونم همش تا 2 رقم اعشارو میده..گفتم شاید شما اطلاعی داشته باشید
مهمان
سلام مهندس…ایا میشه مقدار انالوگ رو تو پنجره نمایش خود اردینووتا یک رقم اعشار نمایش داد.فقط یک رقم؟؟
نویسنده این مطلب
سلام – چرا نشه! – تابع print رو بررسی کن.
مهمان
کلا میخام خروجیم حساسیتش تا 1رقم اعشار باشه
مهمان
با سلام
مهندس خسته نباشی
خواستم بپرسم میشه داخل Array متغير گذاشت بعد مقدارشو تغییر داد(آردینو) ؟
مثلا M1
اول مقدارش 100 باشه
بعدا بکنیم 200؟
{int sPWMArray[] = {500,500,500,750,1250,M1,1250,750,500,500,500
ممنون
نویسنده این مطلب
سلام – دقیقا نفهمیدم منظورتو ولی مقدار یه متغییر رو میتونی به یه خونه از آرایه بدی.
مهمان
سلام مهندس
این بار دومه که این پیام رو میفرستم
من یه برنامه نوشتم که کامپیوتر تعدادی صدد صحیح از -200 تا 200 رو از طریف پورت usb serial برای ایرسونو ارسال میکنه و اردیونو یک استپر موتور رو به تعداد عدد دریافتی حرکت میده
اول من این اعداد رو به صورت رشته ارسال میکردم و در اردیونو این رشته هارو به عدد تبدیل میکردم ولی اینجوری دوتا مشکل داشت
1- به دلیل سرعت پایین اردینو این تبدیل تقریبا 2 ثانیه طول میکشید که باعث به وجود اوردن وقفه در حرکت موتور میشد ولی من نمیخاستم وقفه داشته باشه و به محض چرخیدن به میزان اولین عدد بدون وقفه به اندازه دومین عدد دریافتی بچرخه که این کار امکان نداشت
2- اگر چند عدد پشت سر هم ارسال میکردم یا موتور نمیچرخید یا به اندازه بی نهایت میچرخید که اینم مشکل داره چون احتمال داره این اعداد تعداد خیلی خیلی زیادی باشن که موتور به اندازه تمام اون ها باید بچرخه
من توی اینترنت چست و جو گردم و فهمیدم برای حل مشکلم باید این اعداد رو بصورت باینری ارسال کنم
خوب توی کامپیوتر مشکلی برای تبدیل و ارسال اعداد بصورت باینری ندارم ولی توی اردیونو نمیتونم این اعداد رو بازگردانی کنم میخاستم ببینم میشه کمکم کنین
نویسنده این مطلب
من بیسیبم دیتا ارسال مکینم هر 200 میلی ثانیه دیتا ارسال میشه اونم دیتام حدود 30 بایت طول داره – تازه حدود 20 بایت هم دریافت میکنم.
حتما یه جای پروژه یا کدتون مشکل داره – که هر 2 ثانیه یکبار دیتا رو میخونید – از تابع Dealy استفاده کردی ؟ – وگرنه باید با سرعتی بالا دیتا دریافت کنید – نمیدونم شاید هم مشکل از طرف برنامه تحت pc هستش که نوشتید.
مهمان
#include
const int steps = 200;
Stepper myStepper(steps, 8, 9, 10, 11);
void setup() {
myStepper.setSpeed(10);
Serial.begin(250000);
}
void loop() {
if (Serial.available() > 0) {
int thisChar = Serial.readString().toInt();
myStepper.step(thisChar);
}
}
این کدم توی اردیونو هستش
مهمان
سلام مهندس جان
خسته نباشی
من از طریق کانپیوتر میخام چند تا عدد صحیح از -200 تا 200 رو برای اردیونو ارسال کنم که این اعداد تعداد گردش یک استپر موتور رو مخص میکنه
برنامه ای که نوشتم از سمت کامپیوتور با c# هستش و برای اردیونو که همون c
همه درسته و مشکلی که هست اینه که وقتی دو تا عدد ارسال میشه موتور به اندازه میچرخه و یک وقفه تقریبا دو ثانیه ای داره و به میزان عدد دوم میگرده که من میخام بدونه کوچک ترین وقفه باشه و مشکل بعدی اینهکه اگر بیشتر از 5 تا عدد داده بشه اردیونو یا موتور رو نمیچرخونه یا بی نهایت میچرخونه
من توی اینترنت گشتم یکی دیگه مشکل من رو داشت که برای ارسال از طریق کامپیوتر ع
اعداد رو به بایت تبدیل میکرد منم این کار رو کردم ولی کد اردیونو رو نتونستم بنویسم میخاستم ببینم میتونید کمکم کنید
مهمان
تبدیل رشته به عدد چطوری هست ؟
نویسنده این مطلب
سرچ کنی سریعتر به جواب میرسی :
convert string to int in c++
مهمان
سلام خسته نباشی چطور تعدادی از کاراکتر های یه آرایه رو بریزم تو یه آرایه دیگه ؟
نویسنده این مطلب
سلام-خب فرض کنید دو آرایه a و b داریم – میخوام مقادیریه خونه آرایه a رو به B نسبت بدم که فرم کلیش به صورت زیر هستش مثلا اومدم مقدار خونه 1 آرایه a رو به خونه 0 ام آرایه b دادم :
b[0] = a[1];
نویسنده این مطلب
در پاسخ بکی از دوستان که پیامی برام فرستاده بود مبنی بر این که متغیر بولین 1 بیت حافظه مصرف میکنه و نه 1 بایت
A boolean holds one of two values, true or false. (Each boolean variable occupies one byte of memory.)
https://www.arduino.cc/en/Reference/BooleanVariables
مهمان
سلام مهندس خیلی گلی
بیزحمت توابع string رو توضیح میدین
نویسنده این مطلب
سلام
https://dmf313.ir/آموزش-جامع-آردوینو-جلسه-۱۹-string-در-arduino/
مهمان
سلام مهندس .
سوال فنی . داخل متلب یه تابع هست به نام str2num که استرینگ رو به عدد تبدیل می کنه یعنی در واقع اعداد داخل رشته رو استخراج می کنه و حروف و غیره رو حذف می کنه . داخل اردوینو واسه همچین کاری راهی هست که بشه اعداد داخل رشته رو استخراج کنیم؟
ممنون میشم راهنمایی بفرمایید .
نویسنده این مطلب
سلام-اینو بخون
https://dmf313.ir/آموزش-جامع-آردوینو-جلسه-۱۹-string-در-arduino/
مهمان
سلام.
char هشت بیت هست
حالا اگر unsigned یا بدون علامت باشه هر ۸بیت مثبته پس از ۰-۲۵۵ مقدار میگیره (چون ۸ بیت یعنی ۸ تا صفر و ۱ پس ماکزیممش میشه ۱۱۱۱۱۱۱۱ که توی مبنا ۱۰ میشه ۲۵۵ )
اگر هم علامت دار باشه یک بیت برای گذاشتن علامت مصرف میشه و ۷ بیت میمونه با ۷ بیت هم نهایتا میشه ۱۲۸ تا عدد رو ذخیره کرد و بیت آخر هم نشون دهنده علامته یعنی میشه از -۱۲۸ تا ۱۲۷
مهمان
سلام مهندس جان براتون فرستادم چکار میخوام انجام بدم دستتون رسیده؟ چون با کامپیوتر فرستادم ، دو بار اما اینجا نمیبینمش
نویسنده این مطلب
سلام-چیو فرستادی؟
مهمان
سلام ، کاری که می خوام انجام بدم چون رشته هاش خیلی بزرگه نتونستم رو گوشی بیارم بفرستم ،حال عیب نداره ما ول کنت نیستیم برا شروع مهندس جان یه رشته ۶۰ تایی از کد هگز مثل این:
(۷E 00 64 45…7E)
چطور میشه تو یه ارایه گذاشت
نویسنده این مطلب
خب مطلب ارتباط سریال تو آردوینو رو تو سایت گزاشتم – ۲-۴ تا جلسه هستش فک کنم – توابعش رو هم توضیح دادم.
مهمان
عرض سلام ، ممنون از مطالب عالیتون، بنده می خوام یه رشته کد هگز رو برای اردینو تعریف کنم بعد اونو با دیتای سریال مقایسه کنم ،چطور میتونم این رشته رو که هم شامل عدد و هم کارکتر هست تعریف کنم ممنون
نویسنده این مطلب
سلام
دقیقا میخوای چیکار کنی بگو تا اون تیکه کدش رو بنویسم برات.
مهمان
مهمان
۳ ستاره ……

بنظرم همه باید به همت و تلاش شما قبطه بخورن تا پیروز بشن///
با تشکر …. ایشالا قسمت ۲۰ اموزش آردینو رو بزارید ما هم فیض ببریم//
با تشکر.
مهمان
مهندس من یه برنامه نوشتم، تحلیل کامپایلر آردوینو این شد:
Sketch uses 8,386 bytes (25%) of program storage space. Maximum is 32,256 bytes.
Global variables use 392 bytes (19%) of dynamic memory, leaving 1,656 bytes for local variables. Maximum is 2,048 bytes.
بعد اومدم ۵ تا متغیر float بهش اضافه کردم و مقدار دادم. تحلیلش باز هم همین شد. یعنی انگار هیچ حجمی رو اشغال نکردن !!
چطور ممکنه ؟؟؟
نویسنده این مطلب
برنامت رو بفرست ببرسی کنم.
مهمان
مشکل حل شد، مشخص شد که حافظه ای که نشون میده حافظه فلش هست، ولی متغیرها در حافظه SRAM ریخته میشن، ممنونم
مهمان
char x = 0;
unsigned char y = 0;
void setup()
{
Serial.begin(9600);
for (int i=0; i <= 255; i++)
{
Serial.print(i);Serial.print("t");Serial.println(x);
x++;
}
for (int i=0; i <= 255; i++)
{
Serial.print(i);Serial.print("t");Serial.println(y);
y++;
}
}
void loop() {
}
فرق
char
با
unsigned char
مهمان
فرقی نداره…
مهمان
سلام مهندس ، خسته نباشید
یه اشتباه کوچیک اینه که int یه متغیر ۱۶ بیته و یک بیت سمت چپ مشخص میکنه که مثبته یا منفی اگه اشتباه نکنم ۱ منفی و ۰ مثبت و ۱۵ بیت دیگه مقدار اون رو تعیین میکنه در مورد unsigned int چون دیگه منفی نیست کل ۱۶ بیت میشه داده و از ۰ تا ۶۵,۵۳۵ (۱۶ به توان ۲ منهی ۱) را پوشش میده
همینطور long میشه -۲,۱۴۷,۴۸۳,۶۴۸- تا ۲,۱۴۷,۴۸۳,۶۴۷٫
و unsigned long از ۰ تا ۴,۲۹۴,۹۶۷,۲۹۵ (۳۲ به توان ۲ منهی ۱)
در مورد short سایت آردوینو تو ضیح میده که در همه مدل های آردینو ۱۶ بیته منفی و مثبت هم داره
و تفاوت با int اینه که int در uno , … ب ۱۶ بیته و در سری های arm , … ب ۳۲ بیت …
امیدوارم اشتباه نکرده باشم و تونسته باشم کمک کنم
پ ن : قبلن هم مطلبی در یه پست دیگه گذاشتم و البته منتشر نشد!!!
مهمان
Mohandes Awliiii to yedoune bashi
مهمان
سلام
مهندس دستتون درد نکنه هم بابت مطالب مفید هم بابت تایپ این همه مطلب.خیلی ممنون
مهمان
مثل همیشه عالی
مهمان
سلام.عالی بود.خیلی خیلی ممنون
مهمان
خدا قوت……
مهمان
سلام خسته نباشید، خدا قوت.
این کد زیر رو برای تبدیل float to int اجرا کردم، یکی قبل از انجام محاسبات، اعداد را به صحیح
تبدیل میکند ، دومی اول محاسبه رو انجام میده بعدش حاصل رو به صحیح تبدیل میکنه.
نوشته بودین:
/*”حالا اگه یه عدد اعشاری رو بخوایم بر یه عدد دیگه تقسیم کنیم(صحیح یا اعشاری) و نتیجه تقسیم رو به یه عد صحیح انتساب بدیم فرقی نداره که از (int) استفاده کنیم یا نه، چون اگه از (int) استفاده کنیم و عدد اعشاری رو به عدد صحیح تبدیل کنیم و بعد تقسیم کنیم حاصل هر چی باشه تبدیل به عدد صحیح شده و در متغییر صحیح ما قرار میگیره و اگه هم از (int) استفاده نکنیم عدد اعشاری ما بر اون یکی عدد تقسیم شده و حاصل تبدیل به عدد صحیح میشه و درون متغییر صحیح ما قرار میگیره “*/
کد زیر را تست کردم ، جواب ها متفاوت شد، کجای کار رو درست متوجه نشدم؟
void setup() {
Serial.begin(9600);
int a1,b1;
float a2=3.68,b2=3.68;
a1=a2/1.3;
b1=(int)b2/(int)1.3;
Serial.println(a1); جواب =2
Serial.println(b1); جواب=3
}
void loop() {
// put your main code here, to run repeatedly:
}
نویسنده این مطلب
سلام
کدت رو برام زیپ کن و لینکش رو بزار اینجا
ولی چیزی که تو آردوینو هستش برا نمایش دادن اطلاعات دیگه نیاز به تبدیل فرمت دیتا نیستش بر خلاف کدویژن
مهمان
سلام دوست عزیز من میخام تولباکس آردینو رو به نرم افزار متلب add کنم ولی eror میده کاری که انجام دادم هم مطابق با اون چیزی بوده که خوذ سایت متلب ارائه داده ولی ممنون میشم اگه آموزششو بذاری،لابد من ی جای اشتباه دارم.
نویسنده این مطلب
سلام
متاسفانه مطلب کار نمیکنم و وقت این کار که دانلودش کنم و نصبش کنم و … فعلا ندارم.
مهمان
rasti y ja didam k y moteqayer ro injoori tariff karde bood
volatile int X;
in volatile chiye
age rajebe volatile ham y tozih bedin mamnoon misham
نویسنده این مطلب
سلام
نمیدونم سرچت خوبه یا بد ولی باید بگم که اگه بخوای منتظر بقیه باشی تا جواب سوالت رو بدن هم باید خیلی صبر کنی(تا طرف بیاد و جواب بده و بازم معلوم نیست که بلد باشه نباشه جواب خوبی بده بنده و …)، و بر فرض این که طرف هم جوابت رو داد، الان تو با این کار خودت رو فقط به جواب این طورف محدود کردی و دریای عظیم علم و دانش(اینترنت) رو در نظر نگرفتیو خودت رو محروم کردی، تازه کلی هم اعصابت خورد میشه، هی سوال بپرس هی صبر کن بپرس صبر صبر بپرس و…
لذا سعی کن سرچ کن، اگه سرچت ضعیف باشه(یعنی در انتخاب کلمات برای جستوجو ضعیف باشی)
امید وارم داش گل ما از دست ما بابت این داستان های بالا ناراحت نشه،
http://barnamenevis.org/showthread.php?340631-Volatile-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-C-%D8%A8%D9%87-%DA%86%D9%87-%D9%85%D8%B9%D9%86%D8%A7%D8%B3%D8%AA-%D8%9F%D8%9F%D8%9F%D8%9F%D8%9F&s=7db01827a45a9e3eeed4163aa084c868
مهمان
kheili khob bood daste shoma dard nakone faqat khastam tashakor konam
age emkan dashte bashe haminjoori baqie jalase haro ham amoozesh bedin
dg harf nadare
bazam mamnoon
نویسنده این مطلب
سلام
مطلب چی بزارم؟(مطلب آموزش و نه پروژه)
مهمان
آقا واقعا دست مریضات
دستت درد نکنه
واقعا مطالبت عالی بودن_حتی از سایت های دیگه
کامل، گویا،رسا
خواستم فقط تشکر کنم ازت
مهمان
با عرض سلام و خسته نباشید
میخواستم خواهش کنم طریقه اتصال درایور hx711 که درایور لودسل هست به آردیونو برام توضیح بدید
خیلی ممنون
نویسنده این مطلب
سلام
والا کار نکردم و نحوه کارش رو بلد نیستم و وقت یادگیری و کار عملیش رو هم ندارم فعلا…..اشاالله امشب یا فردا میریم کربلا
مهمان
سلام
برای تعریف ورودی جهت دریافت مقدار باید از چه تابعی استفاده کنیم؟؟
ممنون از اینکه وقت میذارید…یا علی
نویسنده این مطلب
سلام
تو جلسات اولیه فک کنم توضیح دادم…یه سری تابع بود با نام “دیجیتال رید” و “دیجیتال ورایت”…
بگرد پیدا نکردی خبرم کن…
مهمان
سلام
تابع هست که بتونه یه کلمه(String) و تو یه جمله(String) پیدا کنه و جای اون کلمه رو برگردونه؟
نویسنده این مطلب
سلام
فک کنم مطلب رو خوب نخوندی
ببین تو لینک زیر تابش هستش یا نه
اگه انگلیسیت ضعیفه بگو توابع رو توضیح بدم….البته متنش خیلی خیلی سادس
https://www.arduino.cc/en/Reference/StringObject
مهمان
خوندم بابا
اتفاقا من بیشتر مطالب شمارو میخونم
اونو نصفه نیمه خوندم تا جایی که فهمیدم indexOf انکارو میکه ولی یکم باش مشکل دارم
بازم تشکر میکنم از سایتت
دمت گرم
نویسنده این مطلب
چرا حالا میزنی

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