bjwanvik Skrevet 7. mars 2022 Del Skrevet 7. mars 2022 I helga fikk jeg tak i en Arduino og begynte å fikle litt med den, men dessverre er jeg ikke noe særlig til programmerer... (Jeg er der at jeg får til litt enkel VB, tildels forstår kildekoden på jobb (som oftest Java) og kan gjøre enkle endringer, men det er i situasjoner hvor jeg både kjenner databasen ut og inn og kjenner funksjonaliteten til programmet eller integrasjonen jeg feilsøker på et veldig godt nivå - her blir det noe ganske annet når jeg verken helt ser funksjonaliteten eller forstår språket..) Jeg fant noe eksempelkode på bruk av en ultralydsensor som fungerte helt greit, så satte jeg bare sammen med info jeg fant lett tilgjengelig om de libraryene som benyttes for å koble til wifi og mqtt. Dette fungerer helt fint, men så kom jeg til å tenke på; hva om strømmen går? eller hva om serveren går ned? (Arduinoen skal stå i garasjen og der er ikke nettverket på UPS (enda), så det kommer til å ta myyyye lengre tid å få opp nettverket etter evt strømbrudd enn det tar å starte Arduinoen. Skulle serveren gå ned (som jeg har simulert med å slå av mqtt-plugin mange ganger i kveld) later det til at Arduinoen tror at alt er i skjønneste orden, og den pøser bare på med meldinger og later som ingen ting har hendt.. Lite gunstig, og det etableres jo ingen ny kontakt med serveren så fort plugin er aktivert igjen. (Så er det ikke sånn at jeg er plaget noe særlig med verken strømbrudd eller at serveren faller ned, men jeg vil sikre meg for jeg er helt sikker på at den Arduinoen ikke er det første jeg kommer til å tenke på om ting skulle slutte å virke ) Dessverre har jeg ikke klart å googlet meg frem til noen løsning som sjekker om tilkobling (både wifi og mqtt) er i orden, så jeg tenke å spørre om det er noen her som har det klart? Evt ser noe helt åpenbart jeg kunne endret i koden for å få inn en sånn sjekk. // ArduinoMqttClient - Version: Latest #include <ArduinoMqttClient.h> #include <WiFiNINA.h> #include <ArduinoMqttClient.h> ///////please enter your sensitive data in the Secret tab/arduino_secrets.h char ssid[] = SECRET_SSID; // your network SSID (name) char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) int status = WL_IDLE_STATUS; // the Wifi radio's status // ---------------------------------------------------------------- // // Arduino Ultrasoninc Sensor HC-SR04 // Re-writed by Arbi Abdul Jabbaar // Using Arduino IDE 1.8.7 // Using HC-SR04 Module // Tested on 17 September 2019 // ---------------------------------------------------------------- // #define echoPin 2 // attach pin D2 Arduino to pin Echo of HC-SR04 #define trigPin 3 //attach pin D3 Arduino to pin Trig of HC-SR04 // defines variables long duration; // variable for the duration of sound wave travel int distance; // variable for the distance measurement WiFiClient wifiClient; MqttClient mqttClient(wifiClient); const char broker[] = "ip"; int port = port; const char topic[] = "avstand_i_garasje"; //const char topic2[] = "real_unique_topic_2"; //const char topic3[] = "real_unique_topic_3"; //set interval for sending messages (milliseconds) const long interval = 8000; unsigned long previousMillis = 0; int count = 0; void setup() { //Initialize serial and wait for port to open: // Serial.begin(9600); // while (!Serial); // attempt to connect to Wifi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to network: "); Serial.println(ssid); // Connect to WPA/WPA2 network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } // you're connected now, so print out the data: Serial.println("You're connected to the network"); Serial.println("----------------------------------------"); printData(); Serial.println("----------------------------------------"); pinMode(trigPin, OUTPUT); // Sets the trigPin as an OUTPUT pinMode(echoPin, INPUT); // Sets the echoPin as an INPUT Serial.begin(9600); // // Serial Communication is starting with 9600 of baudrate speed Serial.println("Ultrasonic Sensor HC-SR04 Test"); // print some text in Serial Monitor Serial.println("with Arduino UNO R3"); Serial.print("Attempting to connect to the MQTT broker: "); Serial.println(broker); if (!mqttClient.connect(broker, port)) { Serial.print("MQTT connection failed! Error code = "); Serial.println(mqttClient.connectError()); while (1); } Serial.println("You're connected to the MQTT broker!"); Serial.println(); } void loop() { // check the network connection once every 10 seconds: delay(1000); printData(); Serial.println("----------------------------------------"); // Clears the trigPin condition digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin HIGH (ACTIVE) for 10 microseconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH); // Calculating the distance distance = duration * 0.034 / 2; // Speed of sound wave divided by 2 (go and back) // Displays the distance on the Serial Monitor Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); } void printData() { /* Serial.println("Board Information:"); // print your board's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); Serial.println(); Serial.println("Network Information:"); Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.println(rssi); byte encryption = WiFi.encryptionType(); Serial.print("Encryption Type:"); Serial.println(encryption, HEX); Serial.println(); */ // call poll() regularly to allow the library to send MQTT keep alive which // avoids being disconnected by the broker mqttClient.poll(); unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time a message was sent previousMillis = currentMillis; //record random value from A0, A1 and A2 int Rvalue = (distance) ;//analogRead(A0); // int Rvalue2 = analogRead(A1); // int Rvalue3 = analogRead(A2); Serial.print("Sending message to topic: "); Serial.println(topic); Serial.println(Rvalue); mqttClient.beginMessage(topic); mqttClient.print(Rvalue); mqttClient.endMessage(); Serial.println(); } } /* void connectMQTTClientIfNeeded() { if (!mqttClient.connected()) { Serial.println("mqtt client not connected"); // mqttClient.connect(broker, port); } // // tasks.after(30000, connectMQTTClientIfNeeded); // after 30 seconds call connectMQTTClientIfNeeded() again } */ (Så skal jeg naturligvis rydde opp litt i koden når jeg har fått det til å virke som jeg vil. Får skylde på at jeg er litt i tåka etter Corona... Siter Lenke til kommentar Del på andre sider Flere delingsvalg…
bjwanvik Skrevet 18. mars 2022 Forfatter Del Skrevet 18. mars 2022 Fant en annen løsning 🤡 Benytter den lille unøyaktigheten som er i måleren til min fordel, og lagde et event som tar strømmen fra Arduino dersom det ikke er kommet ny verdi på 2 minutter, så får den strøm igjen etter 15 sekunder. Som en ser så er det stadig små endringer, og da går dette fint: Ikke akkurat verdens mest elegante løsning, men det fungrer så langt 100%. ...og må vel være et kjempeeksempel på over-engineering på noe som egentlig ikke er noen sak i det hele tatt, men du verden så komfortabelt det er! Siter Lenke til kommentar Del på andre sider Flere delingsvalg…
Christoffer Skrevet 18. mars 2022 Del Skrevet 18. mars 2022 (endret) // ArduinoMqttClient - Version: Latest #include <ArduinoMqttClient.h> #include <WiFiNINA.h> #include <ArduinoMqttClient.h> ///////please enter your sensitive data in the Secret tab/arduino_secrets.h char ssid[] = SECRET_SSID; // your network SSID (name) char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) int status = WL_IDLE_STATUS; // the Wifi radio's status // ---------------------------------------------------------------- // // Arduino Ultrasoninc Sensor HC-SR04 // Re-writed by Arbi Abdul Jabbaar // Using Arduino IDE 1.8.7 // Using HC-SR04 Module // Tested on 17 September 2019 // ---------------------------------------------------------------- // #define echoPin 2 // attach pin D2 Arduino to pin Echo of HC-SR04 #define trigPin 3 //attach pin D3 Arduino to pin Trig of HC-SR04 // defines variables long duration; // variable for the duration of sound wave travel int distance; // variable for the distance measurement WiFiClient wifiClient; MqttClient mqttClient(wifiClient); const char broker[] = "ip"; int port = port; const char topic[] = "avstand_i_garasje"; //const char topic2[] = "real_unique_topic_2"; //const char topic3[] = "real_unique_topic_3"; //set interval for sending messages (milliseconds) const long interval = 8000; unsigned long previousMillis = 0; int count = 0; void setup() { //Initialize serial and wait for port to open: // Serial.begin(9600); // while (!Serial); // attempt to connect to Wifi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to network: "); Serial.println(ssid); // Connect to WPA/WPA2 network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } // you're connected now, so print out the data: Serial.println("You're connected to the network"); Serial.println("----------------------------------------"); printData(); Serial.println("----------------------------------------"); pinMode(trigPin, OUTPUT); // Sets the trigPin as an OUTPUT pinMode(echoPin, INPUT); // Sets the echoPin as an INPUT Serial.begin(9600); // // Serial Communication is starting with 9600 of baudrate speed Serial.println("Ultrasonic Sensor HC-SR04 Test"); // print some text in Serial Monitor Serial.println("with Arduino UNO R3"); Serial.print("Attempting to connect to the MQTT broker: "); Serial.println(broker); if (!mqttClient.connect(broker, port)) { Serial.print("MQTT connection failed! Error code = "); Serial.println(mqttClient.connectError()); while (1); } Serial.println("You're connected to the MQTT broker!"); Serial.println(); } void loop() { // check the network connection once every 10 seconds: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to network: "); Serial.println(ssid); // Connect to WPA/WPA2 network: status = WiFi.begin(ssid, pass); delay(5000); if (!mqttClient.connected()) { Serial.println("mqtt client not connected"); // mqttClient.connect(broker, port); delay(5000); } delay(1000); printData(); Serial.println("----------------------------------------"); // wait 10 seconds for connection: delay(10000); // Clears the trigPin condition digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin HIGH (ACTIVE) for 10 microseconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH); // Calculating the distance distance = duration * 0.034 / 2; // Speed of sound wave divided by 2 (go and back) // Displays the distance on the Serial Monitor Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); } void printData() { /* Serial.println("Board Information:"); // print your board's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); Serial.println(); Serial.println("Network Information:"); Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.println(rssi); byte encryption = WiFi.encryptionType(); Serial.print("Encryption Type:"); Serial.println(encryption, HEX); Serial.println(); */ // call poll() regularly to allow the library to send MQTT keep alive which // avoids being disconnected by the broker mqttClient.poll(); unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time a message was sent previousMillis = currentMillis; //record random value from A0, A1 and A2 int Rvalue = (distance) ;//analogRead(A0); // int Rvalue2 = analogRead(A1); // int Rvalue3 = analogRead(A2); Serial.print("Sending message to topic: "); Serial.println(topic); Serial.println(Rvalue); mqttClient.beginMessage(topic); mqttClient.print(Rvalue); mqttClient.endMessage(); Serial.println(); } } /* void connectMQTTClientIfNeeded() { if (!mqttClient.connected()) { Serial.println("mqtt client not connected"); // mqttClient.connect(broker, port); } // // tasks.after(30000, connectMQTTClientIfNeeded); // after 30 seconds call connectMQTTClientIfNeeded() again } */ (Så skal jeg naturligvis rydde opp litt i koden når jeg har fått det til å virke som jeg vil. Får skylde på at jeg er litt i tåka etter Corona... Hei, kopierte linjene fra void setup(): while (status != WL_CONNECTED) { Serial.print("Attempting to connect to network: "); Serial.println(ssid); // Connect to WPA/WPA2 network: status = WiFi.begin(ssid, pass); delay(5000); ) if (!mqttClient.connected()) { Serial.println("mqtt client not connected"); // mqttClient.connect(broker, port); delay(5000); } Der sjekkes det om WiFi er koblet til og det blir ikke gjort noe i koden før du har tilkobling til WiFi. Det sjekkes så om MQTT er koblet og hvis det ikke er det så kobles det til igjen. Denne kan kanskje legges i en While loop slik at den ikke går videre før MQTT er koblet til igjen. Dette er ikke en god løsning hvis det skal styres noe lokalt feks uavhengig av WiFi og MQTT, men i dette tilfellet går det greit Endret 20. mars 2022 av Christoffer typos 1 Siter Lenke til kommentar Del på andre sider Flere delingsvalg…
Fredleif Skrevet 13. januar 2023 Del Skrevet 13. januar 2023 Jeg har gjort noe tilsvarende for å sjekke tilkopling. Dette er en ESP32 MKR WiFi 1010 som jeg kjører som en WebHost i drivhus, WiFi signalnivå er på kanten akseptabelt så det hender at den faller ut. Jeg fant ut at jeg kan sjekke forbindelse med Ping mot husets ruter, det funka. Jeg henter ut info med html-kode på verten så jeg kan hente ut drivhusdata vha nettleser på PC eller telefon. Kjekt når man er borte. Og hvis jeg ikke får opp noe i nettleseren så har vel ESP'n lagt seg død. Strømmen til ESP'n er koplet via en Telldus nettbryter, så da kan jeg også fjernstyre av/påslag av strøm til den manuelt. I loop() sjekkes om det er en client som har bedt om data, forut for dette sjekkes om WiFi er oppegående: Fra koden, dette ligger i loop(): // Sjekk om det er kontakt over WiFi. if (!CheckWiFi_Ping()) // True or false CheckWiFi_Connected(); // Gjør en sjekk og kopler opp på ny inntil suksess // First, we use client to check if the server is av ailable. If it is, we execute the printWEB() function. client = server.available(); // Sjekker om det er client, men ikke om det er forbindelse på WiFi // WiFiClient client = server.available(); ///////////////// if (client) { printWEB(); // Skriver ei webside i html til client Funksjoner for de to kallene er her: // //////////////////////////////////////////////////////////////// // CheckWiFi_Connected() // Ping gir svartid i ms, eller feil ved <0 // Sjekk først 4x om ping gir svar, // ellers prøv en disconnect & connect // Kun rød LED ved start, alle avslått etter testen bool CheckWiFi_Ping() { bool WiFi_OK; int i = 0; IPAddress localServer(192, 168, 1, 1); // Lokal ruter 192.168.1.1. Vil ruteren svare? int serverResult; // Svar fra ping // Sett lilla LED på ved starten av Ping. Kort blink ved OK, lenge ved noresponse farg = Set_Colour((byte)LILLA); serverResult = WiFi.ping(localServer); for (i = 0; i < 4; i++) { if (serverResult >= 0) { WiFi_OK = true; i = 4; /// Terminer for-loop if (Debug_request) { Serial.print("PING ok! RTT = "); Serial.print(serverResult); Serial.println(" ms"); } } else { WiFi_OK = false; /* if(Debug_request) Serial.println("Rød"); delay(500); // Vent litt før neste ping() */ // Unødvendig kode? if (Debug_request) { Serial.print("PING FAILED! Error code: "); Serial.println(serverResult); } } } // End of for i++ farg = Set_Colour((byte)SVART); return (WiFi_OK); } // End of Ping //////////////////////////////////////////// // Sjekk om WiFi forbndelse er ok // Sjekk om status er OK void CheckWiFi_Connected() { unsigned long currentMillis = millis(); // if WiFi is down, try reconnecting every CHECK_WIFI_TIME seconds while ((WiFi.status() != WL_CONNECTED) && (currentMillis - WFpreviousMillis >= WFinterval)) { farg = Set_Colour((byte)GRONN); if (Debug_request) Serial.println("WiFi FRAKOPLET!!"); /*if (currentMillis - WFpreviousMillis >= 108000){ // Sjekk for uendelighet, 30 min = 30*60*60 break; WiFiConn = false; }*/ // Prøv å kople fra og til WiFi WiFi.disconnect(); delay(1000); farg = Set_Colour((byte)SVART); //Blink RED connect_WiFi(); // Kall funksjonen WFpreviousMillis = currentMillis; delay(5000); } // End of while status } // End of CheckWiFi_Connected() Siter Lenke til kommentar Del på andre sider Flere delingsvalg…
Anbefalte innlegg
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.