سلام و عرض ادب و خسته نباشید .
این برنامه چهار سال پیش نوشته شده و به خاطر مشغله کاری نتونستم درست کنم .
در برنامه به دو مشکل بر خوردم
اولی این که یک متور تخم مرغ ها رو میچرخونه به این صورت که متور به راست میچرخه و با برخورد به لیمیت سویچ قطع میشود و برای یک ساعت منتظر میمونه و به چپ میچرخه و با برخورد به لیمیت سویچ قطع میشود و یک ساعت منتظر میمونه و دوباره...که این کار درست انجام نمیشه و با تحریک کلید متور قطع نمیشه و روشن میمونه.
دوم برای تهویه هست که در صورت گرم بودن هوا یا بالا بودن رطوبت هیتر (لامپ)قطع میشود و فن روشن میشود
که با بالا بودن رطوبت و گرمای هوا هیتر قطع میشود ولی فن روشن نمیشود به صورتی که با روشن خاموش شدن هیتر ,فن هم روشن خاموش میشود.
تابع گردش موتورها
مربوط به دما که فن فعال نمیشود
کد رو به صورت کامل و کامنت گذاری شده میزارم تا بقیه دوستان هم در صورت اصلاح شدن برنامه استفاده کنن.
این برنامه چهار سال پیش نوشته شده و به خاطر مشغله کاری نتونستم درست کنم .
در برنامه به دو مشکل بر خوردم
اولی این که یک متور تخم مرغ ها رو میچرخونه به این صورت که متور به راست میچرخه و با برخورد به لیمیت سویچ قطع میشود و برای یک ساعت منتظر میمونه و به چپ میچرخه و با برخورد به لیمیت سویچ قطع میشود و یک ساعت منتظر میمونه و دوباره...که این کار درست انجام نمیشه و با تحریک کلید متور قطع نمیشه و روشن میمونه.
دوم برای تهویه هست که در صورت گرم بودن هوا یا بالا بودن رطوبت هیتر (لامپ)قطع میشود و فن روشن میشود
که با بالا بودن رطوبت و گرمای هوا هیتر قطع میشود ولی فن روشن نمیشود به صورتی که با روشن خاموش شدن هیتر ,فن هم روشن خاموش میشود.
تابع گردش موتورها
کد HTML:
void motor(){ //تابع گردش موتورها btnLE.update(); btnRI.update(); if (btnRI.fell()|| btnLE.fell()) { digitalWrite(MOTORCPIN,LOW); digitalWrite(MOTORCCPIN,LOW); lastMotorchange = millis(); isWaiting = true; } if (millis() - lastMotorchange > MOTOR_WAIT && isWaiting) { if (motorClockwise) { digitalWrite(MOTORCPIN,LOW); digitalWrite(MOTORCCPIN,HIGH); }else{ digitalWrite(MOTORCPIN,HIGH); digitalWrite(MOTORCCPIN,LOW); } isWaiting = false; motorClockwise =!motorClockwise; lastMotorchange = millis(); } }
کد HTML:
void autoControl() { if (day <= 18) { if (humidity > AUTOHUMFIRST || temperature > AUTOTEMPFIRST) { //اگر دما یا رطوبت از میزان تعیین شده بالاتر بود digitalWrite(CONTROLFANPIN,HIGH); }else{ digitalWrite(CONTROLFANPIN,LOW); } if (temperature < AUTOTEMPFIRST) { digitalWrite(HEATLAMPPIN,HIGH); }else{ digitalWrite(HEATLAMPPIN,LOW); } if (humidity < AUTOHUMFIRST) { digitalWrite(HUMIDIFIERPIN,HIGH); }else{ digitalWrite(HUMIDIFIERPIN,LOW); } }else{ if (humidity > AUTOHUMSECOND || temperature > AUTOHUMSECOND) { //اگر دما یا رطوبت بالاتر از حد دستی وارد شده بود digitalWrite(CONTROLFANPIN,HIGH); }else{ digitalWrite(CONTROLFANPIN,LOW); } if (temperature < AUTOTEMPSECOND) { digitalWrite(HEATLAMPPIN,HIGH); }else{ digitalWrite(HEATLAMPPIN,LOW); } if (humidity < AUTOHUMSECOND) { digitalWrite(HUMIDIFIERPIN,HIGH); }else{ digitalWrite(HUMIDIFIERPIN,LOW); } } }
کد HTML:
#include <Wire.h> #include <AHT10.h> #include <Bounce2.h> #include <LiquidCrystal_I2C.h> #define FAN_INTERVAL 1800000 //فن هر نیم ساعت یک بار خاموش و روشن میشود #define MOTOR_WAIT 360000 //موتور پس از یک ساعت توقف به کار می افتد #define SENSORTIMER 2000 //وقفه بین هر بار خواندن سنسور #define LONGPRESS 3000 //مدت زمان مورد نیاز برای نگه داشتن دکمه و ثبت متغیر #define STEP 0.1 //گام تغییر متغیرها ////////////////////////////پینهای ورودی//////////////////////////////// #define MANUALAUTOPIN 1 // پین مورد استفاده برای دکمهی حالت دستی و اتومات #define UPBUTTON 0 //پین مورد استفاده برای دکمهی بالا #define DOWNBUTTON 2 // دکمهی پایین #define HUMIDITYPIN 3 // دکمهی رطوبت #define RIGHTTURNSWITCH 4 //کلید توقف موتور-چپ #define LEFTTURNSWITCH 5 // کلید توقف موتور-راست ////////////////////////////پینهای خروجی/////////////////////////////// #define MANUALMODELED 6 // پین مورد استفاده برای ال ای دی حالت اتوماتیک و دستی #define MOTORCPIN 7 //پین راست گرد موتور متصل به l298n #define MOTORCCPIN 8 //پین چپ گرد متصل به l298n #define INTERVALFANPIN 9 //پین متصل به رلهی فن دوره ای #define CONTROLFANPIN 10 //فن کنترل دما #define HUMIDIFIERPIN 11 //پین ال ای دی مرطوب کننده #define HEATLAMPPIN 12 //پین لامپ گرم کننده #define LED_PIN 13 //////////////////////////////دما و رطوبت مورد نظر برای حالت اتوماتیک////// #define AUTOTEMPFIRST 32.7 //دما و رطوبت مورد نظر برای روزهای اول تا هجدهم و نوزدهم به بعد. #define AUTOHUMFIRST 60.0 #define AUTOTEMPSECOND 37.2 #define AUTOHUMSECOND 70.0 int ledState = LOW; String state = "auto"; //متغیر حالت برای نگهداری حالت دستگاه bool isWaiting = false; //مربوط به چرخش موتور bool motorClockwise = true; //آیا موتور به راست میچرخد؟ bool intervalFanState = true; //مربوط به چرخش فن دوره ای ///////////////متغیرهای مورد استفاده برای نگهداری زمان////////////////// unsigned long currentMillis = 0; //زمان حال unsigned long lastButtonPress = 0; //آخرین زمان فشرده شدن دکمه unsigned long lastSensorReading = 0; //آخرین زمانی که سنسور خوانده شده unsigned long lastdaymillis = 0; //آخرین زمانی که تعداد روزها شمرده شده unsigned long lastfanmillis = 0; //آخرین زمانی که فن دوره ای کار کرده unsigned long lastMotorchange = 0; //آخرین زمانی که موتور تغییر حالت داده /////////// آرایههای مورد نیاز برای تبدیل و نمایش دما و رطوبت بصورت کارکتری/// char tempchar[5]; char humchar[5]; //////////////////// متغیرهای مربوط به دما و رطوبت در حالت دستی///////////////////// float minManTemp = 37.6; //مقادیر اولیه برای مینیمم و ماکسیمم float maxManTemp = 37.7; float minManHum = 59; float maxManHum = 60; byte day = 1; //برای نگهداری روز float humidity ; //رطوبت float temperature ; //دما uint8_t readStatus = 0; //مربوط به سنسور ///////////////////////ایجاد شیئها ا//////////////////////// AHT10 sensor(AHT10_ADDRESS_0X38); //سنسور LiquidCrystal_I2C lcd(0x27, 16, 2); // ال سی دی //////////////////////////دکمه ها و کلید ها/////////////// Bounce btnMA = Bounce(); //دکمهی تغییر حالت دستی و اتومات Bounce btnHU = Bounce(); //دکمهی رطوبت Bounce btnUP = Bounce(); //دکمهی جهت بالا Bounce btnDN = Bounce(); //دکمهی جهت پایین Bounce btnRI = Bounce(); //کلید راست گرد Bounce btnLE = Bounce(); //کلید چپ گرد //////////////////////////// توابع /////////////////////////////////// byte button(Bounce debouncer){ //در صورت فشردن طولانی ۲ و در صورت فشردن کوتاه ۱ بر میگرداند if (debouncer.fell() ) { // در صورت فشرده بودن دکمه lastButtonPress = millis(); currentMillis = millis(); while (!debouncer.update() ){ //اگر هنوز دکمه فشرده بود unsigned long pressedTime = millis() - lastButtonPress; delay(10); if (pressedTime >= LONGPRESS){ return 2; } } return 1; } } void setManVar(float &var, String message){ //تابع تنظیم متغیرها در حالت دستی lcd.clear(); lcd.setCursor(0,0); lcd.print(message); lcd.print(var); lastButtonPress = millis(); do { btnDN.update(); btnUP.update(); if (btnDN.fell()) { Serial.println("Down Button Pressed"); lastButtonPress = millis(); var -= STEP; lcd.setCursor(0,0); lcd.print(message); lcd.print(var); }else if (btnUP.fell()){ Serial.println("Up Button pressed."); lastButtonPress = millis(); var += STEP; lcd.setCursor(0,0); lcd.print(message); lcd.print(var); } delay(10); }while (millis() - lastButtonPress < LONGPRESS); Serial.println("Returning to manual mode..."); lcd.clear(); state = "manual"; } void showData(){ //تابع نمایش دما و رطوبت روی ال سی دی dtostrf(humidity,4, 1, humchar); dtostrf(temperature,4, 1, tempchar); char line1 [17]; char line2 [17]; sprintf(line1, "HUM : %s%%", humchar); sprintf(line2, "TEMP: %sC D%d ", tempchar,day); lcd.setCursor(0,0); // ردیف اول ال سی دی lcd.print(line1); lcd.setCursor(0,1); //ردیف دوم ال سی دی lcd.print(line2); } void readSensor(){ //خواندن دما و رطوبت از سنسور if (currentMillis - lastSensorReading >= SENSORTIMER){ sensor.readRawData(); temperature = sensor.readTemperature(AHT10_USE_READ_DATA); humidity = sensor.readHumidity(AHT10_USE_READ_DATA); lastSensorReading = millis(); }else{ } } void countDays(byte &day){ //تابع شمارش تعداد روزهای سپری شده از زمان اجرای برنامه if (currentMillis - lastdaymillis >= 86400000){ //1 day = 24*60*60*1000 milliseconds...86400000 day++; lastdaymillis = millis(); } } void handleStates(){ //تابع حالات سیستم:دستی، اتومات و ... if (button(btnMA) == 1){ ledState = !ledState; digitalWrite(LED_PIN,ledState); } if (state == "auto"){ digitalWrite(MANUALMODELED,LOW); readSensor(); showData(); autoControl(); if (button(btnMA) == 2){ Serial.println("BUTTON LONG PRESS, swithing to MANUAL"); state = "manual"; } }else if (state == "manual"){ //حالت دستی digitalWrite(MANUALMODELED,HIGH); readSensor(); showData(); manualControl(); if (button(btnMA) == 2){ //اگر دکمهی اتومات\دستی نگه داشته بشه Serial.println("BUTTON LONG PRESS, swithing to AUTO"); state = "auto"; }else if (button(btnHU)==1) { //اگر دکمهی رطوبت فشرده بشه state = "setMinHum"; }else if (button(btnHU)==2){ state = "setMaxHum"; }else if (button(btnUP)==2){ state = "setMaxTemp"; }else if (button(btnDN)==2){ state = "setMinTemp"; } }else if (state == "setMinHum"){ Serial.println("Setting Min. Humidity..."); setManVar(minManHum,"Min Hum: "); }else if (state == "setMaxHum"){ Serial.println("Setting Max. Humidity..."); setManVar(maxManHum,"Max Hum: "); }else if (state == "setMinTemp"){ Serial.println("Setting Min. Temperature..."); setManVar(minManTemp,"Min Temp: "); }else if (state == "setMaxTemp"){ Serial.println("Setting Max. Temperature..."); setManVar(maxManTemp,"Max Temp: "); } } void motor(){ //تابع گردش موتورها btnLE.update(); btnRI.update(); if (btnRI.fell()|| btnLE.fell()) { digitalWrite(MOTORCPIN,LOW); digitalWrite(MOTORCCPIN,LOW); lastMotorchange = millis(); isWaiting = true; } if (millis() - lastMotorchange > MOTOR_WAIT && isWaiting) { if (motorClockwise) { digitalWrite(MOTORCPIN,LOW); digitalWrite(MOTORCCPIN,HIGH); }else{ digitalWrite(MOTORCPIN,HIGH); digitalWrite(MOTORCCPIN,LOW); } isWaiting = false; motorClockwise =!motorClockwise; lastMotorchange = millis(); } } void fan(){ if (currentMillis- lastfanmillis >= FAN_INTERVAL) { if(intervalFanState){ digitalWrite(INTERVALFANPIN, LOW); intervalFanState = false; }else{ digitalWrite(INTERVALFANPIN, HIGH); intervalFanState = true; } lastfanmillis = millis(); } } void manualControl(){ if (humidity > maxManHum || temperature > maxManTemp) { //اگر دما یا رطوبت بالاتر از حد دستی وارد شده بود digitalWrite(CONTROLFANPIN,HIGH); }else{ digitalWrite(CONTROLFANPIN,LOW); } if (temperature < minManTemp) { digitalWrite(HEATLAMPPIN,HIGH); }else{ digitalWrite(HEATLAMPPIN,LOW); } if (humidity < minManHum) { digitalWrite(HUMIDIFIERPIN,HIGH); }else{ digitalWrite(HUMIDIFIERPIN,LOW); } } void autoControl() { if (day <= 18) { if (humidity > AUTOHUMFIRST || temperature > AUTOTEMPFIRST) { //اگر دما یا رطوبت از میزان تعیین شده بالاتر بود digitalWrite(CONTROLFANPIN,HIGH); }else{ digitalWrite(CONTROLFANPIN,LOW); } if (temperature < AUTOTEMPFIRST) { digitalWrite(HEATLAMPPIN,HIGH); }else{ digitalWrite(HEATLAMPPIN,LOW); } if (humidity < AUTOHUMFIRST) { digitalWrite(HUMIDIFIERPIN,HIGH); }else{ digitalWrite(HUMIDIFIERPIN,LOW); } }else{ if (humidity > AUTOHUMSECOND || temperature > AUTOHUMSECOND) { //اگر دما یا رطوبت بالاتر از حد دستی وارد شده بود digitalWrite(CONTROLFANPIN,HIGH); }else{ digitalWrite(CONTROLFANPIN,LOW); } if (temperature < AUTOTEMPSECOND) { digitalWrite(HEATLAMPPIN,HIGH); }else{ digitalWrite(HEATLAMPPIN,LOW); } if (humidity < AUTOHUMSECOND) { digitalWrite(HUMIDIFIERPIN,HIGH); }else{ digitalWrite(HUMIDIFIERPIN,LOW); } } } ////////////////////////////END OF Custom Functions/////////////////////////////////// void setup() { Serial.begin(9600); //ارتباط سریال برای دیباگ کردن btnMA.attach(MANUALAUTOPIN,INPUT_PULLUP); // وصل کردن دکمه ها به پین ها btnHU.attach(HUMIDITYPIN,INPUT_PULLUP); btnUP.attach(UPBUTTON,INPUT_PULLUP); btnDN.attach(DOWNBUTTON,INPUT_PULLUP); btnRI.attach(LEFTTURNSWITCH,INPUT_PULLUP); btnLE.attach(RIGHTTURNSWITCH,INPUT_PULLUP); pinMode(MANUALMODELED, OUTPUT); //معرفی خروجی ها pinMode(MOTORCPIN, OUTPUT); pinMode(MOTORCCPIN, OUTPUT); pinMode(INTERVALFANPIN,OUTPUT); pinMode(CONTROLFANPIN, OUTPUT); pinMode(HUMIDIFIERPIN, OUTPUT); pinMode(HEATLAMPPIN, OUTPUT); pinMode(LED_PIN,OUTPUT); sensor.begin(); //راه اندازی سنسور lcd.init(); // راه اندازی ال سی دی lcd.backlight(); lcd.clear(); digitalWrite(INTERVALFANPIN,HIGH); digitalWrite(MOTORCPIN,HIGH); digitalWrite(LED_PIN,ledState); } void loop() { currentMillis = millis(); //شمارندهی تایم رو آپدیت میکنیم btnMA.update(); //دکمهها رو میخونیم btnHU.update(); btnUP.update(); btnDN.update(); btnLE.update(); btnRI.update(); readSensor(); //سنسور را میخواند countDays(day); //شمارش روزها از زمان اجرای برنامه motor(); //تابع گردش موتورها handleStates(); //تابع مدیریت روتینها fan(); }
دیدگاه