تجزیه و تحلیل رو ول کن.:d
کد رو بزار تا نگاش کنیم
تجزیه و تحلیل رو ول کن.:d
کد رو بزار تا نگاش کنیم
کد:#include <Bounce2.h> #include <DHT.h> #include <LiquidCrystal.h> #define setBUTTON 13 #define upBUTTON 12 #define downBUTTON 11 #define DHTPIN 2 #define DHTTYPE DHT21 Bounce set; Bounce up; Bounce down; DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(8, 7, 6, 5, 4, 3); const int temprelay = 10, humidityrelay = 9; float temp,hum; const float i=temp, j=hum; void setup() { lcd.begin(16, 2); lcd.clear(); dht.begin(); set.attach (setBUTTON); set.interval(50); up.attach (upBUTTON); up.interval(50); down.attach (downBUTTON); down.interval(50); pinMode (setBUTTON, INPUT_PULLUP); pinMode (upBUTTON, INPUT_PULLUP); pinMode (downBUTTON, INPUT_PULLUP); } void loop() { set.update(); up.update(); down.update(); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { lcd.clear(); lcd.setCursor(1,0); lcd.print("Failed to read "); lcd.setCursor(0,1); lcd.print("from DHT sensor!"); delay(2000); lcd.clear(); return; } if ((t) >= i){ digitalWrite (temprelay, HIGH); } else if ((t) <= i-5) { digitalWrite (temprelay, LOW); } if ((h) >= j){ digitalWrite (humidityrelay, LOW); } else if ((h) <=j-12) { digitalWrite (humidityrelay, HIGH); } lcd.print("Humidity:"); lcd.setCursor(10,0); lcd.print(h); lcd.setCursor(15,0); lcd.print("%"); lcd.setCursor(1,1); lcd.print("Temp:"); lcd.setCursor(7,1); lcd.print(t); lcd.setCursor(12,1); lcd.print(" *C "); }
ویرایش توسط cjmj : 02-08-2016 در ساعت 10:58 AM
الان مشکل کجاست؟
توی این کد هیچ مشکلی نیست ، قبلا هم گفتم که میخوام سه تا کلید وصل کنم به آردینو یک کلید بالا و یک کلید پایین برای کم و زیاد کردن و یک کلید هم برای رفتن به تنظیمات.
در واقع میخوام وقتی که دفعه ی اول که کلید تنظیمات رو فشار دادم تنظیمات temp نمایش داده بشه و با دو کلید up و down دما رو کم و زیاد کنم و دفعه ی دوم که کلید تنظیمات رو فشار دادم بتونم رطوبت رو توش تنظیم کنم با کلید up و down.
حالا چرا میخوام دما و رطوبت رو تنظیم کنم؟؟؟
چون توی این گلخانه ای که قراره سنسور نصب بشه رطوبت باید 80 تا 90 درصد باشه و دما هم باید 20 تا 25 درجه. برای مثال ما دما رو روی 20 درجه توسط کلید تنظیم و کلید های up و down و رطوبت رو روی 85 درصد تنظیم میکنیم. خوب آردینو این اعداد رو که بهش دادیم رو میگیره و یه عمل مقایسه بین این اعدادی که ما بهش دادیم و اعدادی که سنسور dht21 نشون میده انجام میده. خوب ما دما رو روی 20 درجه تنظیم کرده بودیم حالا اگر دمای گلخانه بالای 20 رفت مثلا شد 25 ، اردینو یک رله رو که به یکی از این پین ها متصله فعال کرده و رله هواکش رو روشن میکنه و تهویه انجام میشه تا دما به چند درجه زیر 20 برسه مثلا 16 یا 17. حالا چرا زیر 20؟ چون اگه دما دوباره روی 20 بیاد و آردینو تهویه رو خاموش کنه خوب مسلمه که دقت سنسور نیم درجه است و اگه یک لحظه بیشتر از 20 درجه تشخیص بده دوباره فن روشن میشه.
حالا در مورد رطوبت: خوب ما رطوبت رو روی 85 درصد تنظیم کرده بودیم ، حالا فرض کنید رطوبت محیط 50 درصد باشه خوب مسلمه که آردینو رله ی مخصوص رطوبت رو فعال میکنه و بدین ترتیب دستگاه رطوبت ساز فعال میشه و اونقدر رطوبت تولید میکنه تا رطوبت برسه به 85 درصد و رله قطع بشه و دستگاه رطوبت ساز خاموش شه و تا وقتی دوباره رطوبت به زیر 80 نرسیده رطوبت ساز توسط آردینو روشن نشه.
من فقط تونستم تا یه جایی کد نویسی کنم که کد هم گذاشتم واستون. و تمام چیز هایی که اینجا گفتم رو دیگه در توان من نیست برنامه نویسی کنم چون بیش از یک ماه نیست که دارم با آردینو کار میکنم لطفا کمکم کنید و راه های نوشتن این برنامه رو بگید که از چه دستوراتی میتونم استفاده کنم تا پروژه رو تکمیل کنم.
سپاس فراوان از شما و ببخشید که زیاد نوشتم.
ویرایش توسط cjmj : 02-08-2016 در ساعت 09:12 PM
ببین کدت رو به شکل تابع نویسی در آوردم
اینو آپلود کن ببین همه چیز درسته یا نه
و این که یه نکته تو وقتی از شرط خارج میشی داری به پین دیجیتال متصل به رله دستور high میدی مگه رله تو 1 فعاله ؟
مدل رله ای که استفاده می کنی چیه؟
کد:#include <Bounce2.h> #include <DHT.h> #include <LiquidCrystal.h> #define setBUTTON 13 #define upBUTTON 12 #define downBUTTON 11 #define DHTPIN 2 #define DHTTYPE DHT21 Bounce set; Bounce up; Bounce down; DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(8, 7, 6, 5, 4, 3); float h, t, tset = 25, hset = 80; void setup() { project_config(); } //******************* void loop() { button_update(); DHT_Read(); compare_setpoint(tset, hset, t, h); data_Show(h, t); } //******************* void project_config() { lcd.begin(16, 2); lcd.clear(); dht.begin(); set.attach (setBUTTON); set.interval(50); up.attach (upBUTTON); up.interval(50); down.attach (downBUTTON); down.interval(50); pinMode (setBUTTON, INPUT_PULLUP); pinMode (upBUTTON, INPUT_PULLUP); pinMode (downBUTTON, INPUT_PULLUP); } //******************* void DHT_Read() { h = dht.readHumidity(); t = dht.readTemperature(); if (isnan(h) || isnan(t)) { lcd.clear(); lcd.setCursor(1, 0); lcd.print("Failed to read "); lcd.setCursor(0, 1); lcd.print("from DHT sensor!"); delay(2000); lcd.clear(); return; } } //******************* void data_Show(float temprature, float humidity) { lcd.print("Humidity:"); lcd.setCursor(10, 0); lcd.print(humidity); lcd.setCursor(15, 0); lcd.print("%"); lcd.setCursor(1, 1); lcd.print("Temp:"); lcd.setCursor(7, 1); lcd.print(temprature); lcd.setCursor(12, 1); lcd.print(" *C "); } //******************* void compare_setpoint(float tempsetpint , float humidsetpoint, float tempr, float humidi) { const int temprelay = 10, humidityrelay = 9; if (tempr >= tempsetpint) { digitalWrite (temprelay, HIGH); } else if (tempr <= tempsetpint - 5) { digitalWrite (temprelay, LOW); } if (humidi >= humidsetpoint) { digitalWrite (humidityrelay, LOW); } else if (humidi <= humidsetpoint - 12) { digitalWrite (humidityrelay, HIGH); } } //******************* void button_update() { set.update(); up.update(); down.update(); }
اول یه نکته بگم:
متغیر از نوع float ، اعشاری می باشد.
تو این مواقع باید از نوع int (عدد صحیح) تعریف کنی تا مثلا توی برنامه وقتی می خوای بگی
اگه برابر 80 درصد شدی:
تابع مثلا سلام رو اجرا کن.
حالا برنامه رو نگاه می کنم و مورد های بعدی رو بهت می گم.
سپاس گزارم ازشما برای وقتی که برای حل شدن مشکلم گذاشتید.ببین کدت رو به شکل تابع نویسی در آوردم
اینو آپلود کن ببین همه چیز درسته یا نه
و این که یه نکته تو وقتی از شرط خارج میشی داری به پین دیجیتال متصل به رله دستور high میدی مگه رله تو 1 فعاله ؟
مدل رله ای که استفاده می کنی چیه؟
کد هایی که تغییر دادین رو آپلود کردم و تا اینجای برنامه مثل قبل درست کار میکنه.
درسته رله توی 1 فعال میشه ، پین میکرو به بیس یک ترانزیستور متصل میشه و رله توسط ترانزیستور فعال میشه.
در مورد دستورات شرطی که توی کد قرار داره مطمئنم چون به جای قرار دادن متغیر در کد ؛ از عدد استفاده کردم و دیدم که کارش رو درست داره انجام میده.
در مورد کلید تنظیم که قراره یک بار تنظیمات دما رو بیاره و یک بار تنظیمات رطوبت رو فکر کنم باید از switch / case استفاده کرد درسته؟؟؟؟
ویرایش توسط cjmj : 02-09-2016 در ساعت 12:18 PM
بچه ها بالاخره موفق شدم :d:d
پس از روز ها و شب ها بیداری خلاصه تونستم با کمک شما و کمک خداو سلام و صلوات و با رمز یا زهرا
برنامه ای رو که میخواستم درست کنم.
الان که خیلی خسته ام و خوابم میاد فردا یک فیلم از نحوه کار کردش میگیرم و میذارمش اینجا تا بقیه هم ببینند.
سلام
یه فیلم گرفتم از روش کار کردنش:
http://s7.picofile.com/file/82383647...22004.zip.html
کد:#include <EEPROM.h> #include <Bounce2.h> #include <DHT.h> #include <LiquidCrystal.h> #define setBUTTON 13 #define upBUTTON 12 #define downBUTTON 11 #define DHTPIN 2 #define DHTTYPE DHT21 Bounce set; Bounce up; Bounce down; DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(8, 7, 6, 5, 4, 3); const byte temprelay = 10, humidityrelay = 9; byte humiditySetpoint = 85; byte tempSetpoint = 20; unsigned long prevMillis = 0; unsigned long currentmillis = millis(); static byte prevdownButton; static byte prevupButton; static byte prevsetButton; static byte prevSetMode; byte setMode; void setup() { lcd.begin(16, 2); lcd.clear(); dht.begin(); set.attach (setBUTTON); set.interval(30); up.attach (upBUTTON); up.interval(30); down.attach (downBUTTON); down.interval(30); pinMode (setBUTTON, INPUT_PULLUP); pinMode (upBUTTON, INPUT_PULLUP); pinMode (downBUTTON, INPUT_PULLUP); humiditySetpoint = EEPROM.read(0); tempSetpoint = EEPROM.read(1); } void loop() { set.update(); up.update(); down.update(); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { lcd.clear(); lcd.setCursor(1,0); lcd.print("Failed to read "); lcd.setCursor(0,1); lcd.print("from DHT sensor!"); delay(2000); lcd.clear(); return; } if ((t) >= tempSetpoint){ digitalWrite (temprelay, HIGH); } else if ((t) <= tempSetpoint-5) { digitalWrite (temprelay, LOW); } if ((h) >= humiditySetpoint){ digitalWrite (humidityrelay, LOW); } else if ((h) <=humiditySetpoint-10) { digitalWrite (humidityrelay, HIGH); } if ( setMode != 0) { if (currentmillis - prevMillis >= 10000UL) { setMode = 0; prevMillis = currentmillis; } } if (set.fell()) { setMode++; } prevsetButton = setBUTTON; if (setMode >= 3) { setMode = 0; } if (setMode != prevSetMode) { lcd.clear(); prevSetMode = setMode; } switch (setMode) { case 0://normal lcd.print("Humidity:"); lcd.setCursor(10,0); lcd.print(h); lcd.setCursor(15,0); lcd.print("%"); lcd.setCursor(1,1); lcd.print("Temp:"); lcd.setCursor(7,1); lcd.print(t); lcd.setCursor(12,1); lcd.print(" *C "); prevMillis = currentmillis; break; case 1://edit temp if ('upButton' != prevupButton) { if (up.fell()) { tempSetpoint = tempSetpoint + 1; } prevupButton = 'upButton'; } if ('downButton' != prevdownButton) { if (down.fell()) { tempSetpoint = tempSetpoint - 1; } prevdownButton = 'downButton'; } lcd.setCursor(0, 0); lcd.print("Set temp:"); lcd.setCursor(7, 1); lcd.print(tempSetpoint); lcd.setCursor(9,1); lcd.print("*C"); EEPROM.write(1, tempSetpoint); break; case 2://edit humidity if ('upButton' != prevupButton) { if (up.fell()) { humiditySetpoint = humiditySetpoint + 1; } prevupButton = 'upButton'; } if ('downButton' != prevdownButton) { if (down.fell()) { humiditySetpoint = humiditySetpoint - 1; } prevdownButton = 'downButton'; } lcd.setCursor(0, 0); lcd.print("Set Humidity:"); lcd.setCursor(7, 1); lcd.print(humiditySetpoint); lcd.setCursor(9,1); lcd.print("%"); EEPROM.write(0, humiditySetpoint); break; }}
ویرایش توسط cjmj : 02-11-2016 در ساعت 07:45 PM