Offline
Зарегистрирован: 11.03.2014
Всем привет,
нужна помощь. Собрал простенькую схему — Arduino UNO, 3 датчика DS18b20 (один водонепронецаемый). Подключил, как подказано на схеме.
Простой скетч:
#include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup(void){ Serial.begin(9600); sensors.begin(); } void loop(void){ sensors.requestTemperatures(); Serial.print("T0="); Serial.println(sensors.getTempCByIndex(0)); delay(200); Serial.print("T1="); Serial.println(sensors.getTempCByIndex(1)); delay(200); Serial.print("T2="); Serial.println(sensors.getTempCByIndex(2)); }
Залил на Ардуино, открыл монитор, все работает, 3 температуры отображаются. Для теста один из датчиков (водонепронецаемый, который потом будет висеть на улице) засунул в морозилку. Температура начала падать, перешла в минус, но когда дошла до -15,75 произошел какой-то глюк. Следующее значение температуры датчик показал -127.00. Остальные два датчика продолжали отображать комнатную температуру. Когда вытащил датчик из морозилки, температура начала повышаться и он снова начал показывать нормальное значение -15.75, -13,26 и т.д.
От сюда возникает вопрос — что за напасть? Почему датчик тупит, когда температура становится ниже минус 16 градусов?
-
#1
И снова доброго дня.
Есть мерялка термпературы воды на крыше в бойлере.
Длиииииинный провод метров на 15, 3х0.34.
Ещё до интеграции в дом на столе показывает температуру, реагирует, потом отвалился и стал показывать -127 — то есть отключился. Потом снова включился.
Тут много спорных моментов, на которые закрыл глаза, ибо вроде работает. Длинный провод, не экранированный, в коммуникационной шахте, работает от 5 вольт (соответсвенно и возвращает как бы 5 вольт), потому что это ESP-15F — нету там ног для 3.3В, а платки есть.
В целом меня это не сильно парит, скорее чисто эстетические претензии. Но вдруг, есть более элегантное решение, чем заменять значение предыдущим стоящим например.
Или действительно где-то есть баг, который на стенде работает, а дома нет.
Код прикладываю
Код:
#include <AsyncElegantOTA.h>
#include <elegantWebpage.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <LittleFS.h>
#define WIFI_SSID "Mi MIX 2S"
#define WIFI_PASSWORD "987654321"
//#define WIFI_SSID "Gosha_SmartHome"
//#define WIFI_PASSWORD "MySmartHome"
const long utcOffsetInSeconds = 7200; // Define NTP Client to get time
WiFiEventHandler wifiConnectHandler, wifiDisconnectHandler;//, stationConnectedHandler;
const int oneWireBus = 4; //I04// GPIO where the DS18B20 is connected to
OneWire oneWire(oneWireBus); // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature sensor
DeviceAddress tempDeviceAddress;
float Temp_val; // переменная температуы
byte addr[8];
byte flagDallRead;
byte data[12]; //для температуры
int resolution = 10;
unsigned long lastTempRequest = 0;
int delayInMillis = 0;
float temperature = 0.0;
int idle = 0;
unsigned long previousMillis = 0; // will store last time LED was updated
unsigned long previous_timer = 0; //Timer_delay_storage
uint32_t currentTime, loopTime, previous_serial, prevTime_temp, start_Time;
float temperature_C;
String temperatureC_string = "";
unsigned long currentMillis;
AsyncWebServer server(80);
//-----------------------------------------------------------------------
//// Replaces placeholder with button section in your web page
String processor(const String& var){
if(var == "TEMPERATUREC"){ // Replaces placeholder with DS18B20 values
return temperatureC_string;
}
return String();
}
void WIFI_connect()
{
WiFi.mode(WIFI_STA);
wifi_station_set_hostname("Boiler_temp");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("Connecting to AP");
}
void onWifiConnect(const WiFiEventStationModeGotIP& event) {
Serial.println("Connected to Wi-Fi sucessfully.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("RRSI: "); Serial.println(WiFi.RSSI());
Serial.print("Hostname - "); Serial.println(WiFi.hostname());
}
void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
Serial.println("Disconnected from Wi-Fi");
WiFi.printDiag(Serial);
}
void notFound(AsyncWebServerRequest *request) {
request->send(404, "text/plain", "Not found");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
float temperature_measure()
{
if (millis() - lastTempRequest >= delayInMillis) // waited long enough??
{
temperature = sensors.getTempCByIndex(0);
sensors.setResolution(tempDeviceAddress, resolution);
sensors.requestTemperatures();
delayInMillis = 750 / (1 << (12 - resolution));
lastTempRequest = millis();
return temperature;
}
return temperature;
}
//String readDSTemperatureC() {
// if(temperature_C == -127.00) {
// Serial.println("Failed to read from DS18B20 sensor");
// return "--";
// } else {
// Serial.print("Temperature Celsius: ");
// Serial.println(temperature_C);
// }
// return String(temperature_C);
//}
void setup() {
Serial.begin(74880); //115200 Start the Serial Monitor
delay (100);
Serial.println("I`m alive");
if (!LittleFS.begin()) {
Serial.println("An Error has occurred while mounting LittleFS");
return;
}
sensors.begin(); // Start the DS18B20 sensor
sensors.getAddress(tempDeviceAddress, 0);
sensors.setResolution(tempDeviceAddress, resolution);
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
delayInMillis = 750 / (1 << (12 - resolution));
lastTempRequest = millis();
WIFI_connect();
AsyncElegantOTA.begin(&server); //start OTA server
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
//-------------------- server addition -----------------------------
// Route for root / web page
server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) { // send index_html page to client
request->send(LittleFS, "/index.html", String(), false, processor);
});
server.on("/temperature_C", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send_P(200, "text/plain", temperatureC_string.c_str());
});
server.onNotFound(notFound);
// Start server
server.begin();
}
void loop() {
currentMillis = millis();
temperature_C = temperature_measure();
// temperatureC_string = readDSTemperatureC();
temperatureC_string = String(temperature_C);
}
-
#2
Вставлю свои «5 копеек». По моему опыту DS18B20 работает от 3.3 вольта прекрасно. Правда не далее чем 3 метра провода при питании от ESP.
Несколько лет назад были попытки замерить температуру воды в скважине 42 метра (от нечего делать…). Датчик с тремя AA (все залито силиконом). Наружу GND и DATA до ESP. Ну вообщем показало… Но это была «разовая акция».
-
#3
и какая температура на глубине 42 метра?
pvvx
Активный участник сообщества
-
#4
и какая температура на глубине 42 метра?
Близкая к среднегодовой, если не за полярным кругом…
pvvx
Активный участник сообщества
-
#5
Вставлю свои «5 копеек». По моему опыту DS18B20 работает от 3.3 вольта прекрасно. Правда не далее чем 3 метра провода при питании от ESP.
Несколько лет назад были попытки замерить температуру воды в скважине 42 метра (от нечего делать…). Датчик с тремя AA (все залито силиконом). Наружу GND и DATA до ESP. Ну вообщем показало…Но это была «разовая акция».
![]()
А температуру воды от насоса скважины на поверхности было не померять? Прям она так меняется при откачке
pvvx
Активный участник сообщества
-
#6
и какая температура на глубине 42 метра?
По воздуху на моем участке (север Ленобласти):
Расчет средней температуры воздуха вперед на год от указанной на шкале даты:
Вот такая вода и течет со скважины в -5 метров, а далее зависит от грунта и на -50 метров в пределе на градус теплее…
Т.к. «скважина» самоистекающая до +10 см от поверхности, то путем малой докачки можно греть зимой подпол, а летом использовать как кондиционер
-
#7
соответсвенно и возвращает как бы 5 вольт
Вот тут неправильно.
Резистор подтяжки где стоит?
Почитайте что такое схема с открытым коллектором.
pvvx
Активный участник сообщества
-
#8
Вот тут неправильно.
Резистор подтяжки где стоит?
Почитайте что такое схема с открытым коллектором.
Чтобы хотя-бы частично убрать выбросы кабеля необходимы сопротивления ниже «волнового сопротивления среды» на обоих концах. А это близко к 376.73 Ом для волнового сопротивления вакуума.
В итоге это общая нагрузка около 188 Ом на выходы чипов. И при 5 В это 27 мА.
pvvx
Активный участник сообщества
-
#9
А для полного согласования кабеля требуются сопротивления ещё ниже. В итоге советы припаять на другой конец резистор не катят. Для этого люди давно используют токовую петлю, у которой размахи по напряжению значительно ниже 5 В и сопротивления терминаторов тоже ниже
Или для ардуинщиков другие физические законы?
pvvx
Активный участник сообщества
-
#10
@CodeNameHawk И т.к. даже у UTP Cat.5 волновое 100 Ом, что означает терминаторы по 100 Ом с обоих концов и нагрузка для постоянного тока от 50 Ом, то вразумительных и советов TC никаких не дать, кроме как менять всю схему, или систему, или датчики…
pvvx
Активный участник сообщества
-
#11
Возможно попробовать как-то работать DS18B20 на кабель более 3-х метров (этого нет в его документации) c помощью DS2480B, установив в нем «flexible speed» для регулирования токов нарастания поменьше, чтобы ограничить всякие выбросы и искажения на кабеле…
DS18B20 имеет транзистор, в открытом состоянии с сопротивлением 100 Ом и рекомендуемую подтяжку в 4.7 кОм.
-
#12
Тут все намного проще, резистор разместить возле самой есп, чем ближе тем лучше.
И конечно не на +5 в а к +3.3 в.
У меня на есп подключены 6 таких датчиков, работают очень стабильно, правда резистор уменьшил до 1ком, с 4.7 ком были сильно завалены фронты импульсов.
pvvx
Активный участник сообщества
-
#13
У меня на есп подключены 6 таких датчиков, работают очень стабильно, правда резистор уменьшил до 1ком, с 4.7 ком были сильно завалены фронты импульсов.
Т.е. датчики теперь показывают свой нагрев от работы на шине с 1 кОм (на внутреннем сопротивлении MOSFET в 100 Ом при передаче «0» бита), а не окружающую температуру?
ИФК от этого транзистора достаточно хорошо влияет на показания…
pvvx
Активный участник сообщества
-
#14
Чтобы DS18B20 мог выполнять точное преобразование температуры, необходимо обеспечить достаточную мощность по линии DQ, когда происходит преобразование температуры. Поскольку рабочий ток DS18B20 составляет до 1,5 мА, линия DQ не будет иметь достаточного напряжения из-за подтягивающего резистора 5 кОм. Эта проблема особенно актуальна, если несколько DS18B20 подключены к одному и тому же DQ и пытаются выполнить преобразование одновременно.
Есть два способа убедиться, что DS18B20 имеет достаточный ток питания во время активного цикла преобразования. Во-первых, обеспечить сильную подтяжку на линии DQ всякий раз, когда происходят температурные преобразования или копирование в E2-память. Этого можно добиться, используя полевой МОП-транзистор, чтобы подтянуть линию DQ непосредственно к источнику питания, как показано на рис. 2. Линия DQ должна быть переключена на сильную подтяжку максимум в течение 10 мкс после выдачи любого протокола, который включает копирование в E2. память или инициирует преобразование температуры. При использовании режима паразитного питания вывод VDD должен быть заземлен.
Т.е. на время передач по шине ключ должен быть выключен.
А второй способ — внешнее питание датчика, а не от шины.
В итоге во всех вариантах PDF нет указаний, что резистор подтяжки может быть менее 4.7 кОм.
В PDF от DALLAS указано — подтягивающий резистор около 5 кОм при 3.3..5 В, независимо от кол-ва датчиков на шине.
-
#15
от этого транзистора достаточно хорошо влияет на показания…
Насколько хорошо?
Выйдет за предел точности датчика?
Во время измерения нет передачи данных — нет нагрева транзистора, следующий опрос только через три секунды, датчик остынет.
Запустите измерения двух датчиков с разными подтяжками и покажите результаты, слов много а дел ноль.
pvvx
Активный участник сообщества
-
#16
Насколько хорошо?
Выйдет за предел точности датчика?
Во время измерения нет передачи данных — нет нагрева транзистора, следующий опрос только через три секунды, датчик остынет.
Запустите измерения двух датчиков с разными подтяжками и покажите результаты, слов много а дел ноль.
Можно и питание не по документации пустить. Это тоже проверять?
pvvx
Активный участник сообщества
-
#17
Выйдет за предел точности датчика?
Вполне. Простейший расчет это показывает и не зря есть документация.
Но у вас «это другое»?
pvvx
Активный участник сообщества
-
#18
DS18B20 — это не термометр, а так, дурной древний чип для Ардуинщиков.
Для корпусов TO-92 транзисторов указывают 312C/W и обычно сноска — * при монтаже на печатную плату.
Другие даташиты на TO-92 указывают — 3mW/С, что совпадает.
Измерение 12 бит на DS18B20 идет: Temperature Conversion Time — 750 ms.
Даташиты указывают потребляемый при этом ток до 1.5 мА
5В*1.5мА = 7.5 mW
Т.е. в момент измерения, почти секунду температура кристалла поднимается на +2.5 С.
Далее даже считать лень.
pvvx
Активный участник сообщества
-
#19
@CodeNameHawk что ещё интересует по данному датчику?
Он СMOS, что означает низкие частоты и большие емкости в кристалле. Т.е. не терпит прямого подключения к выводам ESP, у которых фронт переключения менее 3 нс с учетом внешней емкости вывода DS18B20.
Т.е. запросто запудрид ему мозги в нутре…
Включать без последовательного резистора от ESP на шину 1-wire не рекомендуется. Особенно если линия с длинным проводом.
-
#20
Можно и питание не по документации пустить. Это тоже проверять?
Приятно, когда собеседник отвечает сразу по существу вопроса.
Всю энергию в тело, на работу ни грамма.
Т.е. в момент измерения, почти секунду температура кристалла поднимается на +2.5 С.
Кто сказал, почему вы ему верите?
И даже если это так, а пусть даже греется на 5 градусов(выдумывать то не сложно), то производитель не дурак и это учитывает, калибровка это называется.
Страница 1 из 7
-
подскажите знающие, протянул провод ~40 метров типа магистраль и по нему каждые ~10-15 метров по отсекам в общем 3 датчика, провода в целом ~100м, запрос в скетче стоит 9 сек и почти через каждый раз показывает -127, ставил усб блок питание 1А, 2.1А, 3А чем больше тем хуже работает, ставлю повербанк работает вообще без сбоев, все четко, если пытаюсь ставить повербанк на зарядку повторяется то же самое, что можно сделать в данной ситуации, 220в не не спрашивайте почему не тянул, просто надо исправить эту ситуацию, какие советы будут?
подключал по этой схеме( ESP не такой и датчики гильзованные)
пробовал кондер на каждый датчик ставить чуть лушче становится, но все равно повторяется, если ставить на каждый датчик, то показания с одного пин может появится на другом#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <OneWire.h>
#include<DallasTemperature.h>#define BLYNK_PRINT Serial
#define ONE_WIRE_BUS 2const char* auth = «»;
const char* ssid = «»;
const char* pass = «»;
const char* host = «esp8266-webupdate»;
const char* serverIndex = «<form method=’POST’ action=’/update’ enctype=’multipart/form-data’><input type=’file’ name=’update’><input type=’submit’ value=’Update’></form>»;SimpleTimer timer;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
ESP8266WebServer server(80);// Настройки
float temp_limit[5][2] = { // Мин., Макс. температура каждого датчика
{10, 20},
{10, 20},
{10, 20},
{10, 20},
{10, 20}
};#define notify_send 2 // Кол-во отправляемых уведомлений
#define notify_interval 3000 // Интервал отправляемых уведомлений
// Настройкиfloat temp[5];
bool notify_send_flag[5];
byte notify_send_num[5];
unsigned long notify_send_time[5];
byte sensor_num;void setup(){
Serial.begin(115200);
Blynk.begin(auth, ssid, pass, «193.124.67.72», 8080);
DS18B20.begin();
timer.setInterval(9000L, getSendData);
Serial.println(«Booting Sketch…»);
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() == WL_CONNECTED) {
MDNS.begin(host);
server.on(«/», HTTP_GET, []() {
server.sendHeader(«Connection», «close»);
server.send(200, «text/html», serverIndex);
});
server.on(«/update», HTTP_POST, []() {
server.sendHeader(«Connection», «close»);
server.send(200, «text/plain», (Update.hasError()) ? «FAIL» : «OK»);
ESP.restart();
}, []() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
Serial.setDebugOutput(true);
WiFiUDP::stopAll();
Serial.printf(«Update: %s\n«, upload.filename.c_str());
uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() — 0x1000) & 0xFFFFF000;
if (!Update.begin(maxSketchSpace)) { //start with max available size
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_END) {
if (Update.end(true)) { //true to set the size to the current progress
Serial.printf(«Update Success: %u\nRebooting…\n«, upload.totalSize);
} else {
Update.printError(Serial);
}
Serial.setDebugOutput(false);
}
yield();
});
server.begin();
MDNS.addService(«http», «tcp», 80);Serial.printf(«Ready! Open http://%s.local in your browser\n«, host);
} else {
Serial.println(«WiFi Failed»);
}
}void loop(){
timer.run();
Blynk.run();
server.handleClient();
MDNS.update();if(sensor_num < 5){
if(temp[sensor_num] > temp_limit[sensor_num][1]){
if(!notify_send_flag[sensor_num]){
if(notify_send_num[sensor_num] < notify_send){
if(millis() — notify_send_time[sensor_num] > notify_interval){
Blynk.notify(String(«Датчик N») + String(sensor_num + 1) + String(» выше «) + String(temp_limit[sensor_num][1]) + String(» C»));
notify_send_num[sensor_num]++;
notify_send_time[sensor_num] = millis();
}
}
else
{
notify_send_flag[sensor_num] = true;
}
}
}
else if(temp[sensor_num] < temp_limit[sensor_num][0] && temp[sensor_num] > 0){
if(!notify_send_flag[sensor_num]){
if(notify_send_num[sensor_num] < notify_send){
if(millis() — notify_send_time[sensor_num] > notify_interval){
Blynk.notify(String(«Датчик N») + String(sensor_num + 1) + String(» ниже «) + String(temp_limit[sensor_num][0]) + String(» C»));
notify_send_num[sensor_num]++;
notify_send_time[sensor_num] = millis();
}
}
else
{
notify_send_flag[sensor_num] = true;
}
}
}
else
{
notify_send_flag[sensor_num] = false;
notify_send_num[sensor_num] = 0;
}sensor_num++;
}
else
{
sensor_num = 0;
}
}void getSendData(){
DS18B20.requestTemperatures();
temp[0] = DS18B20.getTempCByIndex(0);
temp[1] = DS18B20.getTempCByIndex(1);
temp[2] = DS18B20.getTempCByIndex(2);
temp[3] = DS18B20.getTempCByIndex(3);
temp[4] = DS18B20.getTempCByIndex(4);Serial.print(«Temp_0: «);
Serial.print(temp[0]);
Serial.print(» oC «);
Serial.print(«Temp_1: «);
Serial.print(temp[1]);
Serial.println(» oC»);
Serial.print(«Temp_2: «);
Serial.print(temp[2]);
Serial.println(» oC»);
Serial.print(«Temp_3: «);
Serial.print(temp[3]);
Serial.println(» oC»);
Serial.print(«Temp_4: «);
Serial.print(temp[4]);
Serial.println(» oC»);
Blynk.virtualWrite(11, temp[0]);
Blynk.virtualWrite(12, temp[1]);
Blynk.virtualWrite(13, temp[2]);
Blynk.virtualWrite(14, temp[3]);
Blynk.virtualWrite(15, temp[4]);
} -
провод витая пара 4 медных жил
все провода идут по железкам -
Elman = вы же уже задавали этот вопрос неделю назад на ардуино.ру и получили ответ и даже согласились с ним.
А теперь все по новой и даже никаких выводов не сделали? Схема та же, что и была…У вас и с питанием и сигналом проблемы будут на такой линии.
-
согласился, попробовал другое БП другие варианты, не решилось, решил узнать тут, может у кого было такое)
БП ставлю 2А начинает еще сильнее моросить, от 1А хоть как-то работает, я думаю дело не в питании
Последнее редактирование модератором: 14 фев 2020
-
может и поставил бы каждый датчик отдельно свой контролер но уже все протянуто да и электричество только там где контролер, уменьшить тоже не могу как сказал электричество только там)
-
ну раз изменить ничего нельзя — тогда остается смирится с тем, что датчики выдают -127…
-
Тогда только радиодатчик на батарейках.
-
Попробуйте уменьшить номинал резистора до 2.2 ком. Потом до 1.2 ком.
Может(???) помочь. -
-127 классический косяк.Нет контакта к датчику
-
Elman, а доступ к датчикам есть или вы уже намертво в стену вмазали?
Если есть — запустите свою систему и мультиметром измерьте напряжение питания, которое приходит на каждый из датчиков. -
есть идея развернуть это?есть доступ к ним, завтра попробую так)
Последнее редактирование модератором: 14 фев 2020
-
Дело теоретически интересное, но малополезное, при условии, что нет обрывов на линии. Полагаю, ТС первое что сделал — проверил целостность соединений.
Протокол определяет достаточно серьезные требования на импульсы, что бегают между мастером и слейвами. С ростом длины линии, растет ее емкость. На больших линиях пара длина/резистор 4.7 ком не позволяют уложиться в требования документации.
Поэтому приходится снижать номинал сопротивления до предельно возможного.
-
нужно уменьшить сопротиение у меня на длинном поводе вообще без него все работает
-
без конденсатора пробовал не работает)
-
вроде обрывов нет никаких, соединил только так, 60м и 15м провод целый а другие соединил зачистив провода
Вложения:
-
-
Я
Я не спец в этих делах, но думаю, такое соединение работать вы не заставите.
-
дело не в соединениях.
Предполагаю. что из начальых 3,3в до датчика доходит дай бог 3в. а известно что DS18b20 ниже 3в начинает глючить -
тема «температурный сенсор на батарейках» в инете обсосана досконально, полгода-год автономной работы достигаются легко. а если чуть постараться. то и больше
-
Не согласился бы из своей практики. На память, 2.7 вольт по даташиту и он их держит.
Но в данном случае, при созданном ТС соединении, ничто не поможет.
Страница 1 из 7
Модератор: immortal
-
CheBuraw
- Сообщения: 30
- Зарегистрирован: Ср авг 23, 2017 6:29 pm
-
Благодарил (а):
8 раз -
Поблагодарили:
14 раз
18B20 периодические показания -127.00. Чистка базы.
Предыстория.
Столкнулся с такой проблемой при построении графиков. Периодически 2 датчика 18B20 выдают показания -127.00 градусов. Из-за этого, как Вы понимаете, график приобретает не совсем приятный и наглядный вид. Изучение вопроса показало что с такими показаниями я сталкиваюсь не один и на форуме arduino много на эту тему обсуждения имеется. Купировать ошибку (как оказалось такие показания датчик выдает в случае ошибки) на устройстве мне не удалось, поэтому решил чистить её в базе. Понимаю что это реально костыль, но в данной ситуации лично мне так удобнее. Если и Вас достали провалы в показаниях на графиках, то вот моё решение. Делать так Вам или нет решайте сами.
Моё решение.
1) Заходим в phpMyAdmin
http://<DNS_имя_или_IP_сервера_MajorDoMo>/phpmyadmin/
Логин (по умолчанию, если не меняли): root
пароль (по умолчанию, если не меняли): rootpsw
2) В левой части экрана выбираем базу db_terminal
3) Создаем новое Событие
- php02.PNG (14.78 КБ) 6543 просмотра
4) Заполняем параметры события:
Название события: Любое, как Вам угодно
Состояние: ENABLE (включено)
Тип события: RECURRING (повторяющееся)
Выполнять каждые: 1(один) HOUR (час) // Это периодичность выполнения данного события. Настройте как Вам удобно.
Начало: //я указал текущий день и ближайшее округлённое время. Может его и вообще можно было пустым оставить
Определение: DELETE FROM `db_terminal`.`phistory` WHERE value=’-127.00′
// Это как раз запрос который в данной базе в ветке истории найдет все записи со значением -127.00 и удалит их
Сохранить при окончании: (не менял)
Определитель: (не заполнял)
Комментарий: (не обязателен)
Сохраняемся. (в моем случае идем Вперёд)
- php03.PNG (39.66 КБ) 6543 просмотра
5) Проверяем Статус планировщика событий. Должен быть Включен — зелёного цвета.
- php04.PNG (17.27 КБ) 6543 просмотра
6) Выходим из phpMyAdmin
Только что мы создали в планировщике БД событие, которое будет с заданной периодичностью удалять из базы истории записи со значением «-127.00»
Суточное тестирование проблем не выявило. Скрипт отрабатывает четко и графики вновь стали наглядными.
- За это сообщение автора CheBuraw поблагодарили (всего 2):
- Chainik (Вт фев 13, 2018 12:27 pm) • Amarok (Вт фев 13, 2018 1:08 pm)
-
fandaymon
- Сообщения: 1541
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
-
Благодарил (а):
39 раз -
Поблагодарили:
567 раз
Re: 18B20 периодические показания -127.00. Чистка базы.
Сообщение
fandaymon » Вт фев 13, 2018 12:31 pm
По-моему гораздо проще не добавлять такие значения в базу. Перед добавлением делать проверку на -127 и всё…
-
Chainik
- Сообщения: 1460
- Зарегистрирован: Вс янв 10, 2016 11:05 am
-
Благодарил (а):
257 раз -
Поблагодарили:
454 раза
Re: 18B20 периодические показания -127.00. Чистка базы.
Сообщение
Chainik » Вт фев 13, 2018 12:32 pm
CheBuraw, спасибо, что делитесь наработками и подробными инструкциями.
Правда, у меня возникает естественный вопрос. Если мы используем Мажордомо, почему нельзя перед записью значения в БД верифицировать его на корректность/допустимость, и явно ошибочные «отбраковывать» (или заменять предыдущими)? Зачем избран такой «сложный» путь «отбраковки» неправильных значений уже после записи в БД (и непосредственно из СУБД)?
-
Amarok
- Сообщения: 1425
- Зарегистрирован: Пт дек 14, 2012 12:24 pm
- Откуда: Россия, Нижняя Тура
-
Благодарил (а):
460 раз -
Поблагодарили:
126 раз - Контактная информация:
Re: 18B20 периодические показания -127.00. Чистка базы.
Сообщение
Amarok » Вт фев 13, 2018 1:22 pm
Можно использовать такой алгоритм:
- привязать датчик к свойству input
- создать метод inputChanged с таким текстом:
Код: Выделить всё
$value = $this->getProperty('input'); if ($value != $this->getProperty('value'); { if ($value <= '-127') {return;} $this->setProperty('value',$value); }
- связываем свойство input с методом inputChanged
- и уже на свойство value прикручиваем историю.
Таким способом мы отбросим повторяющиеся или неверные значения.
- За это сообщение автора Amarok поблагодарил:
- CheBuraw (Вт фев 13, 2018 4:43 pm)
-
CheBuraw
- Сообщения: 30
- Зарегистрирован: Ср авг 23, 2017 6:29 pm
-
Благодарил (а):
8 раз -
Поблагодарили:
14 раз
Re: 18B20 периодические показания -127.00. Чистка базы.
Сообщение
CheBuraw » Вт фев 13, 2018 4:25 pm
Честно говоря, для меня проще оказалось настроить систематическую чистку БД, чем отсеивать данные значения на лету, при получении.
Ваши предложения считаю достаточно интересными. Я о таком варианте даже как-то и не подумал .
Amarok, спасибо за конкретный пример ещё одного варианта решения проблемы.
-
Amarok
- Сообщения: 1425
- Зарегистрирован: Пт дек 14, 2012 12:24 pm
- Откуда: Россия, Нижняя Тура
-
Благодарил (а):
460 раз -
Поблагодарили:
126 раз - Контактная информация:
Re: 18B20 периодические показания -127.00. Чистка базы.
Сообщение
Amarok » Вт фев 13, 2018 8:07 pm
Код: Выделить всё
if ($value != $this->getProperty('value'); {
if ($value <= '-127') {return;}
$this->setProperty('value',$value);
}
Тут можно любые действия делать будет. Округлять, заменять и т.п..
-
Fav0rit
- Сообщения: 60
- Зарегистрирован: Чт мар 19, 2015 10:27 pm
-
Благодарил (а):
8 раз -
Поблагодарили:
22 раза
Re: 18B20 периодические показания -127.00. Чистка базы.
Сообщение
Fav0rit » Чт фев 15, 2018 8:34 pm
CheBuraw писал(а):Честно говоря, для меня проще оказалось настроить систематическую чистку БД, чем отсеивать данные значения на лету, при получении.
Ваши предложения считаю достаточно интересными. Я о таком варианте даже как-то и не подумал.
Amarok, спасибо за конкретный пример ещё одного варианта решения проблемы.
Здесь на форуме я выкладывал свой новый класс sensors где все это уже реализовано, очень рекомендую. Могу выложить новую версию, с тех пор я исправить некоторые ошибки и внёс доработки
Отправлено с моего Redmi 3 через Tapatalk
//cloud.tapatalk.com/s/5a85c523f4182/Sensors.txt
- За это сообщение автора Fav0rit поблагодарил:
- CheBuraw (Вт фев 27, 2018 8:48 am)
-
CAHbKA
- Сообщения: 39
- Зарегистрирован: Сб мар 17, 2018 6:37 am
-
Благодарил (а):
10 раз -
Поблагодарили:
2 раза
Re: 18B20 периодические показания -127.00. Чистка базы.
Сообщение
CAHbKA » Ср мар 21, 2018 3:34 pm
Amarok писал(а):Можно использовать такой алгоритм:
привязать датчик к свойству input
А если это не датчик, погода с тырнета, но видимо само это свойство надо искать где то в папках через консоль (ну или через ssh цепляться и рыться в папках). через веб оболочку это не сделаешь. Правильно?
Pi3 + MJD
-
Amarok
- Сообщения: 1425
- Зарегистрирован: Пт дек 14, 2012 12:24 pm
- Откуда: Россия, Нижняя Тура
-
Благодарил (а):
460 раз -
Поблагодарили:
126 раз - Контактная информация:
Re: 18B20 периодические показания -127.00. Чистка базы.
Сообщение
Amarok » Чт мар 22, 2018 7:37 am
смотря как и куда данные считываются. могу через тимвьювер глянуть
ive used one DS1820B sensor in a AVR bread board circuit and it works there, now i tried attaching it to a arduino mega board with the code below and also another library below that.
currently the data pin is connected to pin 10 on the arduino board, but i also tried pin 2 as in this picture:
https://lastminuteengineers.com/wp-content/uploads/2018/12/Wiring-Multiple-DS18B20-Temperature-Sensors-With-Arduino.png
i changed: #define ONE_WIRE_BUS 10 accordingly.
So after that i put the chip back onto the bread board and it still works.
I also tried it with the 4.7k resistor on the data line as pullup….still -127.
Any ideas?
#include <SPI.h>
#include <SD.h>
/********************************************************************/
// First we include the libraries
#include <OneWire.h>
#include <DallasTemperature.h>
/********************************************************************/
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 10
/********************************************************************/
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
/********************************************************************/
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
/********************************************************************/
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
sensors.begin();
}
void loop() {
Serial.print("Temperature is: ");
Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"?
// You can have more than one DS18B20 on the same bus.
// 0 refers to the first IC on the wire
delay(1000);
}
second code:
#include "DS18B20Events.h"
// Pin for DS18B20
#define ONE_WIRE_BUS 10
/********************************************************************/
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Init DallasTemperature
DallasTemperature dallasTemperature(&oneWire);
//Init thermometer with index 0 (default)
DS18B20Events thermometer(0);
// the setup function runs once when you press reset or power the board
void setup() {
Serial.begin(9600);
DS18B20Events::setup(&dallasTemperature); // Link DS18B20Events to DallasTemperature object
DS18B20Events::setInterval(5000); // Set min interval in milliseconds between 2 measurements. Default 10000 set in setup() method.
// subscribe to temperature changed event
thermometer.onChange = temperatureChanged;
}
// the loop function runs over and over again until power down or reset
void loop() {
thermometer.loop(); // Mandatory to measure temperature and fire an event if needed
Serial.print(thermometer.getTempC()); // Get last measured tempC if needed.
Serial.print(" measured ");
Serial.print((millis() - thermometer.getMillis()) / 1000);
Serial.println(" seconds ago.");
delay(1000);
}
void temperatureChanged(uint8_t index, float tempC)
{
Serial.print(tempC);
Serial.print(" new tempC at index ");
Serial.println(index);
}