• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Разные показания с ds18b20, bmp180 и вре11 :) у 8266-03 и 12e

Thorn

New member
Добрый денёк форумчане, понемногу осваиваю 8266 как класс :) и решил сделать термоконтролер для кусочек чтобы и обогревать и вентилировать и дверки открывать и всё получилось даже ... всё это реализую потихонечку на nodeMCU т.к. удобно быстро и штырьки сразу :) и вспомнил что с год полтора покупал мелкую 8266-03 такую и решил на остаток датчиков повесить её и уличную температурку смотреть. Сначала bmp080 долго вешал пока не понял что I2C надо прописывать в setup потом вре11 самый брехливый но тут понял что показания температуры с bmp и dht на 2..2,3градуса сильно, решил подключить ds18b20 чтоб точно до 0,06град и что выдумаете ситуация таже. Врет от 2 до 4 и более. Почему так решил - потмоу как на той-же 8266-12е расположенной рядом и одинаковым скетчиком показания разные. Скрин прилагаю.
Для долгой работы с 8266-03 от батарей прилепил deep.sleep и раз в минуту сюда DeepNet_chikenRoom - ThingSpeak IoT (тестовый канал пока)
Подскажите где беда кроется код одинаков - я даже пробовал тупо из примеров Dallasa брать и из Wire разницы нет. Скетчик который мелкий для уличного термобарометра могу выложить если нужно только у меня не со скетчиком видимо проблема а с одинаковым подходом к разным железкам.
И врёт именно 8266-03 собака.
 

Вложения

CodeNameHawk

Moderator
Команда форума
Реальный разброс у датчиков ds18b20 пару градусов (даже у датчиков с одной партии), да и точность не велика.
 

Thorn

New member
Реальный разброс у датчиков ds18b20 пару градусов (даже у датчиков с одной партии), да и точность не велика.
Эх еслибы это было так в моем случае я бы нестал обращаться на столь уважаемый форум :).
Ранее оба эти далласа были в проекте т включены для отладки прямо в один а один. Потом один вынул и в другое проект (потмоу на скрине и видны показания температур по адресам с ошибкой 4095 - то отсутствующий временно) - и показания были в пределах именно 0,06 град.
На всякий случай скетчик для выносного датчика с глубоким сном...
Код:
#include <Wire.h>                     //Подключаем библиотеку для использования I2C 
#include <ESP8266WiFi.h>
#include <OneWire.h>                  //Подключаем библиотеку для температурного датчика DS18B20
#include <Adafruit_BMP085.h>          //Подключаем библиотеку для маленького барометра (темп., абс.высота и атм.давление)
#include <DHT.h>                      //Use just if use real sensor not for random

//=====Termo_Sensor ds18b20*
int tempPin=12;                      //Определяем порт шины OneWire (IC) для температурного датчика DS18B20, Gpio12
OneWire ds(tempPin);                 //Создаем объект для работы с термометром
//byte flagDallas=0;                  //Флаг для обработки показаний с датчиков Dallas
byte data[12];
byte addr1[8]={0x28,0xFF,0x9C,0x20,0x54,0x14,0x01,0xC2};   //адрес датчика DS18B20_уличного
unsigned int raw;                   //Если экранированный кабель, можно подключать до 32 термо-датчиков DS18B20
float temp;                         //Температура на уличке с точностью 0,06 градС
//=====Pressure*
Adafruit_BMP085 bmp;
float pres,tempB;

//=====Humidity*
#define DHTTYPE DHT11
#define DHTPIN  14                    //Gpio14
DHT dht(DHTPIN, DHTTYPE, 11);         //Initialize DHT sensor, 11 works fine for ESP8266
float hmdt,tempC;        

const char* ssid="***";
const char* password="***";

IPAddress device_ip   (10,32,10,33);
IPAddress dns_ip      (8,8,8,8);
IPAddress gateway_ip  (10,32,10,3);
IPAddress subnet_mask (255,255,255,0);
//byte arduino_mac[]={0xDE,0xED,0xBA,0xFE,0xFE,0xED};   //8266-03_deepnet 18:FE:34:9C:4E:BD
//long rssi=WiFi.RSSI();                //Wi-Fi signal strength (RSSI), мощность сигнала

WiFiClient client;
String apiKey="***";     //ThingSpeak API key, DeepNet_street
const char* serverTS="api.thingspeak.com"; 
   
//=====Delays*
const int sleepTimeS=20;              //Время перехода в "глубокий сон", Секунд....

//=====Wi-Fi setup*
void setup(){
  Wire.begin(13,2);                                  //13 as SDA and 2 as SCL
  bmp.begin();                                       //Initialize Pressure sensor
  dht.begin();                                       //Initialize Humidity sensor
//  Serial.begin(115200);                               //Serial connection from ESP-01 via 3.3v console cable
    delay(10);
  WiFi.begin(ssid, password);                        //Connect to WiFi network
  WiFi.config(device_ip, gateway_ip, subnet_mask);   //Setup WiFi network
//    Serial.print("\n\r \n\rWorking to connect");
      while (WiFi.status() != WL_CONNECTED){         // Wait for connection
        delay(500);}
//          Serial.print(".");}
//  Serial.println("");
//  Serial.println("esp8266-03");
//  Serial.print("Connected to: ");
//  Serial.println(ssid);
//  Serial.print("IP address: ");
//  Serial.println(WiFi.localIP());
//  Serial.print("signal strength (RSSI):");
//  Serial.print(rssi);
//  Serial.println(" dBm");
//    Serial.print("MAC address: ");
//    Serial.println(WiFi.macAddress());
}

//=========== Считывание температур
void dallas(){
  ds.reset();
  ds.write(0xCC);                                          //Команда инициации
  ds.write(0x44);                                          //Start conversion, with parasite power on at the end
//  ds.write(0xCC);
//  ds.write(0x4E);
//  ds.write(0x7F); // верх и низ для аварийных температур
//  ds.write(0xFF);
//  ds.write(0x60);
//  ds.write(0x48);
}

//=========== Обработка температур
void tempDallas(){
    temp=DS18B20(addr1);
//    Serial.print("tempDs: ");
//    Serial.println(temp);
//    Serial.println("***");
}

float DS18B20(byte*adres){
  ds.reset();
  ds.select(adres);
  ds.write(0xBE);                                   //Read Scratchpad
  for (byte i=0;i<12;i++)data[i]=ds.read();         //We need 9 bytes (разрядность)
  int raw=(data[1]<<8)|data[0];                     //Переводим в температуру
  float celsius=(float)raw/16.0;                    //Для ds18b20 делим на "16", для ds18s20 на "2"
  return celsius;
}

//========== Считывание Влажности воздуха
void hmdtDht(){                       //Reads the temp and humidity from the DHT sensor and sets the global variables for both
  hmdt = (dht.readHumidity()+13);          //Read humidity (percent)
  tempC = (dht.readTemperature(false)-6); // Read temperature as Fahrenheit\Celsius (true)
//  Serial.print("tempDht: ");
//  Serial.println(tempC);
//  Serial.print("hmdtDht: ");
//  Serial.println(hmdt); 
//  Serial.println("...");
}

//========== Считывание Давления
void bar(){
  tempB=bmp.readTemperature();                          //-0.5 для bmp180 3.3v
  pres=(bmp.readPressure()/133.3);
//  alt=bmp.readAltitude();
//  bmp.readSealevelPressure();
//  bmp.readAltitude(101500);
//  Serial.print("tempBmp: ");
//  Serial.println(tempB);
//  Serial.print("presBmp: ");
//  Serial.println(pres);
//  Serial.print("Alt: ");
//  Serial.println(alt);
//  Serial.println("+++");
}

//========== Проверяем интервал для отправки в ThingSpeak
void thingspeak(){
  dallas();
  tempDallas();
  bar();
  hmdtDht();
  if (client.connect(serverTS,80)){                    //Dns "184.106.153.149" or api.thingspeak.com:"80" or port
    String postStr = apiKey;
    postStr +="&field1=";
    postStr += String(tempB);
    postStr +="&field2=";
    postStr += String(hmdt);
    postStr +="&field3=";
    postStr += String(pres);
    postStr +="&field4=";
    postStr += String(WiFi.RSSI());
    postStr += "\r\n\r\n";
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(postStr.length());
    client.print("\n\n");
    client.print(postStr);
//  Serial.println("Parametrs send to ThingSpeak");   
  }
  client.stop();
//  Serial.println ("Closing WiFi connection...");
  WiFi.disconnect();
    delay(100);
//  Serial.print ("Entering deep sleep mode for... ");
//  Serial.println (sleepTimeS);                              //mode - WAKE_RF_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, WAKE_RF_DISABLED
  ESP.deepSleep(sleepTimeS * 1000000, WAKE_RF_DEFAULT);     //Переходим в DeepSleep, (WAKE_NO_RFCAL);
    delay(400);                                             //Wait for deep sleep to happen
}

void loop(){
  thingspeak();
}
 

Thorn

New member
Мне больше нужен совет почему так.... а не какая точность. зачем и прочее. Про код молчу - он мен устраивает и коненчое покажется излишне ёмким, работает главное
 

CodeNameHawk

Moderator
Команда форума
Считав температуру н.п. 10 раз подряд, какие получаете показания?
 

Thorn

New member
Первое чт осмущает... это дискретность 0,1град (должна быть 0,06). Второе что завышено более чем на 4 град именно по ds18b20
tempDs: 29.50
tempDs: 29.40
tempDs: 29.50
tempDs: 29.60
tempDs: 29.70
tempDs: 29.80
tempDs: 29.90
tempDs: 30.00
tempDs: 30.00
tempDs: 29.90
tempDs: 29.70
Третье, температура bmp180 также завышена но не боле чем на 2 град.
Самое смешное что температура dht11 в этом сэндвиче самая близкая несмотря на погрешность . Тоетсь в комнате по эталонному должно быть не более 25,06.....25,24 а по врущему далласу на 8266-03 она аж почти 30 град. У bmp180 около 28,2 и у dht11 около 24 град.....
 

Thorn

New member
Сейчас пошел на крайние меры, выпаял из готовой сборки 8266-03 даллас, воткнул его в node 8266-12e и чуда не рпоизошло - дискретность у далласа осталась 0,1 а это значит сам датчик с "говнецом" но темпратура его равна "эталонной" тоесть 26град (при эталонном 25,37град)
 

Thorn

New member
В общем поменял местами bmp180 и толку ноль, на 8266-03 как было завышение так и осталось хоть убейся что по ds18 что по bmp180 - не может это быть по причине низкого питания самих датчиков именно по темпирартурным их измерениям? В случае с node 8266-12e 5в а на 8266-03 само собой 3,3в- другого объяснения ну кроме каких нить таймеров\прерываний при обработке датчиков у меня нет
 

CodeNameHawk

Moderator
Команда форума
tempC = (dht.readTemperature(false)-6); // Read temperature as Fahrenheit\Celsius (true)
И что это за цифра 6?

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

Thorn

New member
И что это за цифра 6?.
о это временный хитрый способ "подогнать" показания этого чудо брехуна по показаниям близким к правдивым. Когда купил штуки три, все давали разные в пределах 12% и 7-8град показания, был dht22 тогда рабочий - во по нему и определял на сколько врёт каждый, этот как раз на 6 град завышает.
 

Thorn

New member
Питаю от линейного пока при отладке. Но к батарее точнее двум ААА подключал ничего не меняется. Завышает собака и всё тут, поверьте много прошло через меня всяких ардуинок и ds но чтобы так нагло не было ни разу
 

Вложения

Thorn

New member
Упс..... ну да, а что может быть такого то? эмм я правда не понимаю ....
 

Thorn

New member
Вот, запитал от почти разряженной li-ion с 3,7v а cp2104 для монитора Serial.print подключено, то есть питание от батареи 100%. И да я имел ввиду питание самих датчиков а не 8266-03 модуля. Может им именно маловато 3,3v хотя встречал проекты где работают до 2,0v включительно.
 

Вложения

CodeNameHawk

Moderator
Команда форума
Датчик температуры DS18B20. Описание на русском языке. | Оборудование, технологии, разработки
Однако когда DS18B20 выполняет операцию преобразования температуры или копирования данных памяти в EEPROM, потребляемый ток может достигать величины 1,5 мА. Такой ток может вызвать снижение напряжения питания устройства до недопустимого значения. Тока подтягивающего резистора и энергии, запасенной на Cpp, не достаточно для питания в этих двух режимах. Для того чтобы гарантировать достаточное питание устройства, необходимо обеспечить мощную подтяжку шины к высокому уровню в то время, когда происходит преобразование температуры или копирование данных памяти в EEPROM. Это можно сделать с помощью MOSFET транзистора, как показано на схеме (рисунок 4). Шина данных должна быть подключена к мощному питанию:

Подключение датчика температуры DS18B20 к микроконтроллеру
ds18 b20 работа от внешнего питания - „Google“ paieška
 

Thorn

New member
Про подтягивающий в курсе, сразу паяю ели на линии один или несколько. Вот именно сейчас установленный с smd резистором на 4,7Ком. Точно такойже впаян и в dht11
 

Вложения

Сверху Снизу