Не работает контроллер от других розеток
- Войдите на сайт для отправки комментариев
Всем привет.
Решил я как-то воткнуть контроллер в санузел для управления вытяжкой, контролем влажности и протечками. Собрал все на макетной схеме на работе, запустил все работает отлично. На дисплей информация выводится, реле управляются.
#include <ESP8266WiFi.h> #include "DHT.h" #include <Average.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> // Set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27, 16, 2); unsigned long previousMillis = 0; // начало времени для опроса датчика температуры unsigned long previousMillis2 = 0; // начало отсчета для вытяжки const long interval = 3000; // пауза между опросами датчика температуры const long interval2 = 300000; // время непрерывной работы вытяжки 5 минут (300000 ) const long interval3 = 120000; // время остывания мотора вытяжки если влыжность не понижена работой вытяжки 2 минуты (120000 ) int timeTostop; int hummCount = 70; // влажность для включения вытяжки #define DHTPIN D2 // номер пина, к которому подсоединен датчик температуры // Инициируем датчик //DHT dht(DHTPIN, DHT22); DHT dht(DHTPIN, DHT11); Average<float> ave(20); // создаем массив на 20 значений const char* ssid = "bathroom"; const char* password = "123456789"; int ledPin = D7; //пин выключателя у раковины int ledPin2 = D8; //пин выключателя туалет комод int ledPin3 = D5; //пин выключателя над ванной int ledPin4 = D6; //пин выключателя вытяжки int value = LOW; int value2 = LOW; int value3 = LOW; int value4 = LOW; boolean value5 = false; WiFiServer server(80); void setup() { Serial.begin(115200); dht.begin(); delay(10); // initialize the LCD lcd.begin(4,5); // sda=0 | D3, scl=2 | D4 // Turn on the blacklight and print a message. lcd.backlight(); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); pinMode(ledPin2, OUTPUT); digitalWrite(ledPin2, HIGH); pinMode(ledPin3, OUTPUT); digitalWrite(ledPin3, HIGH); pinMode(ledPin4, OUTPUT); digitalWrite(ledPin4, HIGH); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Creating AP"); Serial.println(ssid); WiFi.softAP(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Creating WiFi AP bathroom OK"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.print("Use this URL : "); Serial.print("http://"); Serial.print(WiFi.softAPIP()); Serial.println("/"); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // опросить датчик температуры и влажности и положить значение в массив Serial.println(previousMillis); // сохраняем время последнего опроса датчика previousMillis = currentMillis; Serial.println(currentMillis); float humm = dht.readHumidity(); ave.push(humm); // получаем значение влажности Serial.println(ave.mean()); } if (ave.mean() > hummCount && currentMillis - previousMillis2 >= interval3 && !value5) { previousMillis2 = currentMillis; digitalWrite(ledPin4, LOW); value4 = HIGH; value5 = true; } // дописать условие ИЛИ время работы более 5 минут // дописать присваивание значение value4 для отображение на веб статуса работы вытяжки if (currentMillis - previousMillis2 >= interval2 && value5) { digitalWrite(ledPin4, HIGH); previousMillis2 = currentMillis; value4 = LOW; value5 = false; } float h = dht.readHumidity(); float t = dht.readTemperature(); float hic = dht.computeHeatIndex(t, h, false); lcd.home(); lcd.print("TEMP:"); lcd.print(round(t)); lcd.print("*C"); lcd.setCursor(10, 0); lcd.print("VT:"); if (value5) { timeTostop = currentMillis - previousMillis2; timeTostop = timeTostop / 1000; timeTostop = 300 - timeTostop; // timeTostop = timeTostop / 60; lcd.print(timeTostop); } else {lcd.print("0FF");} lcd.setCursor(0, 1); lcd.print("HUMM:"); lcd.print(round(ave.mean())); lcd.print("% ("); lcd.print(hummCount); lcd.print("%)"); // lcd.setCursor(0, 1); // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; } // Wait until the client sends some data Serial.println("new client"); while(!client.available()){ delay(1); } // Read the first line of the request String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); // Match the request для реле 1 if (request.indexOf("/LED=ON") != -1) { digitalWrite(ledPin, LOW); value = HIGH; } if (request.indexOf("/LED=OFF") != -1){ digitalWrite(ledPin, HIGH); value = LOW; } // Match the request для реле 2 if (request.indexOf("/LED2=ON") != -1) { digitalWrite(ledPin2, LOW); value2 = HIGH; } if (request.indexOf("/LED2=OFF") != -1){ digitalWrite(ledPin2, HIGH); value2 = LOW; } // Match the request для реле 3 if (request.indexOf("/LED3=ON") != -1) { digitalWrite(ledPin3, LOW); value3 = HIGH; } if (request.indexOf("/LED3=OFF") != -1){ digitalWrite(ledPin3, HIGH); value3 = LOW; } // Match the request для реле 4 (вытяжка if (request.indexOf("/LED4=ON") != -1) { digitalWrite(ledPin4, LOW); value4 = HIGH; value5 = true; previousMillis2 = currentMillis; } if (request.indexOf("/LED4=OFF") != -1){ digitalWrite(ledPin4, HIGH); value4 = LOW; value5 = false; previousMillis2 = currentMillis; } // Парсим заданное значение влажности для включения вытяжки if (request.indexOf("/HUM=40") != -1) { hummCount = 40; } if (request.indexOf("/HUM=50") != -1) { hummCount = 50; } if (request.indexOf("/HUM=60") != -1){ hummCount = 60; } if (request.indexOf("/HUM=70") != -1){ hummCount = 70; } // Return the response client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); // do not forget this one client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head><meta charset=\"utf-8\"> <title>ЯСанузел</title></head>"); if (isnan(h) || isnan(t)) { client.println("Не удается считать показания темпеатуры и влажности"); client.println("<br><br>"); } else { client.print("<center><font size=\"15\" color=\"blue\">Влажность "); client.print(h); client.println( "%</font></center>"); client.print("<center><font size=\"15\" color=\"blue\">Средняя влажность: "); client.println(ave.mean()); client.println(" %</font></center>"); client.print("<center><font size=\"15\" color=\"green\">Температура "); client.print(t); client.println(" *C</font></center>"); client.print("<center><font size=\"15\" color=\"green\">Ощущается как "); client.print(hic); client.println(" *C</font></center>"); client.println("<br><br>"); } client.print("<center><font size=\"15\">Свет у раковины чейчас: </font>"); if(value == HIGH) { client.print("<font size=\"15\" color=\"green\">Вкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED=OFF\">Выключить</a></font></center><br>"); } else { client.print("<font size=\"15\" color=\"yellow\">Выкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED=ON\">Включить</a></font></center><br>"); } client.println("<br><br>"); client.print("<center><font size=\"15\">Свет у туалета сейчас: </font>"); if(value2 == HIGH) { client.print("<font size=\"15\" color=\"green\">Вкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED2=OFF\">Выключить</a></font></center><br>"); } else { client.print("<font size=\"15\" color=\"yellow\">Выкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED2=ON\">Включить</a></font></center><br>"); } client.println("<br><br>"); client.print("<center><font size=\"15\">Свет над ванной сейчас: </font>"); if(value3 == HIGH) { client.print("<font size=\"15\" color=\"green\">Вкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED3=OFF\">Выключить</a></font></center><br>"); } else { client.print("<font size=\"15\" color=\"yellow\">Выкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED3=ON\">Включить</a></font></center><br>"); } client.println("<br><br>"); client.print("<center><font size=\"15\">Вытяжка сейчас: </font>"); if(value4 == HIGH) { client.print("<font size=\"15\" color=\"green\">Вкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED4=OFF\">Выключить</a></font></center><br>"); } else { client.print("<font size=\"15\" color=\"yellow\">Выкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED4=ON\">Включить</a></font></center><br>"); } client.println("<br><br>"); client.print("<center><font size=\"15\">Влажность для включения вытяжки: "); client.print(hummCount); client.println("</font></center>"); client.print ("<center><br><font size=\"15\"><a href=\"/HUM=40\">40</a>"); client.print(" "); client.print("<a href=\"/HUM=50\">50</a>"); client.print(" "); client.print("<a href=\"/HUM=60\">60</a>"); client.print(" "); client.print("<a href=\"/HUM=70\">70</a></font></center><br><br>"); client.print ("<center><br><font size=\"15\"><a href=\"http://"); client.print (WiFi.softAPIP()); client.print ("/\">ОБНОВИТЬ</a>"); client.println("</html>"); delay(1); Serial.println("Client disconnected"); Serial.println(""); }
Потом все это добро не разбирася забрал домой, перед подключением в санузле решил проверить собранную схему, вставляю в розетку, а на дисплее ничего, точка доступа видна, но страница недоступна. Думал может какой контакт, забрал обратно на работу, вставляю в розетку и все работает. Далее поехал опять домой взяв еще один блоки питания. Приезжаю пробую рабочую схему и опять ничего, другой блок питания, тоже ничего. Просто горит дисплей, видна точка доступа, но страница не открывается и на дисплей ничего не выводится.
Я даже не могу предположить что за полтергейст тут может быть.
а что у вас произойдет если отвалятся датчики? программа в вечный цикл не уйдет?
по ВаФляю вы ваш девайс видите? а через порт Serial?
а что у вас произойдет если отвалятся датчики? программа в вечный цикл не уйдет?
При отключении датчика все норма работает. Значение просто не выводит, позволяет реле управлять.
по ВаФляю вы ваш девайс видите?
Да, виден. Телефон к нему подключается, но страницу не открыает.
а через порт Serial?
Пока нет возможности проверить, дома ремонт, компа нет.
Забыл написать, что плата Wemos D1 R2
На работе Симитируйте работу девайса в туалете: подергайте датчики, поглушите вайфляй, пукните рядом ( для более полного приближения к реальным условиям))
дело точно не в розетках
ищите, ваш код гдето стопорится или циклится до строк
127
lcd.home();
128
lcd.print(
"TEMP:"
);
129
lcd.print(round(t));
выводите отладочную информацию на LCD сразу
типа
043
void
setup
() {
044
Serial
.begin(115200);
ЛСД--привет запуск
....
ЛСД -- 5 стро кода прошло.. полет нормальный
....
ЛСД -- 15 стро кода прошло.. полет нормальный
...
ЛСД -- N стро кода прошло.. полет нормальный
и ид
На работе Симитируйте работу девайса в туалете: подергайте датчики, поглушите вайфляй, пукните рядом ( для более полного приближения к реальным условиям))
дело точно не в розетках
Все делал, кроме глушилки вайфай, а как это сделать? Очень рядом сотовая вышка, может она глушит контроллер.
Нет, точно дома провод от щитка к розетке не в ту сторону протянут. На звук это, как известно, катастрофически влияет, наверное и на экран тоже.
Нет, точно дома провод от щитка к розетке не в ту сторону протянут. На звук это, как известно, катастрофически влияет, наверное и на экран тоже.
точно!
Нет, точно дома провод от щитка к розетке не в ту сторону протянут. На звук это, как известно, катастрофически влияет
Подробнее здесь: http://arduino.ru/forum/otvlechennye-temy/khifilitiki-kulturnyi-shok
черт, а я до этого считал что если кабель проложить от щитка к розетке то розетка будет работать, тк напруга будет течь по кабелю от начала в конец - из щетка к розетке, а если проложить кабель от розетки к щику то розетка работать не будет так как в розетке нет напруги и нечему там течь ! и я дома везде кабель протянул от щитка к розетке ! прочитав про хивилитиков я понял что я прав!
PS а говорят что еще напругу можно ведрами переносить.. надо проверить...
Сделал режим вывод каждой операции на экран и понял на каком моменте зависает. Это строка 81, на экран бесконечно выводятся точки.
Но есть закономерность, контроллер номально загружается вблизи како-либо точки доступа. А в помещении где нет WiFi роутеров висит печатая точку.
Думал что может строки 79-82 касаются подключения к точке доступа, закоментировал их. И контроллер стал нормально загружаться где угодно, но к нему как точке доступа невозможно подключиться.
ну правильно, если у вас нет вайфая то вам модуль и не выдает статус подключения
079
while
(WiFi.status() != WL_CONNECTED) {
080
delay(500);
081
lcd.print(
"."
);
082
}
и тут вы тогда просто висите в вечном цикле пока не появится вайфай.
вынесите инициализацию вайфая в отдельную функцию, добавьте выход по таймауту - если ненайден вайфай 2 секунды то выходим и продолжаем работу основной программы
если нет соединения с вайфаем то в главном цикле void loop() периодически (раз в 5 минут или ..) вызывайте вашу функцию инициализации вайфая
или добавьте на крайняк
В моем случае контроллер выступает как точка доступа
И она реально видна как отдельная точка доступа, но когда нет рядом роутера, пароля и имя которго контроллер не знает, он висит высвечивая на дисплей точки из строки 81. В случае если закоментировать строки 79-82 и рядом нет роутера, контроллер виден как точка доступа, но подключиться к нему не получается.
Долго мучился, обнаружил в буржунете что необходимо было выбрать режим работы точки доступа, а не только дать комаду на создание.
Вот такая, рабочая контсрукция получилась:
Тему можно считать закрытой.