När du har flera saker som på olika sätt ska kommunicera med varandra – och speciellt när du vill ändra om ofta – är det väldigt tidsödande och jobbigt att göra detta i varje enhet. Därför bör du ha en enda plats där du beskriver hur de olika enheterna kopplas ihop och där du kan göra vissa inställningar direkt. Men det finns även nackdelar med en sådan lösning. Det kan bli en sårbar lösning att göra så här – du har en enskild punkt som kan rasera hela systemet. Men för att labba och lära sig är det mycket lättare att ha ett enda ställe än att ha uppsättningen utspridd över alla noder. En utspridd lösning är dock robustare eftersom delar av systemet kan fortsätta fungera även om en eller flera noder rasar eller den centrala delen försvinner. En metod du kan nyttja för att få fördelen av bägge är att försöka undvika skicka värden från den centrala platsen och istället skicka ut beskrivningar av inställningar. Det är en bra princip att enheterna i möjligaste mån ska kunna operera vidare utan nya sensorvärden.

För att få till en server är, som jag beskrev i del 1, Raspberry Zero W en billig lösning och Node-RED en lämplig mjukvara. Node-RED blir som en kopplingscentral. Det är relativt enkelt att skicka in information och även få ut något från Node-RED. Du kan även skriva små bitar av kod som påverkar informationen i en koppling. Så i den här delen kommer jag beskriva det hela genom att skapa en tjänst som kopplar ihop avståndsmätaren med ett servo och styr det.

Jag kommer dela upp detta i tre delar, först hur du får upp Raspberry och Node-RED. Sedan går jag igenom den kod som behövs för att noderna ska prata med Node-RED; en del för avståndsmätaren och en del för servot. Och till sist avslutar jag med att i Node-RED koppla ihop mätaren med servot.

IoT: Testa node Red

Konfigurera MQTT-noden att koppla mot brokern och prenumerera på test/message. Klicka på noden och följande syns.

IoT: Konfigurera MQTT

Klicka på pennan bredvid Add new mqtt-broker och följande öppnas.

IoT: Lägg till ny MQTT

Fyll i localhost i server och klicka på Add. Och fyll sedan i text/message som Topic.

IoT: Fyll i local host

För att se meddelandena som kommer in är det lämpligt att koppla en debug nod till MQTT-noden. Leta upp den i listan och dra in på ytan och dra sedan en koppling mellan noderna.

IoT: Koppla debug-nod

Klicka på Deploy uppe i högra hörnet. Och sedan på den lilla skalbaggen för att få upp debug fliken. Testa igen att skicka Hello, world till ämnet; det ska då dyka upp i Node-RED.

Skicka MQTT från avståndsmätaren

För att skicka och ta emot MQTT-meddelanden på ESP-noderna är PubSubClient lämplig. Så börja med att lägga till det i Arduino utvecklingsmiljön, version 2.7.0 när detta skrevs. I del 2 beskrev jag hur du lägger till bibliotek.

I del 2 skapade jag ett litet program för att mäta avstånd med avståndsmätaren. Bitar av den koden kan återanvändas, men programmet behöver också ansluta till nätet samt skicka MQTT-meddelanden. Kodbiten som mäter avståndet gör jag om till en funktion. Från webbexemplet i del 2 återanvänder jag hur du ansluter till Wifi-nätet. Och sedan tillkommer kod för att ansluta till brokern och skicka avståndet med jämna mellan rum till den.

Copy to Clipboard

Kopiera in koden till en skiss i Arduino-utvecklingsmiljön. Kom ihåg att ändra networkname och secretpassword för nätverket och sedan MQTT_BROKER_IP till det IP-nummer Raspberryn har.

Koppla upp elektroniken och ladda över koden. Starta monitorn för att se att koden ansluter till nätet och brokern. Gå sedan till Node-RED och ändra om så att det flöde som skapades innan istället lyssnar till sensor/distance och deploya flödet. Nu ska det komma in avstånd och skrivas ut i debug fliken.

Ta emot MQTT på servot

För att istället ta emot meddelanden och styra servot med dem behöver du inte ändra så mycket i koden ovan. Delarna som mäter avstånd behövs inte längre och du får lägga till styrningen av servot samt ändra om så att koden prenumererar på meddelanden i ett rätt ämne. Jag har valt att kalla ämnet servo/position. I del 2 skrev jag en kod för att styra servot så där kan vi ta bitar från nu också.

Copy to Clipboard

Kopiera över koden till Arduino-utvecklingsmiljön och kom ihåg att igen ändra networkname och secretpassword för nätverket och sedan MQTT_BROKER_IP till det IP-nummer Raspberryn har.

Koppla sedan upp elektroniken för servot och ladda över koden till ESPn. Starta monitorn för att se att koden ansluter till nätet och brokern. Gå tillbaka till Node-RED och lägg till en MQTT out-nod och ändra om så att den skickar meddelanden på ämnet(topic) servo/position.

Dra in en Inject-nod på arbetsytan så du kan använda den för att skicka meddelanden.

IoT: Inject Nod

Dubbelklicka på Inject-noden, ändra att den ska skicka ett nummer och skriv in till exempel 45.

IoT: Inject siffra

Deploya flödet och testa att klicka på knappen åt vänster på Inject-noden. Det ska leda till att noden skickade 45 och i monitorn ska du se att ESP tog emot 45, samt att servot vred sig.

Koppla ihop avståndsmätaren med servot

Dags att koppla ihop dessa två uppkopplade enheter och det gör du i Node-RED. I flödet finns redan en nod som tar emot meddelanden från avståndsmätare. Värden som varierar mellan 2-3 cm upp till 430-450 cm. Och noden som styr servot vill ta emot värden mellan 0 och 180. Så du behöver på något sätt omvandla de ingående värdena till lämpliga utgående värden. Just för dessa fall finns en nod som heter Range som du kan nyttja. Dra in den noden och ställ in den så att den skalar om och begränsar. För in anger du spannet 2 till 400 och ut 0 till 180. Kryssa sedan i att den ska avrunda till närmaste heltal.

IoT: Avstånd servo

Nu tror man att det bara skulle vara att koppla ihop MQTT-mottagaren med denna nod och sedan den utgående. Men de inkommande värden kommer som en sträng, och längst ned i inställningarna för Range-noden står att den BARA fungerar för siffror. Så det behövs en nod till. I en Function-nod kan du skriva in valfri kod och därmed lätt lägga in kod som gör om strängen till en siffra. Dessa noder kodas i Javascript och den kod du vill ha är:


return { payload: parseInt(msg.payload) };

Mellan noder i Node-RED skickas meddelanden och i funktionsnoden når du dessa via msg-variabeln. De har en payload-del som innehåller resultatet från föregående nod. Så med parseInt() omvandlar du msg.payload till en siffra. Ut ur noden måste du skicka ett objekt som ska bli meddelandet ut, och värdet lägger du i payload. Så denna nod kopplar du in före Range-noden och Range kommer få in siffror istället för strängar.

Hela flödet ser ut som följande:

IoT: Flödet

Debug-noden är utmärkt att koppla in på olika ställen i flödet för att kunna undersöka vad som skickas mellan noder.

Då är det dags att testa att servot flyttar på sig när avståndet framför sensorn ändras. Om det hela känns lite segt beror det på att koden bara läser av avståndet en gång i sekunden.

Efter denna lilla introduktion, samt med de olika bitarna av kod, kan du nu rätt enkelt få in alla de sensorer och aktuatorer i Node-RED. Sedan är det bara fantasin som sätter gränser för vad som kan skapas.

Därmed avslutas denna serie. Hoppas denna lilla inblick i sakernas internet lockat fram mer energi till att utforska området. Kontakta mig på karl-petter.akesson@forefront.se om du har några frågor! Eller berätta om något spännande du skapat med den här kunskapen.

Samtliga delar i serien

» Så kommer du igång med IoT: Del 1 (Publicerades 10 december 2019)

» Så kommer du igång med IoT: Del 2 – Programmering (Publicerades 20 december 2019)

» Så kommer du igång med IoT: Del 3 – Koppla över Internet (Publicerades 14 januari 2020)