Помогите найти ошибку
- Войдите на сайт для отправки комментариев
Сб, 18/02/2017 - 01:33
Написал код терморегулятора, используется 3 датчика ds18b20. Добавил уставки по включению/выключение реле, в зависимости от температуры. При отладке в протеусе, не зависимо какая температура на датчиках, постоянно включается реле на пине D5. Помогите найти косяк, а то сам не нахожу
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#define plus 2
#define minus 3
#define next 4
#define rele1 5
#define rele2 6
#define rele3 7
#define rele4 8
#define rele5 9
#define rele6 10
LiquidCrystal_I2C lcd(63, 16, 2);
OneWire oneWire(15);// вход датчиков 18b20
DallasTemperature ds(&oneWire);
byte value0, value1, value2, value3, value4, value5;
int d1, d2, d3;
byte qty; // количество градусников на шине
////////Переменная для сохранения значения пункта меню////////
int menu = 1;
////////Переменные для хранение времени вкл/откл таймера////////
int on1 = 50;
int off1 = 53;
int on2 = 50;
int off2 = 53;
int on3 = 50;
int off3 = 53;
////////Переменная для сохранения значения пункта меню////////
int adr_on1 = 0;
int adr_off1 = 1;
int adr_on2 = 2;
int adr_off2 = 3;
int adr_on3 = 4;
int adr_off3 = 5;
void setup() {
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(rele4, OUTPUT);
pinMode(rele5, OUTPUT);
pinMode(rele6, OUTPUT);
////////Сверка значение времени с EEPROM////////
if (int(EEPROM.read(adr_on1)) == 255) {
EEPROM.update(adr_on1, byte(on1));
} else {
on1 = int(EEPROM.read(adr_on1));
}
if (int(EEPROM.read(adr_off1)) == 255) {
EEPROM.update(adr_off1, byte(off1));
} else {
off1 = int(EEPROM.read(adr_off1));
}
if (int(EEPROM.read(adr_on2)) == 255) {
EEPROM.update(adr_on2, byte(on2));
} else {
on2 = int(EEPROM.read(adr_on2));
}
if (int(EEPROM.read(adr_off2)) == 255) {
EEPROM.update(adr_off2, byte(off2));
} else {
off2 = int(EEPROM.read(adr_off2));
}
if (int(EEPROM.read(adr_on3)) == 255) {
EEPROM.update(adr_on3, byte(on3));
} else {
on3 = int(EEPROM.read(adr_on3));
}
if (int(EEPROM.read(adr_off3)) == 255) {
EEPROM.update(adr_off3, byte(off3));
} else {
off3 = int(EEPROM.read(adr_off3));
}
lcd.init();
lcd.backlight();
ds.begin();
qty = ds.getDeviceCount();
}
void loop() {
ds.requestTemperatures(); // считываем температуру с датчиков
d1 = ds.getTempCByIndex(0);
d2 = ds.getTempCByIndex(1);
d3 = ds.getTempCByIndex(2);
//
if (menu == 1) {
lcd.setCursor(0, 0);
lcd.print(d1);
lcd.print(" ");
lcd.print(d2);
lcd.print(" ");
lcd.print(d3);
}
if (menu == 2) {
lcd.setCursor(0, 0);
lcd.print("1temp ON");
lcd.setCursor(1, 0);
lcd.print(on1);
if (digitalRead(minus)) {
on1 = on1 - 1;
}
if (digitalRead(plus)) {
on1 = on1 + 1;
}
}
if (menu == 3) {
lcd.setCursor(0, 0);
lcd.print("1temp OFF");
lcd.setCursor(1, 0);
lcd.print(off1);
if (digitalRead(minus)) {
off1 = off1 - 1;
}
if (digitalRead(plus)) {
off1 = off1 + 1;
}
}
if (menu == 4) {
lcd.setCursor(0, 0);
lcd.print("2temp ON");
lcd.setCursor(1, 0);
lcd.print(on2);
if (digitalRead(minus)) {
on2 = on2 - 1;
}
if (digitalRead(plus)) {
on2 = on2 + 1;
}
}
if (menu == 5) {
lcd.setCursor(0, 0);
lcd.print("2temp OFF");
lcd.setCursor(1, 0);
lcd.print(off2);
if (digitalRead(minus)) {
off2 = off2 - 1;
}
if (digitalRead(plus)) {
off2 = off2 + 1;
}
}
if (menu == 6) {
lcd.setCursor(0, 0);
lcd.print("3temp ON");
lcd.setCursor(1, 0);
lcd.print(on3);
if (digitalRead(minus)) {
on3 = on3 - 1;
}
if (digitalRead(plus)) {
on3 = on3 + 1;
}
}
if (menu == 6) {
lcd.setCursor(0, 0);
lcd.print("3temp OFF");
lcd.setCursor(1, 0);
lcd.print(off3);
if (digitalRead(minus)) {
off3 = off3 - 1;
}
if (digitalRead(plus)) {
off3 = off3 + 1;
}
}
if (digitalRead(next)) {
delay(50);
if (menu == 6) {
menu = 0;
} else {
menu = menu + 1;
}
}
if (off1 > d1 <on1){
digitalWrite(rele1,1);
}else{
digitalWrite(rele1,0);
}
if (off2 > d2 <on2){
digitalWrite(rele1,1);
}else{
digitalWrite(rele1,0);
}
if (off3 > d3 <on3){
digitalWrite(rele1,1);
}else{
digitalWrite(rele1,0);
}
}
В коментарии особо не смотрите, побольшой части там бред
В коментарии особо не смотрите, побольшой части там бред
Может, перед тем, как размещать тему на форуме, следовало бы поправить комментарии?
Попробуйте так :
if (off1 > d1 && d1 > on1){ // if (off1 > d1 <on1){ digitalWrite(rele1,1); }else{ digitalWrite(rele1,0); } if (off2 > d2 && d2 > on2){ // if (off2 > d2 <on2){ digitalWrite(rele1,1); }else{ digitalWrite(rele1,0); } if (off3 > d3 && d3 > on3){ // if (off3 > d3 <on3){ digitalWrite(rele1,1); }else{ digitalWrite(rele1,0); } }Увы, все равно так же
Я в таких случаях вставляю в скетч побольше отладочных Serial.println() и смотрю в мониторе последовательного порта, как на самом деле всё происходит, а дальше разбираюсь, чем реальность отличается от моих о ней представлений и пытаюсь свести их воедино ))).
В коментарии особо не смотрите, побольшой части там бред
А вы не пытались навести в программе порядок. А то при бардаке и маленький косяк становится трагедией.
Чуть подчистил. Но за вас писать вашу программу не собираюсь.
/* #1 термометр -> 15 (OneWire_pin) #2 реле -> 5 (Rel_1_pin) -> 6 (Rel_2_pin) -> 7 (Rel_3_pin) -> 8 (Rel_4_pin) -> 9 (Rel_5_pin) -> 10 (Rel_6_pin) #3 экран #4 кнопки -> 2 (plus_pin) -> 3 (minus_pin) -> 4 (Next_pin) */ //#1 термометр #include <OneWire.h> #include <DallasTemperature.h> const byte OneWire_pin = 15;// вход датчиков 18b20 OneWire oneWire(OneWire_pin); DallasTemperature ds(&oneWire); int d1, d2, d3; byte qty; // количество градусников на шине //#2 реле #include <EEPROM.h> // - реле 1 const byte Rel_1_pin = 5; byte Temp_Rel_1_ON = 50; byte Temp_Rel_1_OFF = 53; const byte adr_Temp_Rel_1_ON = 0; const byte adr_Temp_Rel_1_OFF = 1; // - реле 2 const byte Rel_2_pin = 6; byte Temp_Rel_2_ON = 50; byte Temp_Rel_2_OFF = 53; const byte adr_Temp_Rel_2_ON = 2; const byte adr_Temp_Rel_2_OFF = 3; // - реле 3 const byte Rel_3_pin = 7; byte Temp_Rel_3_ON = 50; byte Temp_Rel_3_OFF = 53; const byte adr_Temp_Rel_3_ON = 4; const byte adr_Temp_Rel_3_OFF = 5; // - реле const byte Rel_4_pin = 8; const byte Rel_5_pin = 9; const byte Rel_6_pin = 10; //#3 экран #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(63, 16, 2); struct st_Menu { void (*viev)(void); void (*plus)(void); void (*minus)(void); }; void viev_0() { // экран 0 lcd.setCursor(0, 0); lcd.print(d1); lcd.print(" "); lcd.print(d2); lcd.print(" "); lcd.print(d3); }; void none() {}; void viev_1() {// экран 1 lcd.setCursor(0, 0); lcd.print("1temp ON"); lcd.setCursor(1, 0); lcd.print(Temp_Rel_1_ON); }; void plus_1() { Temp_Rel_1_ON++; }; void minus_1() { Temp_Rel_1_ON--; }; void viev_2() {// экран 2 lcd.setCursor(0, 0); lcd.print("1temp OFF"); lcd.setCursor(1, 0); lcd.print(Temp_Rel_1_OFF); }; void plus_2() { Temp_Rel_1_OFF++; }; void minus_2() { Temp_Rel_1_OFF--; }; void viev_3() {// экран 3 lcd.setCursor(0, 0); lcd.print("1temp ON"); lcd.setCursor(1, 0); lcd.print(Temp_Rel_2_ON); }; void plus_3() { Temp_Rel_2_ON++; }; void minus_3() { Temp_Rel_2_ON--; }; void viev_4() {// экран 4 lcd.setCursor(0, 0); lcd.print("1temp OFF"); lcd.setCursor(1, 0); lcd.print(Temp_Rel_2_OFF); }; void plus_4() { Temp_Rel_2_OFF++; }; void minus_4() { Temp_Rel_2_OFF--; }; void viev_5() {// экран 5 lcd.setCursor(0, 0); lcd.print("1temp ON"); lcd.setCursor(1, 0); lcd.print(Temp_Rel_3_ON); }; void plus_5() { Temp_Rel_3_ON++; }; void minus_5() { Temp_Rel_3_ON--; }; void viev_6() {// экран 6 lcd.setCursor(0, 0); lcd.print("1temp OFF"); lcd.setCursor(1, 0); lcd.print(Temp_Rel_3_OFF); }; void plus_6() { Temp_Rel_3_OFF++; }; void minus_6() { Temp_Rel_3_OFF--; }; st_Menu Menu[] = { &viev_0, &none, &none, // экран 0 &viev_1, &plus_1, &minus_1, // экран 1 &viev_2, &plus_2, &minus_2, // экран 2 &viev_3, &plus_3, &minus_3, // экран 3 &viev_4, &plus_4, &minus_4, // экран 4 &viev_5, &plus_5, &minus_5, // экран 5 &viev_6, &plus_6, &minus_6, // экран 6 }; byte n_menu = 0; //#4 кнопки const byte plus_pin = 2; const byte minus_pin = 3; const byte Next_pin = 4; void setup() { //#1 термометр ds.begin(); qty = ds.getDeviceCount(); //#2 реле pinMode(Rel_1_pin, OUTPUT); pinMode(Rel_2_pin, OUTPUT); pinMode(Rel_3_pin, OUTPUT); pinMode(Rel_4_pin, OUTPUT); pinMode(Rel_5_pin, OUTPUT); pinMode(Rel_6_pin, OUTPUT); if (int(EEPROM.read(adr_Temp_Rel_1_ON)) == 255) EEPROM.update(adr_Temp_Rel_1_ON, byte(Temp_Rel_1_ON)); else Temp_Rel_1_ON = int(EEPROM.read(adr_Temp_Rel_1_ON)); if (int(EEPROM.read(adr_Temp_Rel_1_OFF)) == 255) EEPROM.update(adr_Temp_Rel_1_OFF, byte(Temp_Rel_1_OFF)); else Temp_Rel_1_OFF = int(EEPROM.read(adr_Temp_Rel_1_OFF)); if (int(EEPROM.read(adr_Temp_Rel_2_ON)) == 255) EEPROM.update(adr_Temp_Rel_2_ON, byte(Temp_Rel_2_ON)); else Temp_Rel_2_ON = int(EEPROM.read(adr_Temp_Rel_2_ON)); if (int(EEPROM.read(adr_Temp_Rel_2_OFF)) == 255) EEPROM.update(adr_Temp_Rel_2_OFF, byte(Temp_Rel_2_OFF)); else Temp_Rel_2_OFF = int(EEPROM.read(adr_Temp_Rel_2_OFF)); if (int(EEPROM.read(adr_Temp_Rel_3_ON)) == 255) EEPROM.update(adr_Temp_Rel_3_ON, byte(Temp_Rel_3_ON)); else Temp_Rel_3_ON = int(EEPROM.read(adr_Temp_Rel_3_ON)); if (int(EEPROM.read(adr_Temp_Rel_3_OFF)) == 255) EEPROM.update(adr_Temp_Rel_3_OFF, byte(Temp_Rel_3_OFF)); else Temp_Rel_3_OFF = int(EEPROM.read(adr_Temp_Rel_3_OFF)); //#3 экран lcd.init(); lcd.backlight(); //#4 кнопки pinMode(minus_pin, INPUT_PULLUP); pinMode(plus_pin, INPUT_PULLUP); pinMode(Next_pin, INPUT_PULLUP); } void loop() { //#1 термометр ds.requestTemperatures(); // считываем температуру с датчиков d1 = ds.getTempCByIndex(0); d2 = ds.getTempCByIndex(1); d3 = ds.getTempCByIndex(2); //#2 реле if (Temp_Rel_1_OFF > d1 && d1 < Temp_Rel_1_ON) digitalWrite(Rel_1_pin, 1); else digitalWrite(Rel_1_pin, 0); if (Temp_Rel_2_OFF > d2 && d2 < Temp_Rel_2_ON) digitalWrite(Rel_2_pin, 1); else digitalWrite(Rel_2_pin, 0); if (Temp_Rel_3_OFF > d3 && d3 < Temp_Rel_3_ON) digitalWrite(Rel_3_pin, 1); else digitalWrite(Rel_3_pin, 0); //#3 экран Menu[n_menu].viev(); //#4 кнопки if (digitalRead(minus_pin)) Menu[n_menu].minus(); if (digitalRead(plus_pin)) Menu[n_menu].plus (); if (digitalRead(Next_pin)) { delay(50); n_menu++; if (n_menu > 6) n_menu = 0; } }