Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Fersk på Arduino, trenger et lite tips


bjwanvik

Anbefalte innlegg

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 :P )
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...

Lenke til kommentar
Del på andre sider

  • 2 uker senere...

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.

image.thumb.png.8f064c10cee2a45e11e6848287e91dc4.png

Som en ser så er det stadig små endringer, og da går dette fint:

image.thumb.png.8837f54c0c7956bbd1d1e8c45749a13e.png

 

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! :D

Lenke til kommentar
Del på andre sider

// 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 av Christoffer
typos
  • Like 1
Lenke til kommentar
Del på andre sider

  • 9 måneder senere...

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()

 
Lenke til kommentar
Del på andre sider

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.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.