Arbeitsblatt 4

Aufgaben 1-3

Da die Aufgaben 2-3 eine Erweiterung der Aufgabe 1 darstellen, erlaube ich mir, alle zusammenzufassen.

Hinweis zu Aufgabe 2: Ich wollte anstelle eines Knopfes ein Potentiometer einbauen, damit die Ausgabewerte interessanter werden. Leider hatte ich kein Potentiometer zur Hand, weshalb ich stattdessen einen Lichtsensor eingebaut habe, welcher die Leuchtstärke der LED beeinflusst. Das IoT Szenario bei dieser Aufgabe ist also, dass ein Lichtsensor aussen platziert wird, und das Licht bei Sonnenuntergang automatisch hochgedimmt wird.

Versuchsaufbau

Sender

Empfänger

Code Sender

remote-sender.ino
// Hinweis: Datapin Transmitter: D12
// Adafruit_DHT library importieren
#include "DHT.h"
#include <RH_ASK.h>
#include <SPI.h>
 
char msg[16];
int brSensorPin = 0;
DHT dht(2, DHT11);
RH_ASK rf_driver;
 
void setup(){
  // Messbeginn
  dht.begin();
  rf_driver.init();
}
 
// Loop
void loop() {
 
 
  // Nachrichtentyp A: Temperatur + Luftfeuchtigkeit
  char type = 'A';
  sprintf(msg, "%c%d%d", type, (int)(dht.readHumidity()*100), (int)(dht.readTemperature()*100));
  sendMessage(msg, sizeof(msg));
  // Nachrichtentyp B: Lichtsensor (Könnnte z.B. mit einem Button ersetzt werden)
  type = 'B';
  sprintf(msg, "%c%d", type, (int)(analogRead(brSensorPin)));
  sendMessage(msg, sizeof(msg));
 
 
}
void sendMessage(char msg[], size_t size) {
  rf_driver.send((uint8_t*)msg, size);
  rf_driver.waitPacketSent();
  delay(1000);
}

Code Empfänger

remote-receiver.ino
// Hinweis: Datapin Receiver: 11
// RH_ASK + SPI.h inkludieren
#include <RH_ASK.h>
#include <SPI.h> 
 
// Amplitude Shift Keying Objekt erstellen
RH_ASK rf_driver;
 
int LEDPin = A0;
void setup()
{
    // rf_driver initialisieren
    rf_driver.init();
    //
    Serial.begin(9600);
    Serial.println("starting...");
}
 
void loop()
{
 
    uint8_t buff[16];
    uint8_t bufflen = sizeof(buff);
    // Überprüfen ob die Nachricht die korrekte Länge hat
    if (rf_driver.recv(buff, &bufflen))
    {
      char msg[16];
      // uint8_t Array zu Char Array konvertieren
      for (i=0 ; i<bufflen ; i++) msg[i] = (unsigned char)buff[i];
 
      // Temperatur + Luftfeuchtigkeit ausgeben
      if (msg[0] == 'A') {
        char output[40];
        int humi, temp;
        sscanf(msg, "%*c%4d%4d", &humi, &temp);
        sprintf(output,"Temperatur: %d\nFeuchtigkeit: %d\n", (int)((float)temp/100.), (int)((float)humi/100.));
        Serial.print(output);
      }
      // LED basierend auf der Raumhelligkeit dimmen.
      else if(msg[0] == 'B') {
        int brightness;
        sscanf(msg, "%*c%3d", &brightness);
        analogWrite(LEDPin, map(brightness, 140, 850, 255, 150));
      }
    }
}

Ergebnisse

Serieller Output


Serieller Output vom Receiver Arduino

LED

Ist es im Raum hell, wird die LED gedimmt:

Ist es im Raum dunkel, wird die LED Leistung erhöht:

Lessons learned

Bei meinem ersten Versuch hat die Übertragung leider nicht geklappt. Der Serial-Output beim Sender gab korrekte Werte aus, Am Sensor und dessen Auswertung lag es also nicht. Nun stellte sich also die Frage: Liegt der Fehler beim Sender oder beim Empfänger?
Um diese Frage zu beantworten habe ich meinen SDR-Empfänger benutzt, und auf 433 MhZ gelauscht:
Wie schön zu sehen ist, wird hier gesendet. Ich habe das Troubleshooting anschliessend auf den Empfänger fokussiert, und festgestellt, dass ich den falschen PIN für die Daten zum Transmitter erwischt habe.