nodemcu 32s и ds18b20 помощь новичку

aleksandr777
Offline
Зарегистрирован: 04.01.2018

Добрый день!

Имеется плата nodemcu 32s, пытаюсь прикрутить к ней датчик температуры ds18b20.

Загружаю через arduino ide следующий скетч, все работает

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 14
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = { 
  0x28, 0xFF, 0x7A, 0xE3, 0x64, 0x15, 0x2, 0xCD };  // адрес датчика

void setup() {
  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
Serial.begin(115200);
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {

  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);

}
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50
Sensor1  23.50

Немного изменю скетч, добавляю подключение к wifi, к сети подключается, все хорошо, а вот с датчиком начинается беда:

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 14
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = { 
  0x28, 0xFF, 0x7A, 0xE3, 0x64, 0x15, 0x2, 0xCD };  // адрес датчика

#include <WiFi.h>
const char* ssid     = "*********;

void setup() {
  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid);   //, password);
 while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    
//    server.begin();
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {

  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);

}

Получаем 

WiFi connected.
IP address: 
192.168.1.39
Sensor1  23.25
Sensor1  23.25
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  23.25
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  23.25
Sensor1  23.25

Кто знает. куда копать?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы в питание сенсора копал.

alex_r61
Offline
Зарегистрирован: 20.06.2012

aleksandr777 пишет:

Кто знает. куда копать?

В millis(), зачем так часто опрашивать датчик?

aleksandr777
Offline
Зарегистрирован: 04.01.2018

не, дело не в питании и не в задержке...

alex_r61
Offline
Зарегистрирован: 20.06.2012

aleksandr777 пишет:

не, дело не в питании и не в задержке...

Тогда в ... Снегурочке.

ribald
Offline
Зарегистрирован: 12.11.2017

По datasheet датчик обрабатывает запрос на получение температуры до 750 мс (в 12-битном режиме). Т.е, между запросом и считыванием температуры должна быть временная задержка хотя бы 750 миллисекунд (можно и больше, датчик хранит последнее полученное значение). Вы бомбардируете датчик бесконечными запросами в цикле и хотите, чтобы он нормально работал ...

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Впрочем, requestTemperatures() от DallasTemperature по дефолту выжидает до конца конверсии, поэтому, в данном случае, я склоняюсь к проблеме питания.

aleksandr777
Offline
Зарегистрирован: 04.01.2018




#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 14
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = { 
  0x28, 0xFF, 0x7A, 0xE3, 0x64, 0x15, 0x2, 0xCD };  // адрес датчика

#include <WiFi.h>
const char* ssid     = "*************";

void setup() {
  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid);   //, password);
 while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    
//    server.begin();
}


void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {

  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);
delay(750);
}

получаем

Connecting to ******************
.
WiFi connected.
IP address: 
192.168.1.39
Sensor1  32.75
Sensor1  -127.00
Sensor1  32.75
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  -127.00
Sensor1  32.25

питание датчика от 3.3 и 5 в пробовал.................

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Подтяжка линии данных к питанию на 4К7 у датчика есть?

aleksandr777
Offline
Зарегистрирован: 04.01.2018

использую это, думаю есть... на arduino mega проблем никаких не испытавал с этим датчиком

aleksandr777
Offline
Зарегистрирован: 04.01.2018

нашел такой скетч

#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <OneWire.h>
#include<DallasTemperature.h> 
#define ONE_WIRE_BUS 15 
 
char auth[] = "***********************************"; //
const char* ssid = "***";
const char* pass = "************";

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

float temp;
float buff;


void setup() {
  
        Serial.begin(115200);
        Serial.println();
        Serial.println();
      
        DS18B20.begin();
        
        xTaskCreatePinnedToCore(WifiTask,"WifiTask ",4000,NULL,2,NULL,0); //Task for Core 0 priority set at 2
        // xTaskCreatePinnedToCore(####Task,"####Task ",4000,NULL,1,NULL,0); //Example of another task pinned to Core 0 at a lower priority

        xTaskCreatePinnedToCore(tempTask,"tempTask ",4000,NULL,5,NULL,1); //Task for Core 1 priority set at 5
        // xTaskCreatePinnedToCore(####Task,"####Task ",4000,NULL,1,NULL,1); //Example of another task pinned to Core 1 at a lower priority
}

void loop() {
  vTaskDelete( NULL );
  }

void tempTask( void * pvParameters )  //Task for reading Temperature on Core 1
{

  while(1){                           //Use whatever code you use to measure temperature
    DS18B20.requestTemperatures(); 
    buff = DS18B20.getTempCByIndex(0);
    if(buff!=-127.00){temp=buff;}
    Blynk.virtualWrite(V10, temp);
    vTaskDelay( 1000 / portTICK_PERIOD_MS);  //Delay for this task allows the core to do other tasks 
  }
}

void WifiTask( void * pvParameters )  //Wifi&Blynk tasks on Core 0
{ 
  WiFi.disconnect();                  //Code here runs once same as setup
  Blynk.begin(auth, ssid, pass);
  while (Blynk.connect() == false) {}

  while(1){                           //Code here runs continously same as loop
    Blynk.run();                       
    vTaskDelay( 500 / portTICK_PERIOD_MS);  //Little delay here is necessary
    }
}

с ним все работает, здесь распределены задачи по 2м ядрам, 1 ядро занимается wifi, 2е температурой, но не понятна следующая вещь:

 xTaskCreatePinnedToCore(WifiTask,"WifiTask ",4000,NULL,2,NULL,0); //Task for Core 0 priority set at 2
        // xTaskCreatePinnedToCore(####Task,"####Task ",4000,NULL,1,NULL,0); //Example of another task pinned to Core 0 at a lower priority

        xTaskCreatePinnedToCore(tempTask,"tempTask ",4000,NULL,5,NULL,1); //Task for Core 1 priority set at 5
        // xTaskCreatePinnedToCore(####Task,"####Task ",4000,NULL,1,NULL,1); //Example of another task pinned to Core 1 at a lower priority

что здесь обозначает "4000,NULL,2,NULL,0", и что меняем изменив эти параметры

nik182
Offline
Зарегистрирован: 04.05.2015
bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

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

Впрочем, requestTemperatures() от DallasTemperature по дефолту выжидает до конца конверсии, поэтому, в данном случае, я склоняюсь к проблеме питания.

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