Помогите найти ошибку

Apocalyps
Offline
Зарегистрирован: 26.07.2015

Написал код терморегулятора, используется 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);
}

}


 

Apocalyps
Offline
Зарегистрирован: 26.07.2015

В коментарии особо не смотрите, побольшой части там бред

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Apocalyps пишет:

В коментарии особо не смотрите, побольшой части там бред

Может, перед тем, как размещать тему на форуме, следовало бы поправить комментарии?

Araris
Offline
Зарегистрирован: 09.11.2012

Попробуйте так :

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);
}

}

 

Apocalyps
Offline
Зарегистрирован: 26.07.2015

Увы, все равно так же

Araris
Offline
Зарегистрирован: 09.11.2012

Я в таких случаях вставляю в скетч побольше отладочных Serial.println() и смотрю в мониторе последовательного порта, как на самом деле всё происходит, а дальше разбираюсь, чем реальность отличается от моих о ней представлений и пытаюсь свести их воедино ))).

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Apocalyps пишет:

В коментарии особо не смотрите, побольшой части там бред

А вы не пытались навести в программе порядок. А то при бардаке и маленький косяк становится трагедией.

Чуть подчистил. Но за вас писать вашу программу не собираюсь.

/*
  #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;
  }
}