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

سلام و ادب وخسته نباشید
استاد تو اخر جلسه 4 مربوط به اردینو فرمودید برا تمرین به یه استرینگ (مثلا) روشن رو بگیرید و یه عدد بگیرید (مثلا 12) و ال ای دی روشن شه و بعد 12 ثانیه خاموش شه؟
1-اینکه 12 ثانیه رو چطور تنظیم کنیم یعنی باید delay رو ضرب و تقسیم کنیم ببینیم 12 ثانیه معادل چقد delay میشه و بدیم یا راه بهتری هست؟
2-من یه تابع نوشتم که اگه عدد 1 گرفتی روشن شو و اگه 0 گرفتی خاموش و این تابع رو تو دل تابع قبلی که گفته اگه roshan گرفتی روشن کن گذاشتم اما تابع رو پیدا نمیکنه حتی بدون هم نوشتم و کدها رو مستقیم گذاشتم باز عمل نکرد
کد رو هم براتون گذاشتم لطفا راهن

[upl-file uuid=8a98deb1-8f7f-45e6-be8b-8cf9e6f75bdf size=1kB]project-20.txt[/upl-file]

مایی بفرمایید
و اینکه استاد من چطور میتونم از دستور define به جای دستور pinmode استفاده کنم مثلا مینویسم

# define pinMode x و بعد تو برنامه به جای پین مود x میدم ارور میده

از یک متغیر کمکی به اسم isMessageComplete استفاده کردم که ببینم الان باید منتظر roshan باشم یا منتظر یک عدد.
توابع readString و parseInt هم اگر آشنا نیستید باهاشون در ادامه آموزش یاد میگیرید. اولی یک string رو میخونه از سریال و دومی یک عدد. میشد از اینها استفاده نکرد ولی کد طولانی تر و پیچیده تر میشد. در آموزش بدون استفاده از این دو هم با سریال کار کردیم.
با توجه به اینکه led در ابتدا خاموش هست و بعد روی سریال roshan ارسال میشه و بعد منتظر یک عدد هستیم، وارد کردن khamoosh بی معنی هست. بنابراین در کد دنبال khamoosh نمی گردیم. نکته بعدی اینکه delay به صورت blocking استفاده شده و مثلا اگر عدد ۱۰ رو وارد کنید، ۱۰ ثانیه سیستم هیچ کاری نمیکنه و بعد led رو خاموش میکنه و در این ۱۰ ثانیه نمیتونید دستور دیگه ای وارد کنید. اگر بخواید اینطوری نباشه، باید از میلیس یا اینتراپت استفاده کنید که در ادامه آموزش توضیحش رو دادیم.
نکته آخر هم اینکه اگر از کنسول سریال خود آردوینو استفاده میکنید، اگر گزینه new line رو زده باشید، آخر هر چیزی که وارد کنید یک که معادل رفتن به خط بعد (new line) هست وارد میکنه که این باعث میشه در خود کد هم ما متن ورودی رو با roshan مقایسه کردیم. اگر اون تیک رو بردارید، باید کد رو تغییر بدید و متن ورودی با roshan مقایسه کنید و اون رو حذف کنید. البته که راه هایی وجود داره که کد با هردو کار کنه ولی صورت مسئله الان ما این نبوده.

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

void loop() {


serialKhan();
if(stringAmade){
Serial.println(stringKamel);
if(stringKamel=="roshan"){
digitalWrite(13,HIGH);
// adademan();
}else if(stringKamel=="kamosh"){
digitalWrite(13,LOW);
}
stringKamel="";
stringAmade=false;
}
}
الان تو کد بالا بعد روشن کردن پین 13 میام خط پایین یه تابع به نام adademan تعریف کردم که این تابع میگه حالاکه چراغ(پین 13) روشنه الان یه عدد بگیر از سریال اگه عدد 0 بود چراغ رو خاموش کن
سوال اینه الان اون تابع adademan اصلا تو برنامه کار نمیکنه و از میپره
الان نمیدونم مشکل از نحوه تعریف تابع adademan هست یا نه داخل تابع if بعد دیجیتال رایت نباید تابع دیگری تعریف کرد یا نمیدونم از یه جای دیگه؟
به هر حال اون تمرینی که گفته بودید که اول یه رشته بگیرید اینتر بزنید چراغ روشن شه و بعد یه عدد بگیرید واینتر بزنید و به اندازه اون عدد چراغ روشن بمونه رو نتونستم بنویسم

بلهاستاد درسته از نظر سینتکس مشکلی نیست اما وقتی بعد زدن کد روشن. روشن میشه ولی وقتی بعدش 0 میزنم خاموش نمیشه توی کد رو با علامت ستاره مشخص کردم که داخل اون ستاره ها عمل نمیکنه
حتی وقتی به جای اون ستاره ها تابعی که نوشتم به نام adad رو میذارم باز هم عمل نمیکنه

[upl-file uuid=65f80ba2-53da-47d0-806f-a8ac541fd5a1 size=1kB]project-20.txt[/upl-file]

.با تشکر از زحماتتون

دوست عزیز شما همچنان سناریویی که می خواید اجرا کنید رو به من نگفتید. لطفا کدهاتون رو هم توضیح بدید. مثلا بگید در هر بلوک هدفتون چی بوده. (برای سوال های بعدی)
با توجه به اینکه سناریوی کامل شما رو نمی دونم، حدس می زنم که مشکل شما از این هست که روند اجرای کدتون رو در نظر نگرفتید.
خودتون رو جای میکرو بذارید و خط به خط کد ها رو اجرا کنید و ببینید چه اتفاقی میفته.
شما بعد از اینکه roshan رو فرستادید، کد شما اجرا میشه و برنامه برمیگرده به loop اصلی. داخل loop تابعی دارید که کل serial رو داره می خونه و دیگه چیزی به تابع اونیکی تابع از سریال نمیرسه. هرچی که هست رو اون تابع اصلیه میخونه. بنابراین دومین جایی که نوشتید اگر serial.available، هیچوقت true نمیشه.
حالا اگر سناریوی اصلی رو به من بگید، من کمکتون می کنم که کدش رو با هم بزنیم.

من باز هم پیشنهاد می کنم که خودتون رو جای میکرو بذارید و خط به خط کد رو اجرا کنید تا مشکل رو پیدا کنید.
وقتی که شما عبارت roshan رو ارسال می کنید، قبل از اینکه فرصت کنید عدد بعدش رو وارد کنید، کد شما اجرا شده و روی سریال هم چیزی پیدا نکرده و برمیگرده به loop اصلی. مشکل، روند اجرای کد شما هست.
به نظرم فقط و فقط در یکجا serial.read رو انجام بدید و با استفاده از یک متغیر دیگه، مشخص کنید که آیا الان باید منتظر عدد باشید یا اینکه باید منتظر فرمان روشن یا خاموش باشید. بعد با توجه به اینکه الان داده ورودی کاربر کدوم هست، تصمیم بگیرید که چه اتفاقی بیفته.
من الان دسترسی به برد آردوینو ندارم، تا یکی دو روز دیگه اگر با این توضیحات موفق نشده بودید که کد رو اصلاح کنید، من براتون کد رو می زنم و ارسال می کنم.

و اینکه استاد میشه از پایتون واسه برنامه نویسی استفاده کرد؟اخه من زیاد تو این اموزش سردرگم میشم راستش اموزش حداقل اردینو که من میبینم نظام مند نیست ینی مثلا حداقل یه ساختمان کلی از دستورات و نحوه به کار گیری شون گفته نشده کاش حداقل دو سه جلسه اول فصل به اموزش زبان برنامه نویسی تو اردینو که سی یا سی پلاس پلاس داده میشد بعد پروژه کار میشد چون تو این روش فعلی ادم چیزی زیادی به طور عمقی یاد نمیگیره و صرفا چنتا پروژه حفظ میکنه مثلا تو خود همین پروژه چون ساختار بلد نیستم با یکم این ور اونور کردن پروژه ادم لنگه چون نمیدونه ساختار کلی برنامه نویسی اینجا چیه مثلا چطور بتونم دو تا تابع رو تو لوپ فراخوانی کنم ایا تو ارگومان فراخوانی کنم یا نه یا تابع اگه ریترن نداشته باشه چطور فراخوانی میشه الان من نمیدونم برم دوباره اموزش سی پلاس پلاس تهیه کنم بعد دوباره بیام سراغ این یا نه اینو کلا بذارم کنار پایتون بلدم دوباره واسه اموزش دیگه هزینه کنم .یا نه اموزش های دیگه تو اینترنت راجع به اردینو هست دوباره اونارو تهیه کنم واقعا الان دوروزه وقتم تلف شده واسه یه پروژه 100 جور جواب تو اینترنت هست که ادم سر درنیاره چون اصلا از برنامه سردرنمیاره من الان حتی نمیدونم فرق available >0 با available==o چیه چون مطالب متعدد و متضاده و من پایه ای بلد نیستم ولی مثلا تو پایتون میدونم چطور کلاس بنویسم عملکرد توابع در شرایط مختلف چطور و انواع روش های فراخوانی اون چیه نتیجتا ذهنم پراکنده نیست و میدونم دقیقا اگه به مشکل خوردم دنبال چی بگردم و جوابمو پیدا کنم اما تو این دوره صرفا چنتا پروژه حفظ کردم و ذهنم رفته رفته پراکنده تر میشه .اموزش خوبه اما من فکر میکنم واقعا خیلی بهتر از این هم میتونست باشه ممنون میشم راهنمایی کنید من چیکار کنم که هربار کلی وقتم (در حد دو روز!!) بابت پیدا کردن جواب یه پروژه تلف نشه اخرم نفهمم دنبال چی بگردم و به جواب نرسم.لطفا بگید ایا من برم اموزش سی پلاس پلاس رو تموم کنم بعد بیام سراغ این دوره یا چیکار کنم.خیلی ممنون

سلام دوست عزیز، شما بعد از ۵ ماه جواب دادید و الان مجدد من دسترسی به آردوینو ندارم. چند روز دیگه سعی میکنم کد رو براتون ارسال کنم.
در مورد موارد دیگه ای که گفتید: ببینید کلا در دنیا دو مدل آموزش برنامه نویسی رواج داره. روش اول به صورت آموزش همه دستور ها و توابع و نکات هست، روش دوم آموزش در عمل و توسط مثال ها و آزمایش های بسیار هست. این الان ثابت شده که اثر روش دوم بسیار بسیار بهتر از روش اول هست. یک مثال بارز این قضیه، یادگیری زبان انگلیسی هست. آیا برای یادگیری زبان انگلیسی بهتر هست که دیکشنری که همه لغات رو در خودش داره و بردارید و همه لغات رو یاد بگیرید؟ یا اینکه سعی کنید در عمل و با جمله های ساده و کوتاه شروع کنید و بعد آروم آروم پیشرفته تر بشید؟ قطعا روش دوم اثر بخشی بیشتری خواهد داشت.
ما هم در این بسته سعی کردیم در عمل و با انجام آزمایش ها و مینی پروژه ها برنامه نویسی و الکترونیک رو آموزش بدیم بهتون.
اینکه شما می فرمایید زبان پایتون رو بلد هستید ولی در ادامه میفرمایید فرق available >0 با available==0 رو نمیدونید، تعجب بسیار زیاد من رو به همراه داشت. در زبان پایتون برای مقایسه یک متغیر، دقیقا همین دستور استفاده میشه. کلا زبان های برنامه نویسی زیاد با هم تفاوت ندارن و شباهت های خیلی زیادی به هم دارن.
ما زبان C رو خیلی خیلی ساده و از صفر شروع کردیم در بسته و هیچ خط کد (تاکید می کنم، "هیج" خط کدی) بدون توضیح آورده نشده و هییچ جا لازم نیست شما چیزی رو حفظ کنید. تعداد خیلی خیلی زیادی از این بسته طی سال های گذشته فروش رفته و افرادی که حتی رشته شون ریاضی نبوده و حتی کوچک ترین آشنایی ای با برنامه نویسی نداشتن، الان دارن کار می کنن تو این حوزه و کاملا راه افتادن.
من از شما خواهش می کنم که به روند بسته، نحوه آموزش و نحوه دسته بندی مطالب در این بسته اعتماد کنید و قدم به قدم با مدرس پیش برید. همه کد ها رو خودتون هم مجدد به صورت عملی تمرین کنید. تمرین تمرین تمرین. این مهم ترین کاری هست که باید بکنید.
در این بسته بعضی از مسائلی که آخر مبحث می پرسم و تکالیفی که مشخص میکنم، در جلسات بعد بهشون پرداختم و هدف این هست که به فکر فرو برید و بعد ادامه بدید آموزش رو. اگر مباحث براتون جا نمیفته، سعی کنید چند بار ببینید مباحث رو. بین روند آموزشتون وقفه نندازید. اینکه چند روز برای یک کد وقت گذاشتید کاملا طبیعی هست. شما در حال یادگیری هستید، ما که سال هاست کار میکنیم هم برای بعضی کد ها ممکنه هفته ها درگیر باشیم. یادگیری با همین کلنجار رفتن ها اتفاق میفته.

>

@814#4829 چون نمیدونه ساختار کلی برنامه نویسی اینجا چیه مثلا چطور بتونم دو تا تابع رو تو لوپ فراخوانی کنم ایا تو ارگومان فراخوانی کنم یا نه یا تابع اگه ریترن نداشته باشه چطور فراخوانی میش

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

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

سلام دوست عزیز، من فرصت کردم کد رو بزنم براتون.
به این صورت هست که شما اول روی سریال بهش میگید roshan و بعد led روشن میشه. حالا یک عدد وارد میکنید مثلا ۵ و بعد از ۵ ثانیه led خاموش میشه.
void setup() {
Serial.begin(9660);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
}

String userCommand;
int userDelay = 0;
bool isMessageComplete = true;

void loop() {
while(Serial.available() > 0){
if(isMessageComplete){
userCommand = Serial.readString();
if(userCommand == "roshan "){
digitalWrite(LED_BUILTIN, HIGH);
isMessageComplete = false;
}
}else{
userDelay = Serial.parseInt();
delay(userDelay*1000);
digitalWrite(LED_BUILTIN, LOW);
isMessageComplete = true;
}
}
}

کد خط به خط اجرا میشه و کاملا مثل پایتون هست. فقط اینجا ما loop های بینهایت داریم که در پایتون استفاده نمیشن. باید خودتون رو جای میکرو بذارید و خط به خط کدها رو باهاش برید. کدی که داخل void loop() نوشته میشه، از خط اولش اجرا میشه و خط به خط میره جلو و اگر کد به آخرین خط رسید، برمیگرده بالا و دوباره اجرا میشه. یعنی یک حلقه بینهایت هست. پس اگر داخل loop شما روی سریال بنویسید hello و کد رو اجرا کنید، به صورت یک حلقه بینهایت این کد اجرا میشه و همیشه تا بینهایت عبارت hello رو پرینت میکنه.
کارکرد while هم مثل پایتون هست. تا وقتی که شرط داخلش درست باشه، اجرا میشه.
وقتی که شما چیزی رو از کامپیوتر روی سریال برای میکرو ارسال میکنید، serial.available یک عدد مثبت میشه و بنابراین وارد while اول میشید و اولین کاراکتر رو میخونید. مشکلی که کد شما داره اینه که اینجا اومدید و ۲۰ میلی ثانیه delay گذاشتید. این باعث میشه که کاراکتر های بعدی ای که میاد رو از دست بدید. درستش اینه که اول همه اطلاعات رو از سریال بخونید و بعد پردازش کنید. اگر هر کاراکتر رو اول پردازش کنید و بعد برید سراغ کاراکتر بعدی، کاراکتر بعدی رو از دست میدید. چون ارتباط سریال به صورت سریالی و پشت سر هم کاراکتر ها رو ارسال می کنه و باید به موقع کاراکتر ها دریافت بشن وگرنه از دست میرن.
من کد صحیح رو براتون ارسال خواهم کرد.

و اینکه یادم رفت بگم تو اردینو نمیشه تو حلقه یه تابع رو صدا زد که تو خود اون تابع صدا زده شده یه serial.available داشته باشیم؟ ینی الان تو کد زیر numberkhan یه تابع هست بیرون لوپ که خود این numberkhan هم یه دونه تو خودش serial.available داره
loop(){
while(serial.available){
serial.read
تابع خارجی :numberkhan()
{
چون هرچی نوشتم عمل نکرد ایا اصلا نباید عمل کنه یا من نمیتونم؟

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

[upl-file uuid=26e23b2e-b50c-4c12-9af2-fc4ca97746da size=690B]wiredsmarthome.txt[/upl-file]

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

  • 1. void numberkhan(){
  • 2. while(Serial.available()){
  • 3. int i=Serial.parseInt();
  • 4. Serial.read();
  • 5. Serial.println(i);
  • 6. if(i==3000){
  • 7. digitalWrite(13,HIGH);
  • 8. delay(i);
  • 9. digitalWrite(13,LOW);
  • 10. }
  • 11. }
    و اینو تو کد اصلی شما داخل تابع دیگه ای که تعریف کردید وارد کردم اما جواب نداد فک کنم چون تابع چیزی رو ریترن نمیکنه تو تابع اصلی فراخوانی نمیشه
    راه دوم هم که به جای نوشتن تابع دستورات رو داخل خود تابع اصلی نوشتم بازم جواب نداد
  • باشه چشم استاد امیدوارم که عرایضم رو بی ادبی تلقی نکنید من چون وقتی به مشکلی برخوردم تا حلش نکنم نمیتونم جلو برم برا همین دو سه روزه الاف یه کد هستم همون اول هم عرض کردم که من بسته رو کامل ندیدم و تو همون قسمت (فصل 2 جلسه 4 )گیر کردم حتی اونقد که دیگه خسته شدم و بعد درسا هم روش و باعث شد 5 ماه وقفه باشه باشه اگه شما اینطور صلاح میدونید ادامه میدم تا ببینم جلوتر چی میشه چوت تا الان تو همون جلسه قفل کردم و اعتماد بنفسم زیر صفره فک میکنم نمیتونم کاری کنم
    اما این بار با توصیه شما پیش میرم.فقط ازتون خواهش میکنم که اون کدی که فرمودید حتما برام ارسال کنید چون ذهنم درگیرش هس
    فقط یه سوال دیگه استاد من اون کد رو امروز یه جور ی به نتیجه رسوندم که میدونم به احتمال زیاد غلطه اما بازم میخوام بپرسم تو این کد که من نوشتم وارد حلقه وایل که میشه چنبار باید پشت هم f رو بزنم که وارد if بشه , yes چاپ کنه و بعد چنبار بزنم که بره تو وایل دوم و بر حسب عددی که میدم تا اون ثانیه چراغ روشن بشه نمیدونم مشکل چیه یه delay هم گذاشتم اما مشکل تا حدودی رفع شد اخه با ذهنیت پایتون فک میکنم خط به خط جلو میره اما این اینطوری نیست نمیدونم الان چیکار کنم ایا کدی که نوشتم از اساس نادرسته یا نه ممنون اگه نظرتون رو بگید

    سلام دوست عزیز، در مورد delay می تونید از توابع delay خود آردوینو استفاده کنید که ورودیش بر حسب میلی ثانیه هست و هر ثانیه برابر با هزار میلی ثانیه است.
    مشکلی که در مورد اینکه تابع رو پیدا نمیکنه رو متوجه نشدم. لطفا کدی که مشکل داره رو برام بفرستید و بگید که چه اروری داره بهتون میده. کدی که می فرستید رو هم برای من توضیح بدید که من بتونم با خوندنش متوجه منظورتون بشم. کدی که ارسال کرده بودید رو من اجرا کردم و متوجه نشدم که مشکلتون چیه باهاش. اروری نداشت.
    در مورد اون define هم باید بنویسید define x pinMode # و حواستون باشه که متغیر دیگه ای به اسم x نداشته باشید.