Arbeitsblatt 3

Aufgabe 1 Einlesen Temperatur ab einem 1-wire Sensor

Versuchsaufbau


Der Versuchsaufbau ist ziemlich simpel: Da ich mich für das bereits mit Widerstand ausgerüstete Modul entschieden habe, muss dieses nur mit 5V, Ground und einem Data-Pin verbunden werden.

Code

1wire.ino
// Adafruit_DHT library importieren
#include "DHT.h"
 
// Sensor Initialisieren
// Port: 2 Modell: DHT11
DHT dht(2, DHT11);
 
void setup() 
{
  Serial.begin(9600);
  // Der erste Output an den Serial-Port bestimmt die Achsenbeschriftung des Serialpltters.
  Serial.println("Temperatur,Humidity");
 
  // Messbeginn
  dht.begin();
}
 
// Loop
void loop() {
 
  // 0.5 Sekunden delay
  delay(500);
 
  // Feuchtigkeit messen
  float h = dht.readHumidity();
  // Temperatur messen
  float t = dht.readTemperature();
 
 
  // Serieller Output, Werte mit Komma separiert.
  Serial.print(String(t));
  Serial.print(",");
  Serial.println(String(h));
}

Aufgabe 2 Inbetriebnahme Arduino über eine I2C Verbindung

Versuchsaufbau


Video mit Arduino in Action: https://www.youtube.com/watch?v=BFT65pz0ZQ8

Code

Gemäss Arbeitsblatt:

Master

master.ino
#include <Wire.h >
int anzahlBlinksMaster = 0;
void setup() {
  Wire.begin();
  pinMode(13, OUTPUT);
  delay(100);
  rufeWertAb();
}
void loop() {
  if (anzahlBlinksMaster > 0) {
    for (int i = 0; i < anzahlBlinksMaster; i++) {
      digitalWrite(13, HIGH);
      delay(300);
      digitalWrite(13, LOW);
      delay(300);
    }
    delay(3000);
  }
}
void rufeWertAb() {
  byte buf[2];
  int n = Wire.requestFrom(10, 2);
  for (int i = 0; i < n; i++) {
     buf[i] = Wire.read();
  }
  anzahlBlinksMaster = setzeZahlZusammen(buf[1], buf[0]);
}
int setzeZahlZusammen(unsigned int high, unsigned int low) {
  int kombiniert;
  kombiniert = high;
kombiniert = kombiniert * 256; kombiniert |= low;
return kombiniert;
}

Slave

slave.ino
#include <Wire.h>
int anzahlBlinks = 8;
void setup() {
  Wire.begin(10);
  Wire.onRequest(antwortfunktion);
}
void loop() {
  delay(10);
  }
void antwortfunktion(){
  byte buffer[2];
  buffer[0] = lowByte(anzahlBlinks);
  buffer[1] = highByte(anzahlBlinks);
  Wire.write( buffer, 2);
}

Aufgabe 3 Übertragen von Temperatur-Werten über eine I2C Verbindung

Versuchsaufbau


Für den Arduino Nano verwende ich denselben Versuchsaufbau wie bei Aufgabe 1, um die beiden Arduinos zu verbinden den Aufbau von Aufgabe 2.

Code

Im Gegensatz zu Aufgabe 2 übertragen wir hier ein Wert vom Typ Float und kein Integer. Daher muss dieser zuerst in ein Bytearray konvertiert werden, bevor er übertragen werden kann.

Master

temp-i2c-master.ino
#include <Wire.h >
void setup() {
  Wire.begin();
  pinMode(13, OUTPUT);
  delay(100);
  Serial.begin(9600);
  float temperature = 0.0;
}
void loop() {
  Serial.println("Temp: " + (String)getTemp());
    delay(3000);
}
float getTemp() {
 String dataString = "";
  Wire.requestFrom(10, 7);
  while (Wire.available()) {
    char c = Wire.read();
    dataString = dataString + c;
  }
  return dataString.toFloat();
}

Slave

temp-i2c-slave.ino
// Adafruit_DHT + Wire library importieren
#include "DHT.h"
#include <Wire.h> 
DHT dht(2, DHT11);
char Buff[7];
float t;
void setup() {
  Wire.begin(10);
  Wire.onRequest(response);
  dht.begin();
}
// Loop
void loop() {
  delay(10);
  t = dht.readTemperature();
}
void response(){
 
  dtostrf(t,7,2, Buff);
  Wire.write(Buff);
}

Aufgabe 4 Verbindung von zwei Arduino über eine Serielle Verbindung

Versuchsaufbau


Der Slavearduino wird via VIN-Port mit 5V vom Master versorgt, die Arduinos mit den TX und RX-Ports miteinander verbunden. Hier muss beachtet werden, dass der TX (Transmit) Port des Masters mit dem RX (Receive) Port des Slaves und umgekehrt verbunden werden muss. Zudem ist nach dem Anschliessen der Arduinos kein Upload von Code mehr möglich, bis die Verbindungen wieder getrennt werden.

Code

Master

serial-master.ino
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Hello World!");
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}

Slave

serial-slave.ino
int data = 0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()>0){
    data = Serial.read();
    Serial.print((char)data);
  }
 
}

...Und es funktioniert!

Lessons learned

Am einfachsten ist die Übertragung von Daten per Serial-Port, allerdings können so maximal zwei Geräte miteinander verbunden werden, während per I2C etc. mehrere Geräte adressiert werden können.