Создание 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) вылез артефакт. Не обращайте на него внимание.
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 }