Шум на датчике далласа db18b20

Тема в разделе "Arduino & Shields", создана пользователем 64detali, 20 янв 2021.

  1. parovoZZ

    parovoZZ Гуру

    А я ведь хотел такую сигу. Но здравый смысл возымел и купил сталкера.
     
  2. 64detali

    64detali Нерд

    Всем привет, проблему я решил так:
    1) ввел флаг, потому что delay нельзя использовать
    2) повесил электролит поближе к датчику на питание
    3) добавил проверку CRC
    Код (C++):
    #include <OneWire.h> // Инициализация библиотеки шины OneWire.
    byte addr[8]={0x28, 0xFF, 0x7C, 0x51, 0xC0, 0x17, 0x01, 0xDC}; // адрес датчика, необходимо ввести адрес своего датчика
    float Temp;
      byte j;
    unsigned long cur_ms = 0;  // переменная для вычисления отрезков времени температуры
    int getTemperature()
    {
       if (flag == 1) {
      flag = 0;
      ds.reset();
      ds.select(addr);
      ds.write(0x44,1);
      }
      if (millis() - cur_ms > 1000) //считаем температуру, через каждую секунду
    {
      cur_ms = millis(); // обнуляем отрезок времени
      ds.reset();
      ds.select(addr);   // опять выбираем этот датчк после сброса шины
      ds.write(0xBE);         // читаем Scratchpad
     
    byte data[9];
      for ( j = 0; j < 9; j++) {
        data[j] = ds.read();
         }
     
      if (OneWire::crc8(data, 8) != data[8]) {
         
          return;
      }
     
       int16_t raw = (data[1] << 8) | data[0];
       Temp = (float)raw / 16.0;
      flag = 1;
      display.setTextSize(2);
      display.setCursor(0,113);   // Устанавливаем курсор в левый верхний угол области вывода
      display.setTextColor(MAGENTA,BLACK);   // Определяем цвет вывода на дисплей
      display.print(Temp,1);
      }
     
    return Temp; // прекращение вычислений в функции, возвращение значения температуры
        }
    Сейчас думаю добавить медианный фильтр и как сделать так чтобы считывать температуру каждые 5 секунд, но при запуске эти 5 секунд не ждать.