Вывод данных , ds18b20 , lcd1602 , yl-69, dht11

Добрый день, не могли бы вы мне помочь? У меня есть код, но данные с датчиков неверны. Может быть, есть какие-то ошибки, вы могли бы их исправить?

Я прошу прощения за свое неточное заявление. Передо мной стоит задача вывести на экран данные с трех датчиков. Я написал скетч, но он работает неправильно. То есть данные с двух датчиков (ds18b20, yl-69) отображаются некорректно. Я думаю, что проблема в скетче. Данные с датчика ds18b20 постоянно отображаются по-разному и частично зависят от данных с датчика yl-69, хотя это и не должно быть так. Все датчики должны работать отдельно друг от друга, но передавать свои данные на arduino

#include <DallasTemperature.h>

#include <OneWire.h>
#include <DS18B20.h>

#include <Wire.h>                          
#include <LiquidCrystal_I2C.h>              
        
#include <DHT.h>    

const uint8_t ds1Pin{7};            // DS18b20 будем подключать к пину D7
const uint32_t msRepTime {10000};   // DS18b20 будем опрашивать каждые 10 секунд (по факту каждые 11)
uint32_t msTemp {msRepTime};        // Объявляем счетчик для опроса DS18b20 и инициализируем его значением для моментального начала процедуры
const uint8_t simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000}; 
uint8_t ds1Qty {1};                 // Количество датчиков DS18b20 на пине (не более 3-х). Если больше одного, значения будут усредняться 
int8_t  ds1Temp {0};                // Собственно, значение температуры по Цельсию от DS18b20
uint8_t ds1DS[3][8];                // Адреса положу пока здесь. Если кому не лень, их нужно убрать из глобальной ОВ, как и количество датчиков

const uint8_t DHTPin{8};            // DHT будем подключать к пину D8
float dhtTemp {0};                  // DHT значение температуры
float dhtHum {0};                   // DHT значение влажности
const uint32_t msDhtTime {5017};    // DHT будем опрашивать каждые 5+ секунд. "Кривое" значение, чтобы не пересекаться по времени с опросом DS
uint32_t msDht {msDhtTime};         // Объявляем счетчик для опроса DHT и инициализируем его значением для моментального начала процедуры

const uint8_t ylPin{14};            // YL будем подключать к пину A0(14). ВНИМАНИЕ: подключение аналогового выхода датчика!
uint16_t ylVal{0};                  // Переменная для показаний датчика влажности YL
const uint32_t msYlTime {100};      // YL будем опрашивать каждые 0.1 секунд, чтобы МК хоть чем-то был занят в цикле))
uint32_t msYl {0};                  // Объявляем счетчик для опроса YL-69

const uint32_t msPageExpo {5000};   // Устанавливаем по 5 секунд на отображение каждой страницы
uint32_t msPage {0};                // Объявили счетчик для экрана 


LiquidCrystal_I2C lcd(0x27, 16, 2);           
DHT dht(DHTPin, DHT11);
OneWire oneWire(DS18B20);




void setup() {
  Serial.begin(9600);     // Скорость должна соответствовать настройкам монитора порта 
  lcd.init();               
  lcd.backlight();
  dht.begin();
  searchSensors();          // Запускаем первоначальный поиск датчиков DS18b20 на пине
}

void loop() {
  
  if (millis() - msTemp > msRepTime)  updateTemp();       // Опрашиваем температуру DS18b20 с частотой msRepTime
  if (millis() - msDht > msDhtTime)   runDht();           // Опрашиваем DHT
  if (millis() - msYl > msYlTime)     runYl();            // Опрашиваем YL-69
  if (millis() - msPage > msPageExpo) updatePage();       // Листаем страницы
  
}





//**************  Секция экранчег  ****************************
void updatePage(){                       // Листаем страницы на экранчике
  static uint8_t page {0};              
//  Первая страница
  if (page == 0){
    lcd.setCursor(0,0);
    lcd.print("temp water:    ");
    lcd.setCursor(0,1);
    lcd.print((int8_t)ds1Temp);
    lcd.setCursor(3,1);
    lcd.print("C   ");
    msPage = millis(); 
    page++; 
    return;
  }
//  Вторая страница
  if (page == 1){
    lcd.setCursor(0,0);
    lcd.print("temp air:         ");
    lcd.setCursor(0,1);
    lcd.print((int8_t)dhtTemp);
    lcd.setCursor(2,1);
    lcd.print("C   ");    
    msPage = millis(); 
    page++; 
    return;
  }
//  Третья страница
  if (page == 2){
    lcd.setCursor(0,0);
    lcd.print("hum air:         ");
    lcd.setCursor(0,1);
    lcd.print((uint8_t)dhtHum);
    lcd.setCursor(2,1);
    lcd.print("%   ");    
    msPage = millis(); 
    page++; 
    return;
  }
// Последняя страница
  if (page == 3){  
    lcd.setCursor(0,0);
    lcd.print("hum earth:         ");
    lcd.setCursor(0,1);
    lcd.print((uint16_t)ylVal);
    lcd.setCursor(3,1);
    lcd.print("%   ");      
    msPage = millis(); 
    page = 0; 
    return;
  }
}


//**************  Секция YL-69  ****************************
void runYl(void){
  ylVal = analogRead(ylPin);; //Измеряем влажность. Маппинг пишем сами, если надо
  msYl = millis();
}


//**************  Секция DHT  ****************************
void runDht(void){
  dhtHum = dht.readHumidity();          //Измеряем влажность
  dhtTemp = dht.readTemperature();      //Измеряем температуру
  msDht = millis();
}

//**************  Секция DS18b20  ****************************
void updateTemp(){                       // Основная процедура обновления температурных данных со всех датчиков
  static uint8_t stage {0};
//  Первый этап. Отправка запросов на конвертацию 
  if (stage == 0){
    if (ds1Qty) requestSensor(ds1Pin);
    stage++; 
    msTemp = millis() - msRepTime + 800;    // 0.75 секунды требуется датчику для осуществления конвертации на максимальном разрешении
    return;
  }
// Второй этап. Чтение показаний  
  if (stage == 1){  
    if (ds1Qty) readSensor(&ds1Temp, ds1Pin, ds1DS, ds1Qty);
    msTemp = millis(); 
    stage = 0; 
    return;
  }
}

void readSensor(int8_t* t, uint8_t pin, void* buf, uint8_t qt){       // Чтение температуры с датчика ds18b20
  OneWire ds(pin);
  uint8_t addr[8];
  uint8_t data[9];
  float temp[3];
  uint8_t qty {0};
  for (uint8_t c {0}; c < qt; c++){
    for(uint8_t i {0}; i<8 ;i++) addr[i] = *((uint8_t*)buf+c*8+i);
    ds.reset(); ds.select(addr); ds.write(0xBE); 
    for (uint8_t d {0}; d<9; d++) data[d] = ds.read();    
    int16_t raw = (data[1] << 8) | data[0];
    raw = raw & ~1;
    temp[qty++] = raw / 16.0;  
  }
  float tmp {0};
  for (uint8_t i {0}; i<qty; i++) tmp+= temp[i];
  *t = round(tmp/qty);
  Serial.print("Температура пин "); Serial.print(pin); Serial.print(" : "); Serial.println(*t);
}

void requestSensor(uint8_t pin){          // Отправка запроса на конвертацию ds18b20
  OneWire ds(pin);
  ds.reset();
  ds.skip();
  ds.write(0x44,0);
}

void searchSensors(){                          // Поиск датчиков на всех линиях
  ds1Qty =   src(ds1DS, ds1Pin);
}

uint8_t src(void * adr, uint8_t pin){      // Вспомогательная функция для поиска на одной шине. Возвращает количество найденных датчиков
  if (pin == 0) return 0;
  OneWire ds(pin);
  uint8_t newAddr[8]{0};
  uint8_t count {0};
  ds.reset_search();
  delay(5);
  while (ds.search(newAddr) && count <3){
    if (ds.crc8(newAddr, 7) == newAddr[7]){
       for (uint8_t i{0}; i<8; i++) *((uint8_t*)adr + count * 8 + i) = newAddr[i];
       count++;
    }
  }
  return count;
}

, 👍1

Обсуждение

Выдает ли компилятор вам какие-либо ошибки? Тогда вам абсолютно необходимо включить их в свой вопрос. Или код неожиданно изменился? Затем вам нужно описать, чего вы ожидали и как на самом деле ведет себя код. Я действительно не хочу читать длинный код и искать ошибки, которые могут там быть, а могут и не быть. Пожалуйста, проверьте себя, а затем вы можете предоставить нам необходимую информацию, чтобы мы могли вам помочь, @chrisl

Пожалуйста, разделите свою программу на небольшие части и протестируйте их по отдельности. Если вы выяснили, какая часть не работает так, как предусмотрено, я с удовольствием помогу в этой небольшой части. Также, пожалуйста, прочтите: https://arduino.stackexchange.com/help/how-to-ask, @Kerbolosh

откуда вы знаете, что данные с датчиков неверны? ... что вы ожидаете увидеть? ... что ты видишь? .... какие датчики затронуты? .... как подключены датчики? .... **пожалуйста, добавьте всю информацию к вашему вопросу** ... `не оставляйте комментариев", @jsotola