nodemcu 32s и ds18b20 помощь новичку
- Войдите на сайт для отправки комментариев
Чт, 04/01/2018 - 01:02
Добрый день!
Имеется плата 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
Кто знает. куда копать?
Я бы в питание сенсора копал.
Кто знает. куда копать?
В millis(), зачем так часто опрашивать датчик?
не, дело не в питании и не в задержке...
не, дело не в питании и не в задержке...
Тогда в ... Снегурочке.
По datasheet датчик обрабатывает запрос на получение температуры до 750 мс (в 12-битном режиме). Т.е, между запросом и считыванием температуры должна быть временная задержка хотя бы 750 миллисекунд (можно и больше, датчик хранит последнее полученное значение). Вы бомбардируете датчик бесконечными запросами в цикле и хотите, чтобы он нормально работал ...
Я согласен. С одной стороны - работающее WiFi может просадить питание датчику, с другой - он может начать выдавать чушь, если конверсия не завершена.
Впрочем, requestTemperatures() от DallasTemperature по дефолту выжидает до конца конверсии, поэтому, в данном случае, я склоняюсь к проблеме питания.
#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); }получаем
питание датчика от 3.3 и 5 в пробовал.................
Подтяжка линии данных к питанию на 4К7 у датчика есть?
использую это, думаю есть... на arduino mega проблем никаких не испытавал с этим датчиком
нашел такой скетч
#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", и что меняем изменив эти параметры
А google не работает? http://esp32.info/docs/esp_idf/html/dd/d3c/group__xTaskCreate.html
Я согласен. С одной стороны - работающее WiFi может просадить питание датчику, с другой - он может начать выдавать чушь, если конверсия не завершена.
Впрочем, requestTemperatures() от DallasTemperature по дефолту выжидает до конца конверсии, поэтому, в данном случае, я склоняюсь к проблеме питания.
Не, конверсии не боится, он вумный, у него для этого регистры разные, пока не закончит новые данные не появятся. Я бы усиленно рыл питание и подключение.