GyverLibs / GyverDS18

Лёгкая библиотека для термометров Dallas DS18b20, обновлённая и более удобная версия библиотеки microDS18B20
MIT License
3 stars 1 forks source link

No any data from DS18B20 #2

Open LemanRus opened 1 month ago

LemanRus commented 1 month ago

Arduino IDE 2.3.2 GyverDS18 1.1.1 GyverIO 1.3.1

mega328p (not working also with original Uno, chinese Nano and Blue Pill), chinese DS18B20. It works fine with lib DallasTemperature.

Minimal code:

#include <GyverDS18.h>
GyverDS18Single ds(2);  // пин

void setup() {
    Serial.begin(115200);
    ds.requestTemp();  // первый запрос на измерение
}
void loop() {
    if (ds.ready()) {         // измерения готовы по таймеру
        if (ds.readTemp()) {  // если чтение успешно
            Serial.print("temp: ");
            Serial.println(ds.getTemp());
        } else {
            Serial.println("error");
        }

        ds.requestTemp();  // запрос следующего измерения
    }
}

Output:

error
error
error
error

There is no any useful data with example "test", errors only too.

GyverLibs commented 1 month ago

you have chinese clone ds18 with too broken timings

GyverLibs commented 1 month ago

try this

#include <GyverDS18.h>

class WireTest : public GyverOneWire {
    public:
    WireTest(uint8_t pin) {
        setPin(pin);
    }
    bool reset() {
        return GyverOneWire::reset();
    }
};

void setup() {
    Serial.begin(115200);
    WireTest wire(2);
    Serial.println(wire.reset());
}

should result 1

LemanRus commented 1 month ago

I tried:

#include <GyverDS18.h>

class WireTest : public GyverOneWire {
    public:
    WireTest(uint8_t pin) {
        setPin(pin);
    }
    bool reset() {
        return GyverOneWire::reset();
    }
};

void setup() {
    Serial.begin(115200);
    WireTest wire(3);
    Serial.println(wire.reset());
}

void loop(){}

And yep, it printed 1.

GyverLibs commented 1 month ago

ok, lets try this

#include <GyverDS18.h>

class WireTest : public GyverOneWire {
   public:
    WireTest(uint8_t pin) {
        setPin(pin);
    }
    void test() {
        Serial.println(reset());
        write(DS18_ADDR_SKIP);
        write(DS18_READ_RAM);
        uint8_t buf[9];
        for (uint8_t i = 0; i < 9; i++) {
            buf[i] = read();
        }
        for (uint8_t i = 0; i < 9; i++) {
            Serial.println(buf[i], HEX);
        }
        Serial.println();
        Serial.println((buf[0] | (buf[1] << 8)) >> 4);
    }
};

void setup() {
    Serial.begin(115200);

    WireTest wire(2);
    wire.test();
}

and show me output

PiPusH commented 1 month ago

Привет! у меня такая же беда, попробовал код из последнего сообщения получил следующее: 19:49:40.367 --> 19:49:40.367 --> 0 19:49:40.367 --> 0 19:49:40.367 --> 0 19:49:40.367 --> 55 19:49:40.367 --> 5 19:49:40.367 --> 7F 19:49:40.367 --> A5 19:49:40.367 --> A5 19:49:40.367 --> 66 19:49:40.367 --> 4F

GyverLibs commented 1 month ago

@PiPusH это похоже на рабочий датчик. Но код весь вставь плиз, в послендем выводе не должно быть hex

LemanRus commented 1 month ago

I got:

90
1
55
5
7F
A5
81
66
4E

25

Every time the same.

LemanRus commented 1 month ago

I also tried another DS18B20 from the same seller:

90
1
55
5
7F
A5
A5
66
B4

25
GyverLibs commented 1 month ago

давай по руцски, я знаю ты умеешь)

GyverLibs commented 1 month ago

@LemanRus это корректный вывод, библиотека нормально опрашивает датчик

LemanRus commented 1 month ago

Умею)

Тогда странно, хотя вечером проверю ещё в железе. Вывод с первого датчика может и похож на корректный, но сам датчик сдох, ещё и МК мне попалил. Последний вывод одинаков был для нескольких датчиков, у первого отличается - может, он в агонии уже бился, в общем, проверю, отпишусь Но при этом с библиотекой DallasTemperature работали все...

GyverLibs commented 1 month ago

ну на всякий случай вот ручное чтение можно еще проверить

#include <GyverDS18.h>
GyverDS18Single ds(2);  // пин

void setup() {
    Serial.begin(115200);
    ds.requestTemp();  // первый запрос на измерение
}
void loop() {
    if (ds.ready()) {
        uint8_t buf[5];
        if (ds.readRAM(buf)) {
            Serial.println(gds::calcTemp(buf) / 16.0);
        } else {
            Serial.println("error");
        }
        ds.requestTemp();  // запрос следующего измерения
    }
}
GyverLibs commented 1 month ago

у меня в библиотеке тайминги почти такие же как у DallasTemperature, но чуть ближе к даташиту на датчик. Можно чуть подкорректировать, но нужно вот человека с кривым датчиком, который будет тестировать

LemanRus commented 1 month ago

Вот кастрированный минимальный фрагмент кода:

#include <GyverDS18.h>
#include <GyverOLED.h>

#define tempInterval 5000  // Интервал выполнения функции get_temp в миллисекундах

GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;  // Объект OLED дисплея

GyverDS18Single sensor(3);

uint16_t tempPreviousMillis = 0;  // Время последнего вызова функции give_power

int temp = -999;  // Текущая температура с датчика

void setup() {
  sensor.requestTemp();  // Запрос на измерение температуры

  // Инициализация дисплея OLED
  oled.init();
  oled.setScale(1);  // Установка масштаба 1 (нормальный размер текста)
  oled.clear();

  // Отображение "Темп-ра"
  oled.setCursor(0, 2);  // Вторая строка, левый край
  oled.print(F("Темп-ра"));
  oled.update();
}

void loop() {
  if ((uint16_t)millis() - tempPreviousMillis >= tempInterval) {
    tempPreviousMillis = (uint16_t)millis();
    oled.setCursor(64, 2);   // Вторая строка, правый край
    oled.print(get_temp());  // Отображение нового значения
    oled.update();
  }
}

// Функция получения температуры с датчика
int get_temp() {
  if (sensor.ready()) {       // измерения готовы по таймеру
    if (sensor.readTemp()) {  // если чтение успешно
      temp = sensor.getTemp();
    } else {
      temp = -999;
    }
    sensor.requestTemp();  // запрос следующего измерения
  }
  return temp;  // Возвращение текущей температуры
}

Я упорно получаю -999. Может в моём использовании библиотеки ошибка?

GyverLibs commented 1 month ago

сначала нужно убедиться что работает пример из библиотеки

LemanRus commented 1 month ago

Пример из библиотеки работает на UNO, не работает на ESP32.

Есть предположение, что может не хватать 3.3 В питания (датчик на кабеле 3 м).

GyverLibs commented 1 month ago

В первом сообщении написано что вообще ни на чём не работает

LemanRus commented 1 month ago

Вероятно, "повезло" с умирающим датчиком. На DallasTemperature выдавал данные, на GyverDS18 отказывался. Сейчас проверил два датчика - работают на UNO и отказываются на ESP32, правда, оба на кабеле.

В принципе, ишью можно закрывать, но могу потестить что-нибудь)

GyverLibs commented 1 month ago

Ну нет, проблему надо решать. Что выдаёт код выше? Последний и предпоследний который я скидывал

LemanRus commented 1 month ago

Уточню - на всех платформах проверить?

GyverLibs commented 1 month ago

Достаточно там где библиотека некорректно работает

LemanRus commented 1 month ago

На UNO в мониторе порта температура, на дисплее температура.

На ESP32 мой код даёт -999, пример с ручным чтением не выводит ничего.

Сейчас, чтобы с выводом не торопиться, поищу датчик без корпуса и отпишусь по результату.

LemanRus commented 1 month ago

Укоротил провод, взял резистор на 1 кОм вместо 4,7, проканало, с ESP32 на дисплее теперь тоже температура, в мониторе порта температура.

GyverLibs commented 1 month ago

Странно что это повлияло, датчик потребляет очень мало, а по умолчанию паразитный включен. И всё же хотелось бы увидеть вывод с датчика, который не работает

LemanRus commented 1 month ago

Вот с него вывод до пробоя, был выше:

90
1
55
5
7F
A5
81
66
4E

25

Сейчас он при подключении питания греется и в выводе всё по нулям..)

У двух других датчиков той же партии вывод одинаковый:

90
1
55
5
7F
A5
A5
66
B4

25
GyverLibs commented 1 month ago

это нормальный вывод, значит библиотека работает

LemanRus commented 1 month ago

Опробую свой полный код на рабочем датчике, на UNO, ATMega'х с внутренним тактированием, ESP32, ESP8266, LGT8F328P, и STM32F103 и отпишусь ещё)