Open LemanRus opened 1 month ago
you have chinese clone ds18 with too broken timings
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
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.
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
Привет! у меня такая же беда, попробовал код из последнего сообщения получил следующее: 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
@PiPusH это похоже на рабочий датчик. Но код весь вставь плиз, в послендем выводе не должно быть hex
I got:
90
1
55
5
7F
A5
81
66
4E
25
Every time the same.
I also tried another DS18B20 from the same seller:
90
1
55
5
7F
A5
A5
66
B4
25
давай по руцски, я знаю ты умеешь)
@LemanRus это корректный вывод, библиотека нормально опрашивает датчик
Умею)
Тогда странно, хотя вечером проверю ещё в железе. Вывод с первого датчика может и похож на корректный, но сам датчик сдох, ещё и МК мне попалил. Последний вывод одинаков был для нескольких датчиков, у первого отличается - может, он в агонии уже бился, в общем, проверю, отпишусь Но при этом с библиотекой DallasTemperature работали все...
ну на всякий случай вот ручное чтение можно еще проверить
#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(); // запрос следующего измерения
}
}
у меня в библиотеке тайминги почти такие же как у DallasTemperature, но чуть ближе к даташиту на датчик. Можно чуть подкорректировать, но нужно вот человека с кривым датчиком, который будет тестировать
Вот кастрированный минимальный фрагмент кода:
#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. Может в моём использовании библиотеки ошибка?
сначала нужно убедиться что работает пример из библиотеки
Пример из библиотеки работает на UNO, не работает на ESP32.
Есть предположение, что может не хватать 3.3 В питания (датчик на кабеле 3 м).
В первом сообщении написано что вообще ни на чём не работает
Вероятно, "повезло" с умирающим датчиком. На DallasTemperature выдавал данные, на GyverDS18 отказывался. Сейчас проверил два датчика - работают на UNO и отказываются на ESP32, правда, оба на кабеле.
В принципе, ишью можно закрывать, но могу потестить что-нибудь)
Ну нет, проблему надо решать. Что выдаёт код выше? Последний и предпоследний который я скидывал
Уточню - на всех платформах проверить?
Достаточно там где библиотека некорректно работает
На UNO в мониторе порта температура, на дисплее температура.
На ESP32 мой код даёт -999, пример с ручным чтением не выводит ничего.
Сейчас, чтобы с выводом не торопиться, поищу датчик без корпуса и отпишусь по результату.
Укоротил провод, взял резистор на 1 кОм вместо 4,7, проканало, с ESP32 на дисплее теперь тоже температура, в мониторе порта температура.
Странно что это повлияло, датчик потребляет очень мало, а по умолчанию паразитный включен. И всё же хотелось бы увидеть вывод с датчика, который не работает
Вот с него вывод до пробоя, был выше:
90
1
55
5
7F
A5
81
66
4E
25
Сейчас он при подключении питания греется и в выводе всё по нулям..)
У двух других датчиков той же партии вывод одинаковый:
90
1
55
5
7F
A5
A5
66
B4
25
это нормальный вывод, значит библиотека работает
Опробую свой полный код на рабочем датчике, на UNO, ATMega'х с внутренним тактированием, ESP32, ESP8266, LGT8F328P, и STM32F103 и отпишусь ещё)
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:
Output:
There is no any useful data with example "test", errors only too.