Создание void menu(){ } или когда остается просить помощи....

Marlen S
Offline
Зарегистрирован: 13.01.2015

Привет всем. Опишу проблему в кратце. Есть код который собрал (как говорится Тяп-Ляп) но он работает, что меня устраевает. Но дело в том, что я использую 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" );
    }

За ранее Спасибо Всем.

Marlen S
Offline
Зарегистрирован: 13.01.2015

Вышла оплошность, со строки 16 по 23 (310-317) вылез артефакт. Не обращайте на него внимание.

16
      {
17
      lcd.setCursor(9, 1);
18
      lcd.print("T");
19
      lcd.print(t);
20
      lcd.print(" ");
21
      lcd.print("H");
22
      lcd.print(h);
23
    }