Система полуумного дома
Получение температуры...
Получение влажности...
В одном из старых своих постов я собрал метеостанцию для своей комнаты. Она состояла из датчика температуры и влажности и датчика CO2. Но как показала практика модуль датчика был на редкость глючным, поэтому я дождался новый и стал перебирать свою метеостанцию.
Начал с того, что поменял понижающий dc-dc преобразователь на послабее, и разъем питания вывел на заднюю сторону.
Так же решил, что хватит термосоплей и преобразователь будет крепится на винтах.
Так как от старого датчика температуры осталась огромная дыра сзади корпуса то решил через неё провести провода для нового модуля, а сам модуль закрепить сзади на винты.
Вид сзади целиком.
Как известно количество CO2 в воздухе измеряется в количестве частиц на миллион. Если количество до 1000 – все норм, с 1000 до 1500 появляется усталость, с 1500 – 2000 – головные боли и т.д., а дальше вообще все плохо. Было решено установить двухцветный светодиод, который горит зеленым при ppm CO2 меньше 1500 и красным если больше.
Сам диод взял из набора модулей для ардуино.
Уже с токоограничивающим резистором. После я спаял все проводами. Если вдруг кто будет повторять, что вряд ли, то соединил так.
D1 от NodeMCU к SCL дисплея и датчика cjmcu-811.
D2 к SDA этих же устройств.
D3 – данные с DHT11.
D4 – программируемый минус к wake cjmcu-811. Чтобы он работал на этом контакте должен быть минус. Но легенды гласят что если там будет постоянный минус, то датчик будет чахнуть и хиреть и его надобно перезагружать. Поэтому в программе создан счетчик, считающий итерации программы, если итерация стала больше 1000, то счетчик сбрасывается в 0, а на wake cjmcu подается логическая единица (3,3 вольта) на полсекунды, а потом снова ноль.
D5 и D6 – плюсы для красного и зеленого режима светодиода.
DHT11 и CJMCU-811 запитаны от 3.3 вольта с самой NODEMCU, а дисплей запитан от 5 вольт преобразователя, которыми же питается и сама NODEMCU.
Сам скетч.
#include <ESP8266WiFi.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_CCS811.h>
#define DHTPIN 0
#define respin 2
#define ledred 14
#define greenled 12
const char* ssid = "имя вашей сети";
const char* password = "пароль вашей сети";
DHT dht(DHTPIN, DHT11);
WiFiServer server(80);
String header;
float t = 0.0;
int h = 0;
int CO2;
int TVOC;
int count = 0; //счетчик
Adafruit_CCS811 ccs;
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
void resetccs() {
digitalWrite (respin, HIGH);
delay(500);
digitalWrite (respin, HIGH);
digitalWrite (respin, LOW);
}
void setup() {
pinMode (respin, OUTPUT);
digitalWrite (respin, LOW);
pinMode (ledred, OUTPUT);
pinMode (greenled, OUTPUT);
dht.begin();
if(!ccs.begin()){
while(1);
}
// Wait for the sensor to be ready
while(!ccs.available());
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
// preparing GPIOs
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
server.begin();
delay(1000);
count = 10;
}
// runs over and over again
void loop() {
t = dht.readTemperature();
h = dht.readHumidity();
// Listenning for new clients
if (ccs.available()) {
if(!ccs.readData()) {
CO2 = ccs.geteCO2();
TVOC = ccs.getTVOC();
}
}
//шапка экрана
lcd.setCursor(0, 0);
lcd.print("TempC");
lcd.setCursor(7, 0);
lcd.print("Vlaga");
lcd.setCursor(13, 0);
lcd.print("CO2");
//значения
lcd.setCursor(0, 1);
lcd.print(t);
lcd.setCursor(7, 1);
lcd.print(h);
lcd.setCursor(9, 1);
lcd.print("%");
lcd.setCursor(12, 1);
lcd.print(CO2);
WiFiClient client = server.available();
if (client) {
// boolean to locate when the http request ends
boolean blank_line = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
header += c;
if (c == '\n' && blank_line) {
// checking if header is valid
// dXNlcjpwYXNz = 'user:pass' (user:pass) base64 encode
//successful login
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// turns the GPIOs on and off
Serial.println("Main Web Page");
// your web page
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<meta charset='utf-8'>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css\">");
client.println("</head><div class=\"container\">");
client.println("<h1>Важней всего погода в доме</h1>");
client.println("<p>Температура воздуха <span id='t'>");
client.println(t);
client.println("°С</span></p><p>Влажность воздуха <span id='v'>");
client.println(h);
client.println("%</span></p>");
client.println("<p>Количество СО2 <span id='co2'>");
client.println(CO2);
client.println("</span>ppm</p>");
client.println("<p>Количество летучих органических веществ <span id='tvoc'>");
client.println(TVOC);
client.println("</span></p>");
client.println("</div></body></html>");
header = "";
break;
}
if (c == '\n') {
// when starts reading a new line
blank_line = true;
}
else if (c != '\r') {
// when finds a character on the current line
blank_line = false;
}
}
}
// closing the client connection
delay(1);
client.stop();
}
if (CO2 >= 1500) {
digitalWrite (ledred, HIGH);
digitalWrite (greenled, LOW);
} else if (CO2 < 1500) {
digitalWrite (ledred, LOW);
digitalWrite (greenled, HIGH);
}
count++;
if (count >= 1000) {
resetccs();
count = 0;
}
}
В скетче из нововведений на сайте платы показываются значения CO2, а также летучих органических соединений (tvoc). Для последних не нашлось места на дисплее и они будут только на сайте. Загружаем, проверяем…
Все работает. Приступаем к кабельменеджменту, для этого я использую термосопли.
А потом склеиваем все скотчем скручиваем все винтами и вуаля!
Для вишенки на торте я переписал файлик на сервере в котором парсятся эти значения и показываются в колонке справа на компьютерной версии моего сайта. Там все то же самое что и было в прошлой версии метеостанции делается все так же. Из минусов хочу отметить глюк с которым не смог справится. Если ppm выходит за тысячу, а потом спускается обратно, но на дисплее в конец числа добавляется некая цифра. Например на дисплее CO2 стоит 7427, а на сатйе 742, и диод горит зеленым, что свидетельствует о том что значение всё же ниже 1500. А на этом всё, все добра здоровья!
mcfirsachy написал к публикации QUAD405 из поднебесной cледующее:
Кто дочитал до конца - извините за огромное количество ошибок =)))) Хотелось бы добавить что на выпрямителе стоит защита акустики - подключение колонок с задержкой.Сейчас в Сосновом Бору облачно с прояснениями
Скорость ветра 8.44 м/с
Влажность 81 %
Температура 12.32 °C
Получение температуры...
Получение влажности...