Белеберда с OneWire на ESP32

majemus
Offline
Зарегистрирован: 23.12.2019

Добрый день. Уже всю голову сломал, не знаю что делать дальше. Помогите. если кто знает в чем проблема:

Подключены датчики к 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;
    }		
	}

 

b707
Offline
Зарегистрирован: 26.05.2017

majemus - выложите весь код

majemus
Offline
Зарегистрирован: 23.12.2019
#include <Arduino.h>
#include <OneWire.h>
OneWire oneWire(4);
byte addr[8];

void setup(void) {   
  delay(3000);
  Serial.begin(115200);
  //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;
    }
  }  
}

void loop(){
}

 

b707
Offline
Зарегистрирован: 26.05.2017

что-то вы путаетесь в показаниях. В первом сообщении вы писали. что строчка oneWire.search(addr); помогает работе программы, а теперь в комментах все наоборот.

А может вы в обоих случаях ошибклись - и на самом деле используете какой-то третий вариант? - например, пишете вот так:


  oneWire.reset_search(); 
//oneWire.search(addr); //Если раскомментировать, то ненайдет ничего
  while (oneWire.search(addr)) {

 

majemus
Offline
Зарегистрирован: 23.12.2019

Извиняюсь. Торопился, когда скетч скидывал, он у меня многомодульный, пришлось накидать на чистом листе. Если строку РАСКОММЕНТИРОВАТЬ, то все ок работает, если ЗАКОММЕНТИРОВАТь (как написано в коде), то не работает.

//oneWire.search(addr); //Если ЗАКОММЕНТИРОВАТЬ, то не найдет ничего
oneWire.reset_search();
while (oneWire.search(addr)) {

Порядок первых 2х строк не принципиален, и так и так начинает работать, если присобачить этот костыль

b707
Offline
Зарегистрирован: 26.05.2017

majemus пишет:

если ЗАКОММЕНТИРОВАТь (как написано в коде), то не работает.

//oneWire.search(addr); //Если ЗАКОММЕНТИРОВАТЬ, то не найдет ничего
oneWire.reset_search();
while (oneWire.search(addr)) {

Порядок первых 2х строк не принципиален, и так и так начинает работать, если присобачить этот костыль

а если в этом кусочке обе первые строчки закомментировать (убрать)?

majemus
Offline
Зарегистрирован: 23.12.2019

Я не сам придумал такой порядок, на сайте разработчика так написано. Но попробовал убрать - результат отрицательный.

b707
Offline
Зарегистрирован: 26.05.2017

дайте ссылку на "сайт разработчика". где такое написано

majemus
Offline
Зарегистрирован: 23.12.2019
b707
Offline
Зарегистрирован: 26.05.2017

Вот взял пример по вашей ссылке. Покажите мне, где тут "так написано". что перед чтением шины надо давать хотя бы одну из этих команд?

#include <OneWire.h>

/* DS18S20 Temperature chip i/o */

OneWire  ds(10);  // on pin 10

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  if ( !ds.search(addr)) {
    Serial.print("No more addresses.\n");
    ds.reset_search();
    delay(250);
    return;
  }
.....// остальное поскипано

 

majemus
Offline
Зарегистрирован: 23.12.2019

я использую библиотеку dallastemperature.h, там в процедуре begin() в первую очередь идет ds.reset_search(); Да и в правила хорошего тона как бы говорят, что нужно указать перед поиском, что искать будем начиная с первого элемента. Ну да фиг с ним. Проблема не в том, есть или нету ds.reset_search();, проблема в том, что при первом ds.search(addr) возвращается null. При последующих же вызовах данной функции отрабатывается все правильно

b707
Offline
Зарегистрирован: 26.05.2017

majemus пишет:

проблема в том, что при первом ds.search(addr) возвращается null. При последующих же вызовах данной функции отрабатывается все правильно

да нет такой проблемы.

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

majemus
Offline
Зарегистрирован: 23.12.2019

Данный пример демонстрирует лишь работоспособность шины в моем случае, так как в цикле выводится:

1. No more addresses

2. Адрес 1 устройства

3. Адрес 2 устройства

4. No more addresses

5. Адрес 1 устройства

6. ..........................

 

На первом месте выводится No more addresses.

b707
Offline
Зарегистрирован: 26.05.2017

Ок, пусть так, значит для инициализации шины нужно выполнить один раз чтение адреса "вхолостую".

Не понимаю только, почему это для вас такая проблема, что "всю голову словмал, не знаю что делать, не могу двигаться дальше". Добавьте эту строчку в Сетап и забудьте об этом...

miks69
Offline
Зарегистрирован: 16.02.2020

Столкнулся с похожей проблемой, когда рабочий код для чтения датчиков по шине OneWire вдруг перестал работать. В результате выяснил, что такой эффект проявляется при неверном выборе Flash Mode и Flash Frequency в процессе заливки прошивки в Arduino IDE. Не очень понимаю какая взаимосвязь, но по факту как выяснилось это влияет на работу библиотеки OneWire и библиотеки WiFi, в частности методы WiFi.setHostname()/WiFi.getHostname() также перестают корректно работать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

miks69 пишет:

Столкнулся с похожей проблемой, когда рабочий код для чтения датчиков по шине OneWire вдруг перестал работать. В результате выяснил, что такой эффект проявляется при неверном выборе Flash Mode и Flash Frequency в процессе заливки прошивки в Arduino IDE. Не очень понимаю какая взаимосвязь, но по факту как выяснилось это влияет на работу библиотеки OneWire и библиотеки WiFi, в частности методы WiFi.setHostname()/WiFi.getHostname() также перестают корректно работать.

там же по умолчанию. всё правильно выставляется...