Arduino koden våres sender MQTT meldinger over wifi. Det er brukt port forwarding for at man kan publisere data til MQTT brokeren fra ulike nettverk. Koden kan deles inn i tre deler: oppsett, konfigurasjon og loops. Vi bruker bibliotekene ArduinoMqttClient.h som lar arduinoen kommunisere med MQTT servere og WifiNINA.h som brukes for WiFi tilkobling. Char ssid og char pass er arrays som lagrer nettverkets sin SSID og passord. Det er nettverket som Arduinoen vil koble seg til.  Broker og port spesifiserer adressen og porten den lytter til, og MQTT emnene "Imsdal" og "Olden" blir brukt for å publisere meldingene. 


buildEncoderArray() leser bits fra enkoderene for å bestemme posisjonen deres. Klokkesignalet PIN_CLOCK toggles (setter verdi høy og lav), og gjør at enkoderen sender neste bit med data, dette gjentas for hver bit som skal leses. Bitsene lagres i en array kalt bitStream og arduinoen leser totalt 16 bits. De 10 første bitsene er posisjondata og lagres i bitStream. Deretter beregnes posisjonen og legges til i encoderPos. Etter posisjonen er regnet, så sjekker den om enkoderen har hatt en full rotasjon (zero cross). Dette gjøres ved å sjekke om den gamle posisjonen var større enn 1021 og den nye er over 3, og omvendt. 


convertToByteVector() tar enkoderposisjonene og konverterer dem til bytes, siden det er formatet roboten foretrekker. byteArrayToString() konverterer byte-arrayen til en string, for enklere kommunikasjon. 


Loopen våres sjekker knappen sin tilstand, og sender en boolsk melding 1 om trykket ned, og sender ellers 0. Den leser enkoderposisjonene og sender disse over MQTT. Siden MQTT går utifra at man er frakoblet etter en viss tid uten meldinger så sendes det konstant meldinger ved hjelp av mqttClient.poll. Millis() brukes for å sikre jevn sending av meldinger, og passer på at meldinger ikke hopes opp og lager kø.




Template used in creation of the Arduino code:

https://forum.arduino.cc/t/reading-a-bourns-magnetic-rotary-encoder-ems22a50-d28-lt6/923402 

  • No labels