This is an old revision of the document!
Node-red a data z ADC
Project owner: | Cyberian |
Interested: | … |
Related: | |
License: | Uveďte původ-Zachovejte licenci CC BY-SA |
Úvod
Vzhledem k netušené náročnosti to trochu potrvá. Nicméně tvrdě na tom dělám
Čeká nás instalace Mosquitto brokera a klienta, instalace Node-redu a kněmu několika modulů. Rožšíření kódu programu a práce v Node-red editoru.
Materiál
- ip66 waterproof case
- LVDO stabilizátor na 3,3V - LF33CV
- elektrolytický kapacitor 2.2uF, 200V
- trimr 20K
- jumper
- svorkovnice
- pájitelné pole
- menší chladič
Instalace mosquitto brokera a klienta
Začneme instalací Mosquitto brokera1. Jako systém jsem si zvolil Debian 9, na který jsem zvyklý. Příkazy jsou tedy uzpůsobeny pro něj:
Provedeme preventivní update a upgrade správce balíčků, následnou instalaci Mosquitto a Mosquiito klienta pro možnost posílat nebo odebírat zprávy z MQTT brokera:
apt-get update apt-get upgrade apt-get install mosquitto-dev mosquitto-clients
Instalace Node-red
Před vlastní instalací node-red, je nutno nainstalovat nodejs. Zvolil jsem aktuální dostupnou verzi nodejs a jsem připraven čelit případným bugům:
- toto jsem bohužel zakřikl a verze z https://deb.nodesource.com/setup_12.x se ukázala jako příliš experimentální a selhala při kompilaci
info o bugu, viz https://github.com/nodejs/nan/issues/849
Přejdeme na verzi 11 než komunita verzi 12 opraví.Taktéž nainstalujeme node-red dashboard
apt get-install g++ curl -sL https://deb.nodesource.com/setup_11.x | bash - apt-get install -y nodejs npm install -g --unsafe-perm node-red npm install node-red-dashboard
Nyní máme připravený node-red s dashboardem. Do node-red editoru se lze dostat přes http://localhost:1880. Na dashboard proklikem z editoru přes tab dashboard a následně ikonou šipky na úhlopříčku nebo přes http://localhost:1880/ui
Měli by jsme si node-red editor zabezpečit.
Nastavení přihlašovacích údajů pro Node-red editor
instalace bcryptu modulu a modulu pro generování hashů hesel:
npm install -g yarn yarn add bcrypt yarn add node-red-admin
Při instalaci bcryptu došlo taktéž k bugu, proto jsem zvolil další pomocný modul pro instalace yarn.
Hash pro vlastní libovolné heslo získame pomocí modulu node-red-admin:
node-red-admin hash-pw
Nastavení přístupových účtů pro node-red lze provést odkomentováním následující sekce v /root/.npm/node-red/settings.js a vložením vygenerovaného hashe:
adminAuth: { type: "credentials", users: [ { username: "admin", password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.", permissions: "*" }, { username: "george", password: "$2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y", permissions: "read" } ] }
Následovat budou drobné úpravy obvodu, vynechání displeje, připájení na pájitelné pole a přimontování do krabice. Pak se vrhneme na návrh v node-redu.
Úpravy kódu:
- přidání kódu pro zasílání zpráv s napětím pomocí mqtt protokolu na mqtt brokera
- odebrání kódu pro OLED displej
- deep sleep mód
Finální kód programu
// ADC_MODE(ADC_VCC); #include <ESP8266WiFi.h> #include <Wire.h> #include <PubSubClient.h> #undef MQTT_MAX_PACKET_SIZE // un-define max packet size #define MQTT_MAX_PACKET_SIZE 500 // fix for MQTT client dropping messages over 128B //const char* ssid = "........"; //const char* password = "........"; const char* mqtt_server = "192.168.16.3"; WiFiClient espClient; PubSubClient mqttClient(espClient); char msg[10]; char pingTime[10]; unsigned long wifiTime; unsigned long pubTime; bool pingTimeout=false; //unsigned long pingTime2; void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i=0;i<length;i++) { Serial.print((char)payload[i]); } Serial.println(); } void reconnect() { // Loop until we're reconnected unsigned long start = micros(); while (!mqttClient.connected()) { Serial.println(F("Attempting MQTT connection...")); // Create a random client ID String clientId = "ESP8266Client-AkkaMonitor"; //clientId += String(random(0xffff), HEX); // Attempt to connect if (mqttClient.connect(clientId.c_str())) { Serial.println(F("MQTT connected")); // Once connected, publish an announcement... mqttClient.publish("AkkaMonitor/reconnect", "reconnect"); // ... and resubscribe mqttClient.subscribe("AkkaMonitor/inTopic"); } else { Serial.print("failed, rc="); Serial.print(mqttClient.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } start = micros()-start; pubTime = start/1000; Serial.print("MQTT reconnect trval: "); Serial.println(pubTime); } void setup_wifi(){ unsigned long start = micros(); IPAddress ip( 192, 192, 192, 192 ); IPAddress gateway( 192, 192, 192, 1 ); IPAddress subnet( 255, 255, 255, 0 ); WiFi.forceSleepWake(); delay( 1 ); WiFi.persistent( false ); // vypiname ukladani nastaveni spojeni do flash; zdůvodu opotřebení WiFi.mode( WIFI_STA ); // rezim stanice (klient) WiFi.config( ip, gateway, subnet ); WiFi.begin("NejakeSSID", "NejakeHeslo"); //SSID, heslo Serial.println(); Serial.print(F("Pripojeni trvalo (ms): ")); while (WiFi.status() != WL_CONNECTED) { delay(20); //Serial.print(WiFi.status()); } start = micros()-start; wifiTime = start/1000; Serial.print(wifiTime); Serial.println(); //Serial.print("Connected, IP address: "); //Serial.println(WiFi.localIP()); WiFi.printDiag(Serial); } void setup() { //pinMode(BUILTIN_LED, OUTPUT); // pro MQTT PubSub: Initialize the BUILTIN_LED pin as an output //digitalWrite(BUILTIN_LED, LOW); // builtin led potlačena, jelikož je na ní wake up signál z deep sleepu pinMode(D0, WAKEUP_PULLUP); // nastavujeme D0 na wakeup Serial.begin(115200); Wire.begin(); setup_wifi(); //MQTT mqttClient.setServer(mqtt_server, 1883); mqttClient.setCallback(callback); } void loop() { float napeti=0; mqttClient.loop(); //mqtt member if (!mqttClient.connected()) { reconnect(); } int adcread=(analogRead(0)); napeti= (float)(map(adcread, 0, 1024, 0, 14490))/1000; Serial.print(F("ADC A0: "));Serial.print(adcread);Serial.print(F(" DEC, ")); Serial.print(F("Napětí: "));Serial.print(napeti);Serial.println(F(" V")); //snprintf(str, sizeof(str), "%.2f", f); snprintf(msg, 6, "%.2f", napeti); Serial.print("napeti: "); Serial.println(napeti); Serial.print("wifiTimeMilis: "); Serial.println(wifiTime); Serial.print("pubTime: "); Serial.println(pubTime); mqttClient.publish("AkkaMonitor/napeti", msg); //MQTT posílá zprávu pod topicem AkkaMonitor/napeti mqttClient.publish("AkkaMonitor/wifiTimeMilis", ltoa(wifiTime, msg, 10)); //Doba, kterou trva pripojeni k Wifi AP mqttClient.publish("AkkaMonitor/pubTime", ltoa(pubTime, msg, 10)); // Doba, kterou trvá připojení k mqtt brokeru //Read the reply from the server while (espClient.connected()) if (espClient.available()) espClient.read(); //mqttClient.disconnect(); yield(); ESP.deepSleep(120000000, WAKE_NO_RFCAL); // 120 sec. WAKE_NO_RFCAL WAKE_RF_DEFAULT }
![](/wiki/lib/exe/fetch.php?w=200&tok=1bd534&media=project:adc0_01.jpg)
![](/wiki/lib/exe/fetch.php?w=200&tok=db5584&media=project:ad0_02.jpg)
![](/wiki/lib/exe/fetch.php?w=200&tok=3db7c0&media=project:ad0_03.jpg)
![](/wiki/lib/exe/fetch.php?w=200&tok=b8977b&media=project:adc0_04.jpg)
Node-red editor
Takto by se vám měl po přihlášení, zobrazit editor node-redu sprázdným pracovním prostorem. Případně bez přihlášení, pokud jste zabezpečení nepotřebovali.
Nejprve bude potřeba vytvořit ve sloupci vpravo layout dashboardu. Vytvoříte si vlastní uzel, kde vyplníte Name a pod ním skupinu. Podle toho jak budete přidávat různé grafické prvky, tak bude pak možno na tomto místě měnit pořadí. V tabu Site si lze nastavit rozměry základní dlaždice. V mém případě jsem nastavil 64×64 pro 1×1
Nyní k popisu uzlů, které jsem použil. Rozdělil jsem si to vizuálně na 3 svislé části.
První část
První jsou vstupy AkkaMonitor/napeti, wifiTimeMilis, pubTime. Tyto vstupy beru jako mqtt subscriber ze serveru, který je jako local MQTT broker. Do názvu jsem dal IP adresu serveru a standardní port 1883. Topic AkkaMonitor/napeti, který odpovídá posílanému topicu v kódu programu. Pozor na lomítka. Pokud napíšeš /Akkamonitor/napeti, tak se jedná o jiný topic.
Druhá část
“msg.payload”, jde o prvek s názve debug, který ve svých vlastnostech vypisuje hodnoty ze subscribera. Dále je tu žlutý switch, který pouští hodnoty, až když je splněna podmínka. Chová se jako switch-case v C++ Nastavenu má podmínku pro napětí “pokud je hodnota 3-11” Na 10,5 V začíná pro baterii kritický stav, kdy se může začít vybíjet i bez odběru a může dojít k trvalé degradaci kapacity
Třetí část
Výstupy do grafických prvků. “VU” metry, grafy a odeslání informací na mail. V defaultním nastavneí to pošle jako předmět emailu topic a jako obsah emailu hodnotu napětí.