IoT lessen/les 2

Uit Lab
< IoT lessen
Versie door Eelco (overleg | bijdragen) op 2 nov 2016 om 10:25 (Nieuwe pagina aangemaakt met '== Opdrachten: things en nodes == === Achtergrondmateriaal === Bij deze opdrachten hoort achtergrondmateriaal, met daarin o.a.: * de architectuur van de IoT-keten...')
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

Opdrachten: things en nodes

Achtergrondmateriaal

Bij deze opdrachten hoort achtergrondmateriaal, met daarin o.a.:

Voor het uitvoeren van de onderstaande opdrachten heb je dit materiaal nodig.

Aanpassen en controleren van een node (Arduino, ESP8266)

De eerste stap is om een node werkend te krijgen in de keten. Voor het programmeren van een node gebruik je de Arduino IDE.

Algemeen

Arduino

  • selecteer het bord: Arduino/Genuino Uno
  • selecteer de USB/COM-poort voor de Arduino Uno
  • maak een nieuwe schets, en kopieer daarin de Arduino-software
  • pas het mac-adres aan, volgens de gegevens op je Ethernet-shield
    • source r. 18 byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x4D, 0x61};
  • pas het adres (domain name of ip-address) van de MQTT-broker aan
    • source r. 22 const char* mqttServer = "mqttbroker";
  • vertaal deze schets, en laad deze naar de Arduino

ESP8266

  • selecteer het bord: NodeMCU 1.0
  • selecteer de USB/COM-poort voor de NodeMCU (ESP8266)
  • maak een nieuwe schets, en kopieer daarin de ESP8266-software
  • pas de gegevens van het lokale WiFi-netwerk aan:
    • const char* ssid = "networkname";
    • const char* password = "password";
  • pas het adres (domain name of ip-address) van de MQTT-broker aan
    • source r. 22 const char* mqttServer = "mqttbroker";
  • vertaal deze schets, en laad deze naar de ESP8266

Controleren van de node

Je kunt nu controleren of de node werkt:

  • in NodeRed: een MQTT-client naar dezelfde broker, met als subject:
    • +/+/+ - als je alle node-berichten wilt zien
    • node/xxxx/sensors - als je alleen je de sensoren van node xxxx wilt zien
  • met de sensor-knop op je node kun je nu een MQTT sensor-bericht sturen.
    • deze moet in NodeRed aankomen (bijv. in debug-venster)
  • vanuit NodeRed kun je een bericht sturen om de Led aan of uit te zetten:
    • topic: node/xxxx/actuators
    • message: {"led0": 1} of {"led0": 0}

Toevoegen van een sensor

Pushbutton-sensor

We voegen een button toe, bijv. aan pin 3

  • pas de pin-definities aan (r. 11 en volgende)
    • const int button1 = 3;
  • initialiseer de pin (in setup, r. 114 e.v.)
    • pinMode(button1, INPUT);
  • voeg de detectiecode toe in de loop (r. 138):
  if (digitalRead(button0) || digitalRead(button1)) {
    sensor0Publish();
    delay(200); // limit button repetition rate
  }
  • voeg de code toe voor het publiceren van het sensor-bericht (sensor0Publish, r.42):
  root["sensor0"] = digitalRead(button0);
  root["sensor2"] = digitalRead(button1);

Opmerking: we sturen nu een uitgebreider bericht als tenminste één van beide knoppen ingedrukt wordt. Aan de kant van de ontvanger (bijv. NodeRed) moet je dan weer uitzoeken welke knop ingedrukt is. Je kunt er ook voor kiezen om voor elk van de knoppen een apart bericht te sturen.

Opdracht: verander de code zo dat voor elke knop een afzonderlijk bericht gestuurd wordt.

(Vraag: wat doe je dan als beide knoppen tegelijk ingedrukt worden? Hoe kun je dat detecteren?)

Analoge sensor

We voegen een analoge sensor toe, bijvoorbeeld een temperatuursensor.

  • N.B. dit is alleen mogelijk bij de Arduino, deze heeft meerdere analoge ingangen; de ESP8266 heeft maar één analoge ingang.
  • pas de pin-definities aan (r. 11 en volgende)
    • const int tempsensor = A1;
  • (voor analoge inputs is geen initiatisatie nodig)initialiseer de pin (in setup, r. 114 e.v.)
  • NB: merk op dat we de interne referentiespanning gebruiken (1.1V, in setup):
    • analogReference(INTERNAL); //1.1V
  • in de loop veranderen we niets: we lezen beide sensoren tegelijk uit:
  if (millis() >= sensor1Timer) {
    sensor1Publish();
    sensor1Timer = sensor1Timer + sensor1Period;
  }
  • voeg de code toe voor het publiceren van het sensor-bericht (sensor1Publish, r.49):
  root["sensor1"] = analogRead(A0);
  root["sensor3"] = analogRead(A1);

Opmerking: we bemonsteren nu beide sensoren (licht, temperatuur) met dezelfde periode.

Opdracht: voer voor de temperatuur een andere periode in dan voor de lichtsensor. Je hebt dan ook een aparte publish-functie nodig.

Opdracht: zorg ervoor dat de temperatuur als geheel getal doorgegeven wordt, in 1/10 graden celsius (bijv.: 213 is 21,3 C).

Toevoegen van een actuator

We voegen een LED toe, bijv. aan pin 6

  • pas de pin-definities aan (r. 11 en volgende)
    • const int led1 = 6;
  • initialiseer de pin (in setup, r. 114 e.v.)
    • pinMode(led1, OUTPUT);
  • voeg de interpretatie-code toe bij het ontvangen van een actuator-bericht (callback, r.87)
      if (root.containsKey("led0")) {
        digitalWrite(led0, root["led0"]);
      }
      if (root.containsKey("led1")) {
        digitalWrite(led1, root["led1"]);
      }

Merk op dat de beide leds onafhankelijk van elkaar aangestuurd kunnen worden, zowel in afzonderlijke als in gezamenlijke mqtt-berichten.

Test dit uit met verschillende mqtt-berichten vanuit NodeRed.

Broadcast

In deze opdracht ga je je node aanpassen zodat deze ook broadcast-boodschappen ontvangt.

Als mqtt-topic voor de broadcast gebruiken we: node/all/actuators. Dit is een willekeurige keuze die geen conflict oplevert met de andere topics.

  • voeg de broadcast-string toe (r.30)
    • String actuatorTopic;
    • String broadcastTopic = "/node/all/actuators";
  • voeg een mqtt-subscribe toe voor dit topic (r. 102)
    • client.subscribe(actuatorTopic.c_str());
    • client.subscribe(broadcastTopic.c_str());
  • zorg dat in de call-back dit topic herkend wordt:
    • (strcmp(topic, actuatorTopic.c_str())==0 || strcmp(topic, broadcastTopic.c_str())==0)

In dit geval accepteren we dezelfde messages in de broadcast als in de normale (unicast) situatie. Als je dat niet wilt, kun je werken met twee afzonderlijke if-statements.

Je kunt in Node-Red nu een bericht vanuit een enkele node omzetten in een broadcast naar alle nodes.

Algemene vragen

  • de namen van de sensoren zijn hierboven zonder betekenis.
    • op welke plaatsen zou je hieraan een betekenis kunnen geven?
    • anders gezegd: waar koppel je "sensor1" aan "lichtsensor met LDR"?
    • en hoe ga je daarbij om met de verschillende eigenschappen van de sensor?