Создание void menu(){ } или когда остается просить помощи....
- Войдите на сайт для отправки комментариев
Привет всем. Опишу проблему в кратце. Есть код который собрал (как говорится Тяп-Ляп) но он работает, что меня устраевает. Но дело в том, что я использую LCD 16х2 и на нем нехватает места... Решил я все выводить в Serial порт (все работает как мне нужно), но подумав сделать меню на LCD с управление кнопок с порта я так и не понял как это реализовать. Возможно кто то уже этим занимался или кто то знает как это реализовать, помогите.
Сейчас меню выглядит так:
19:34:37|R1+ R2+ // первая строка
T1=26.75|******* // вторая страка
Через Serial порт я сделал так что на месте " ******* " выводит показания реле " R3+ R4+ " так и " |Т24 H38 "
командой if (incomingByte == '7') и if (incomingByte == '8') соответственно. Но в данном случае вывод этих параметров не отслеживает значения T H R3 R4, по этому приходится посылать обратно '7' и '8' да бы обновить показания. Как исправить это?
Вот сам код, думаю так будет нагляднее - >
/* #################################################### */ #include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal_I2C.h> #include "DHT.h" #define DS1307_I2C_ADDRESS 0x68 // Clock byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); } void setDateDs1307(byte second,byte minute,byte hour){ Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.endTransmission(); } void getDateDs1307(byte *second,byte *minute,byte *hour){ Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 3); *second = bcdToDec(Wire.read()); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read()); } LiquidCrystal_I2C lcd(0x27,16,2); #define DHTPIN 9 // Pin #9 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); byte h = 0; // переменная влажности DHT11 byte t = 0; // переменная температуры DHT11 OneWire oneWire(10); // Pin #10 DallasTemperature sensors(&oneWire); DeviceAddress tempDeviceAddress; float Temp_1 = 0; // переменная температуры DS18b20 const long setTmp = 24; // постоянная переменная DS18b20 unsigned long previousMillis = 0; const long interval = 1000; // переменная задержки DS18b20 int Water_up = 6; // Pin #6 int Water_low = 7; // Pin #7 int ledWater = 13; // Pin #13 int ledWaterStage = LOW; // переменная индикации LED int WaterState_1 = LOW; // переменная сигнала Water_up int WaterState_2 = LOW; // переменная сигнала Water_low unsigned long previousMillis2 = 0; const long interval1 = 1000; // переменная задержки Water* int SensorHum = A0; // Pin #A0 int currentHum = 0; // текущее значение влажности Sub int lastHum = 0; // предыдущее значение влажности Sub int tempHum = 0; //временная переменная int meteringCounter = 0; // счетчик измерений int meteringAmount = 10; // сколько раз мерять const long meteringInterval = 1000; // переменная задержки currentHum* unsigned long previousMillis1 = 0; unsigned int On_Time = 0; // переменная включения освещения unsigned int Off_Time = 0; // переменная отключения освещения unsigned int Curent_Time = 0; // переменная сравнения char incomingByte; // входящие данные с Serial порта int Relay_1 = 2; // R1 - Light // Pin #2 int Relay_2 = 3; // R2 - Temp // Pin #3 int Relay_3 = 4; // R3 - // Pin #4 int Relay_4 = 5; // R4 - // Pin #5 void setup(){ Wire.begin(); dht.begin(); sensors.begin(); Serial.begin(9600); lcd.init(); lcd.backlight(); Serial.println("Controller: ON \n"); lcd.setCursor(0, 1); lcd.print("T1="); lcd.setCursor(8, 0); lcd.print("|"); lcd.setCursor(9, 0); lcd.print("R1"); lcd.setCursor(13, 0); lcd.print("R2"); sensors.getAddress(tempDeviceAddress, 0); sensors.setResolution(12); pinMode(Water_up, INPUT); pinMode(Water_low, INPUT); pinMode(ledWater, OUTPUT); digitalWrite(ledWater, LOW); pinMode(Relay_1, OUTPUT); // R1 - Light pinMode(Relay_2, OUTPUT); // R2 - Temp pinMode(Relay_3, OUTPUT); // R3 - pinMode(Relay_4, OUTPUT); // R4 - digitalWrite(Relay_1, HIGH); digitalWrite(Relay_2, HIGH); digitalWrite(Relay_3, HIGH); digitalWrite(Relay_4, HIGH); } void loop(){ byte second, minute, hour; // индикация часов на LCD getDateDs1307(&second, &minute, &hour); lcd.setCursor(0, 0); if (hour < 10) { lcd.print ("0"); lcd.print (hour); } else { lcd.print (hour); } lcd.print(":"); if (minute < 10) { lcd.print ("0"); lcd.print (minute); } else { lcd.print (minute); } lcd.print(":"); if (second < 10) { lcd.print ("0"); lcd.print (second); } else { lcd.print (second); } On_Time=(6*60+01)-1; // запуск в 06 am Off_Time=(23*60+59)-1; // отключение в 23 pm Curent_Time=hour*60+minute; // переменная сравнения if (On_Time < Off_Time) { if (Curent_Time >= On_Time && Curent_Time <= Off_Time) { digitalWrite(Relay_1, LOW); // ON lcd.setCursor(11, 0); lcd.print("+"); } else { digitalWrite(Relay_1, HIGH); // OFF digitalWrite(Relay_1, HIGH); lcd.setCursor(11, 0); lcd.print("-"); } } else { if ((Curent_Time >= On_Time && Curent_Time <= 2820)|| (Curent_Time >= 0 && Curent_Time <= Off_Time)) { digitalWrite(Relay_1, LOW); // ON lcd.setCursor(11, 0); lcd.print("+"); } else { digitalWrite(Relay_1, HIGH); // OFF lcd.setCursor(11, 0); lcd.print("-"); } } unsigned long currentMillis = millis(); if (currentMillis - previousMillis > interval) { previousMillis = currentMillis; sensors.setWaitForConversion(false); sensors.requestTemperatures(); sensors.setWaitForConversion(true); sensors.getAddress(tempDeviceAddress, 0); Temp_1 = sensors.getTempC(tempDeviceAddress); lcd.setCursor(3, 1); lcd.print(" "); lcd.print("|"); lcd.setCursor(3, 1); lcd.print(Temp_1); lcd.print("|"); // DHT test for interval DS h = dht.readHumidity(); t = dht.readTemperature(); } if (Temp_1 >= setTmp) { digitalWrite(Relay_2, LOW); // ON lcd.setCursor(15, 0); lcd.print("+"); } if (Temp_1 < setTmp) { digitalWrite(Relay_2, HIGH); // OFF lcd.setCursor(15, 0); lcd.print("-"); } if ((currentMillis - previousMillis1 >= meteringInterval) && meteringCounter < meteringAmount){ meteringCounter++; // прибавляем счетчик previousMillis1 = currentMillis; tempHum += analogRead(SensorHum); } else if (meteringCounter==meteringAmount){ // проверяем если достигли конца счетчика meteringCounter=0; // сбрасываем счетчик в 0 lastHum = currentHum; // присваиваем предыдущему значению Hum текущее значение Hum currentHum = tempHum/meteringAmount; // обновляем текущее значение (делим временную переменную на кол-во измерений) tempHum=0; //сбрасываем временную переменную в 0 } if (currentMillis - previousMillis2 > interval1) { previousMillis2 = currentMillis; WaterState_1 = digitalRead(Water_up); WaterState_2 = digitalRead(Water_low); if ((WaterState_1 == HIGH) || (WaterState_2 == HIGH)) { ledWaterStage == LOW; digitalWrite(ledWater, LOW); } if ((WaterState_1 == LOW) || (WaterState_2 = HIGH)) { ledWaterStage == HIGH; digitalWrite(ledWater, HIGH); } if ((WaterState_1 == LOW) || (WaterState_2 == LOW)) { if (ledWaterStage == HIGH) ledWaterStage = LOW; else ledWaterStage = HIGH; digitalWrite(ledWater, ledWaterStage); } } if (Serial.available() > 0 ) { incomingByte = Serial.read(); if (incomingByte == 's') { Serial.print("Time: "); if (hour < 10) { Serial.print ("0"); Serial.print (hour); } else { Serial.print(hour); } Serial.print(":"); if (minute < 10) { Serial.print ("0"); Serial.print (minute); } else { Serial.print (minute); } Serial.print(":"); if (second < 10) { Serial.print ("0"); Serial.println (second); } else { Serial.println (second); } Serial.print("Temp_DS: "); Serial.print(Temp_1); Serial.println(" *C"); Serial.print("Temp_DHT: "); Serial.print(t); Serial.println(" *C"); Serial.print("Hum_Sub: "); Serial.print(currentHum); Serial.print(" / "); if (currentHum <= 255) { Serial.println("100%"); } if ((currentHum >= 255) && (currentHum <= 511)) { Serial.println("75%"); } if ((currentHum >= 511) && (currentHum <= 766)) { Serial.println("50%"); } if ((currentHum >= 766) && (currentHum <= 1022)) { Serial.println("25%"); } Serial.print("Hum_Box: "); Serial.print(h); Serial.println(" % \n"); } if (incomingByte == '3') { int Val = !digitalRead(Relay_3); digitalWrite(Relay_3, Val); // lcd.setCursor(11, 1); // lcd.print( Val ? "-" : "+" ); Serial.println( Val ? "Relay_3 = OFF" : "Relay_3 = ON" ); } if (incomingByte == '4') { int Val = !digitalRead(Relay_4); digitalWrite(Relay_4, Val); // lcd.setCursor(15, 1); // lcd.print( Val ? "-" : "+" ); Serial.println( Val ? "Relay_4 = OFF" : "Relay_4 = ON" ); } { lcd.setCursor(9, 1); lcd.print("T"); lcd.print(t); lcd.print(" "); lcd.print("H"); lcd.print(h); } if (incomingByte == '8') { int Val = digitalRead(Relay_3); lcd.setCursor(9, 1); lcd.print( Val ? "R3-" : "R3+" ); lcd.print(" "); int Val1 = digitalRead(Relay_4); lcd.setCursor(13, 1); lcd.print( Val1 ? "R4-" : "R4+" ); } if (incomingByte == '9') { lcd.setCursor(9, 1); lcd.print("T"); lcd.print(t); lcd.print(" "); lcd.print("H"); lcd.print(h); } } }
в данном участке я запутался, как дальше быть...
if (incomingByte == '3') { int Val = !digitalRead(Relay_3); digitalWrite(Relay_3, Val); // lcd.setCursor(11, 1); // lcd.print( Val ? "-" : "+" ); Serial.println( Val ? "Relay_3 = OFF" : "Relay_3 = ON" ); } if (incomingByte == '4') { int Val = !digitalRead(Relay_4); digitalWrite(Relay_4, Val); // lcd.setCursor(15, 1); // lcd.print( Val ? "-" : "+" ); Serial.println( Val ? "Relay_4 = OFF" : "Relay_4 = ON" ); } { lcd.setCursor(9, 1); lcd.print("T"); lcd.print(t); lcd.print(" "); lcd.print("H"); lcd.print(h); } if (incomingByte == '8') { int Val = digitalRead(Relay_3); lcd.setCursor(9, 1); lcd.print( Val ? "R3-" : "R3+" ); lcd.print(" "); int Val1 = digitalRead(Relay_4); lcd.setCursor(13, 1); lcd.print( Val1 ? "R4-" : "R4+" ); } if (incomingByte == '9') { lcd.setCursor(9, 1); lcd.print("T"); lcd.print(t); lcd.print(" "); lcd.print("H"); lcd.print(h); }
Тут я дергаю за контакты и переключаю реле R3 и R4
if (incomingByte == '3') { int Val = !digitalRead(Relay_3); digitalWrite(Relay_3, Val); // lcd.setCursor(11, 1); // lcd.print( Val ? "-" : "+" ); Serial.println( Val ? "Relay_3 = OFF" : "Relay_3 = ON" ); } if (incomingByte == '4') { int Val = !digitalRead(Relay_4); digitalWrite(Relay_4, Val); // lcd.setCursor(15, 1); // lcd.print( Val ? "-" : "+" ); Serial.println( Val ? "Relay_4 = OFF" : "Relay_4 = ON" ); }
За ранее Спасибо Всем.
Вышла оплошность, со строки 16 по 23 (310-317) вылез артефакт. Не обращайте на него внимание.