Два датчика ds18b20 показывают -127

Romikk
Offline
Зарегистрирован: 26.03.2021

3драствуйте, есть скетч контроллер холодильника, Проблема в том что 2 датчика температур ds18b20 показывают -127, при том что в тестовой прошивке от библиотеки dallas-temperature все ок, работало и с адресами и с индексом. Прикрепляю прошивку

#include <OneWire.h>
#include <Wire.h> 
#include <DallasTemperature.h>
#include <iarduino_RTC.h>
#include <LiquidCrystal_I2C.h>

#define ONE_WIRE_BUS 15

iarduino_RTC time(RTC_DS3231);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27,16,2);

uint8_t sensor1[8] = {0x28, 0xD0, 0x03, 0x07, 0xD6, 0x01, 0x3C, 0x03};
uint8_t sensor2[8] = {0x28, 0x90, 0xB4, 0x07, 0xD6, 0x01, 0x3C, 0x68};

unsigned long period_time = 2000;
unsigned long my_timer;

bool btnStateU;
bool btnStateD;
bool btnStateS;

byte num;
int Mor;
int Hol;
int menu = 1;
int temH;
int temM;
int setH = 5;
int setM = -5;
int arr;
int FirstStart = 0;
int pinReleH = 11;
int pinReleM = 12;
int pinReleVent = 3;
int pinReleK = 2;
int pinLed = 9;
int pinPiezo = 9;

int ButtU = 4;
int ButtD = 5;
int ButtS = 6;

bool flagU = false;
bool flagD = false;
bool flagS = false;
bool flagSuccH = 0;
bool flagSuccM = 0;
bool StateM = 0;
bool StateH = 0;

void setup() {
  Serial.begin(9600);
  pinMode(pinReleH, OUTPUT);
  pinMode(pinReleM, OUTPUT);
  pinMode(pinReleVent, OUTPUT);
  pinMode(pinReleK, OUTPUT);
  pinMode(pinLed, OUTPUT);
  pinMode(ButtU, INPUT_PULLUP);
  pinMode(ButtD, INPUT_PULLUP);
  pinMode(ButtS, INPUT_PULLUP);
  digitalWrite(pinReleH, HIGH);
  digitalWrite(pinReleM, HIGH);
  digitalWrite(pinReleVent, HIGH);
  digitalWrite(pinReleK, HIGH);
  time.begin();
  time.settime(0, 30, 18, 12, 6, 20, 5); // 0  сек, 30 мин, 18 часов, 12, июня, 2020, четверг
  sensors.begin();
  lcd.init();
  lcd.backlight();
}
void loop() {
  sensors.requestTemperatures();
  Serial.print("Sensor 1: ");
  Serial.println(sensors.getTempC(sensor1));
  temH = sensors.getTempC(sensor1);
  Serial.print("Sensor 2: ");
  Serial.println(sensors.getTempC(sensor2));
  temM = sensors.getTempC(sensor2);
  if (millis() - my_timer >= period_time) {
    lcd.clear();
    my_timer = millis();
  }
  btnStateU = !digitalRead(ButtU);
  btnStateD = !digitalRead(ButtD);
  btnStateS = !digitalRead(ButtS);

  //          Селект         //
  if (btnStateS && !flagS && menu == 1) {
    flagS = true;
    menu = 2;
  }
  if (!btnStateS && flagS) flagS = false;
  if (btnStateS && !flagS && menu == 2) {
    flagS = true; if (arr == 1) {
      arr = 0;
      menu = 1;
    }
    if (arr == 0) {
      arr = 1;
    }
  }
  if (!btnStateS && flagS) flagS = false;
  // ПЕРШЕ ВКЛЮЧЕННЯ //
  if (FirstStart == 0) {
    if (temH != setH && flagSuccH == 0) {
      Holod();
    }
    if (temM != setM && flagSuccM == 0 && flagSuccH == 1 ) {
      Moroz();
    }
    if (flagSuccH == 1 && flagSuccM == 1) {
      FirstStart = 1;
      digitalWrite(pinReleK, HIGH);
      flagSuccH = 0;
      flagSuccM = 0;
    }
  }
  if (FirstStart == 1) {
    if (((temH > setH + 3 || temH < setH - 3) && StateM == 0) || Hol == 1) {
      Hol = 1;
      Holod();
      if (flagSuccH == 1) {
        digitalWrite(pinReleK, HIGH);
        flagSuccH = 0;
        Hol = 0;
      }
    }
    if (((temM > setM + 3 || temM < setM - 3) && StateH == 0) || Mor == 1) {
      Mor = 1;
      Moroz();
      if (flagSuccM == 1) {
        digitalWrite(pinReleK, HIGH);
        flagSuccM = 0;
        Mor = 0;
      }
    }
  }
 /* if(temM == -127 || temH == -127){
    menu =3;
  }              */
  switch (menu) {
    case 1: menu1();
      break;
    case 2: menu2();
      break;
    case 3: menu3();
      break;
  }
}
void menu1() {
  if (millis() % 1000 == 0) {
     lcd.setCursor(4,0);
     lcd.print(time.gettime("H:i:s"));
  }
  lcd.setCursor(0, 1);
  lcd.print("Hol:");
  lcd.print(temH);
  lcd.setCursor(8, 1);
  lcd.print("Mor:");
  lcd.print(temM);
}
void menu2() {
  lcd.setCursor(0, 0);
  lcd.print("Set temp H:");
  lcd.print(setH);
  if (arr == 0) {
    lcd.print("<<");
  }
  lcd.setCursor(0, 1);
  lcd.print("Set temp M:");
  lcd.print(setM);
  if (arr == 1) {
    lcd.print("<<");
  }
  if (arr == 0) {
    if (btnStateU && !flagU) {
      flagU = true;
      if (setH < 10) {
        setH++;
      }
    }
    if (!btnStateU && flagU) flagU = false;
    if (btnStateD && !flagD) {
      flagD = true;
      if (setH > 5) {
        setH--;
      }
    }
    if (!btnStateD && flagD) flagD = false;
  }

  if (arr == 1) {
    if (btnStateU && !flagU) {
      flagU = true;
      if (setM < 0) {
        setM++;
      }
    }
    if (!btnStateU && flagU) flagU = false;
    if (btnStateD && !flagD) {
      flagD = true;
      if (setM > -18) {
        setM--;
      }
    }
    if (!btnStateD && flagD) flagD = false;
  }
}
void menu3() {
  lcd.clear();
  lcd.setCursor(5, 0);
  lcd.print("ERROR!");
  lcd.setCursor(2, 1);
  lcd.print("CHECK SENSOR");
  digitalWrite(pinLed, HIGH);
  tone(pinPiezo, 1000, 500);
  if(temM == -127 || temH == -127){
    digitalWrite(pinLed, LOW);
    menu = 1;
  }
}
void Holod() {
  if (StateH == 0) {
    digitalWrite(pinReleH, LOW);
    digitalWrite(pinReleVent, LOW);
    digitalWrite(pinReleK, LOW);
    delay(1000);
    digitalWrite(pinReleH, HIGH);
    StateH = 1;
  }

  if (temH == setH || temH == setH + 1 || temH == setH - 1) {
    flagSuccH = 1;
    StateH = 0;
  }
}
void Moroz() {
  if (StateM == 0) {
    digitalWrite(pinReleM, LOW);
    digitalWrite(pinReleVent, HIGH);
    digitalWrite(pinReleK, LOW);
    delay(1000);
    digitalWrite(pinReleM, HIGH);
    StateM = 1;
  }

  if (temM == setM || temM == setM + 1 || temM == setM - 1) {
    flagSuccM = 1;
    StateM = 0;
  }

}

Пробний скетч с библиотеки


#include <OneWire.h>
#include <DallasTemperature.h>
 
OneWire oneWire(15);  // порт подключения датчиков (A1)
DallasTemperature ds(&oneWire);

byte num;              // количество подключенных датчиков

void setup() {
  Serial.begin(9600);   // инициализация монитора порта
  ds.begin();                 // инициализация датчика ds18b20

  num = ds.getDeviceCount();   // узнаем количество датчиков 
  Serial.print("Number: ");           // выводим полученное количество
  Serial.println(num);
}

void loop() {
// выполняем цикл столько, сколько найдено датчиков на шине
 for (byte i = 0; i < num; i++){
    Serial.print("Sensor ");
    Serial.print(i);
    Serial.print(": ");
    ds.requestTemperatures();                       // считываем температуру с датчика
    Serial.print(ds.getTempCByIndex(i));
    Serial.println("C");
  } 
Serial.println(""); 
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Тестовая работала или работает?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Паузу в секунду добавьте между 24 и 25 строк в пробную программу - всё заработает

MaksVV
Offline
Зарегистрирован: 06.08.2015

попробуйте так. Библиотека dallas temperature тем более задерживает loop. 

Romikk
Offline
Зарегистрирован: 26.03.2021

Сейчас попробую бе3 библиотеки dallas

Romikk
Offline
Зарегистрирован: 26.03.2021

Тестовая работает хорошо, а вот в моей пишет -127

Romikk
Offline
Зарегистрирован: 26.03.2021

ua6em пишет:

Тестовая работала или работает?


Работает тестовая

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Romikk пишет:

Тестовая работает хорошо, а вот в моей пишет -127

А сделайте тестовую с 2 датчиками. Уверен - работать не будет.

Кстати в библиотеке:

#define DEVICE_DISCONNECTED_C -127