Белеберда с OneWire на ESP32
- Войдите на сайт для отправки комментариев
Пнд, 23/12/2019 - 10:42
Добрый день. Уже всю голову сломал, не знаю что делать дальше. Помогите. если кто знает в чем проблема:
Подключены датчики к OneWire порту. Все примитивно, никаких замудрений.
oneWire.reset_search(); while (oneWire.search(addr)) { Serial.print("R="); for(int i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if (oneWire.crc8(addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); // "CRC не корректен!\n") return; } if (addr[0] == 0x10) { Serial.print("Device is a DS18S20 family device.\n"); // "Устройство принадлежит семейству DS18S20.\n") } else if (addr[0] == 0x28) { Serial.print("Device is a DS18B20 family device.\n"); // "Устройство принадлежит семейству DS18B20.\n") } else { Serial.print("Device family is not recognized: 0x"); // "Семейство устройства не распознано.\n") Serial.println(addr[0],HEX); return; } }
В таком случае в цикл while не заходит и, соответственно, не находит ни одного датчика. Но стоит написать перед циклом oneWire.search(addr); все становится нормально
oneWire.search(addr); oneWire.reset_search(); while (oneWire.search(addr)) { Serial.print("R="); for(int i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if (oneWire.crc8(addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); // "CRC не корректен!\n") return; } if (addr[0] == 0x10) { Serial.print("Device is a DS18S20 family device.\n"); // "Устройство принадлежит семейству DS18S20.\n") } else if (addr[0] == 0x28) { Serial.print("Device is a DS18B20 family device.\n"); // "Устройство принадлежит семейству DS18B20.\n") } else { Serial.print("Device family is not recognized: 0x"); // "Семейство устройства не распознано.\n") Serial.println(addr[0],HEX); return; } }
majemus - выложите весь код
что-то вы путаетесь в показаниях. В первом сообщении вы писали. что строчка oneWire.search(addr); помогает работе программы, а теперь в комментах все наоборот.
А может вы в обоих случаях ошибклись - и на самом деле используете какой-то третий вариант? - например, пишете вот так:
Извиняюсь. Торопился, когда скетч скидывал, он у меня многомодульный, пришлось накидать на чистом листе. Если строку РАСКОММЕНТИРОВАТЬ, то все ок работает, если ЗАКОММЕНТИРОВАТь (как написано в коде), то не работает.
Порядок первых 2х строк не принципиален, и так и так начинает работать, если присобачить этот костыль
если ЗАКОММЕНТИРОВАТь (как написано в коде), то не работает.
Порядок первых 2х строк не принципиален, и так и так начинает работать, если присобачить этот костыль
а если в этом кусочке обе первые строчки закомментировать (убрать)?
Я не сам придумал такой порядок, на сайте разработчика так написано. Но попробовал убрать - результат отрицательный.
дайте ссылку на "сайт разработчика". где такое написано
https://www.pjrc.com/teensy/td_libs_OneWire.html
Вот взял пример по вашей ссылке. Покажите мне, где тут "так написано". что перед чтением шины надо давать хотя бы одну из этих команд?
я использую библиотеку dallastemperature.h, там в процедуре begin() в первую очередь идет ds.reset_search(); Да и в правила хорошего тона как бы говорят, что нужно указать перед поиском, что искать будем начиная с первого элемента. Ну да фиг с ним. Проблема не в том, есть или нету ds.reset_search();, проблема в том, что при первом ds.search(addr) возвращается null. При последующих же вызовах данной функции отрабатывается все правильно
проблема в том, что при первом ds.search(addr) возвращается null. При последующих же вызовах данной функции отрабатывается все правильно
да нет такой проблемы.
Возьмите да запустите пример из библиотеки, который я выше процитировал - он отлично возвращает адреса на шине
Данный пример демонстрирует лишь работоспособность шины в моем случае, так как в цикле выводится:
1. No more addresses
2. Адрес 1 устройства
3. Адрес 2 устройства
4. No more addresses
5. Адрес 1 устройства
6. ..........................
На первом месте выводится No more addresses.
Ок, пусть так, значит для инициализации шины нужно выполнить один раз чтение адреса "вхолостую".
Не понимаю только, почему это для вас такая проблема, что "всю голову словмал, не знаю что делать, не могу двигаться дальше". Добавьте эту строчку в Сетап и забудьте об этом...
Столкнулся с похожей проблемой, когда рабочий код для чтения датчиков по шине OneWire вдруг перестал работать. В результате выяснил, что такой эффект проявляется при неверном выборе Flash Mode и Flash Frequency в процессе заливки прошивки в Arduino IDE. Не очень понимаю какая взаимосвязь, но по факту как выяснилось это влияет на работу библиотеки OneWire и библиотеки WiFi, в частности методы WiFi.setHostname()/WiFi.getHostname() также перестают корректно работать.
Столкнулся с похожей проблемой, когда рабочий код для чтения датчиков по шине OneWire вдруг перестал работать. В результате выяснил, что такой эффект проявляется при неверном выборе Flash Mode и Flash Frequency в процессе заливки прошивки в Arduino IDE. Не очень понимаю какая взаимосвязь, но по факту как выяснилось это влияет на работу библиотеки OneWire и библиотеки WiFi, в частности методы WiFi.setHostname()/WiFi.getHostname() также перестают корректно работать.
там же по умолчанию. всё правильно выставляется...