Arduino Grundlagen / 2018-11-07 / Matthias Edler-Golla, CC BY-SA 4.0


|



 



Themenübersicht

  • Arduino-Board UNO
  • Blinking LED
  • Verbinden von Computer & Arduino
  • Funktionsweise Breadboard
  • Farbcode der Widerstände
  • LED leuchtet animiert
  • Photo-Resistor (Fotozelle)
  • Photo-Resistor & LED
  • Photo-Resistor & LED & Piezo
  • Light Theremin
  • Temperatur-Sensor
  • Servo-Motor ansteuern
  • Temperatur-Anzeige analog
  • eigener Leitfähigkeits-Sensor
  • Feuchtigkeitssensor
  • Temperatur- und Luftfeuchtigkeits-Sensor-Kombination
  • Übersichtseite mit Sensoren für Arduino
  • Ultraschall-Abstandsmesser
  • LCD-Screen
  • Relais
  • Grove - Starter Kit for Arduino
  • Grove Beispiel

Physical Computing

Arduino Uno mit Ultraschall-Sensor, LCD-Display und Piezo-Modul

Physical Computing bedeutet im weitesten Sinne, interaktive, physische Systeme durch die Verwendung von Hardware und Software zu erstellen. Diese Systeme reagieren auf Ereignisse in der realen, analogen Welt und/oder wirken auf sie ein.

Wikipedia

Die Grundlagen in Processing bzw. P5.js sind ein guter Start ins Physical Computing – das Programmieren von Arduino verwendet fast die gleiche Entwicklungsumgebung und Programmiersprache…

Video Tutorials

Daniel Shiffmann hat eine ganze Reihe super Tutorials zu Processing, P5.js (und mehr gemacht)


Arduino-Board UNO

http://fritzing.org

  1. Das Arduino-Board bietet digitale Ein- und Ausgänge
  2. Das Arduino-Board bietet analoge Ein- und Ausgänge
  3. Das Board versorgt Komponenten (Sensoren, Aktoren…) mit Strom
  4. Das Board selbst wird per USB oder Netzteil (bzw. Batterie) versorgt

Es gibt noch sehr viele andere Arduino-Boards für unterschiedliche Einsatzzwecke!


Ardunio Blinking LED (Hardware)

Achtung

  1. Beim Bauen am Board muß immer die Stromversorgung bzw. der USB-Anschluss am Computer abgezogen sein! Sonst kann das Board kaputt gehen!
  2. Die LED muss richtig herum eingesteckt sein! Langes Bein bei 13, kurzes Bein bei GND

Die Farbe der LED ist egal!


Ardunio Blinking LED (Software)

https://www.arduino.cc/en/Main/Software

Arduino IDE

Macht Euch mit dem Buttons am oberen Rand des Fenster vertraut…

Arduino

// LED ein- und ausschalten

// Einstellungen am Anfang
void setup() {
  // LED auf 13 als OUTPUT
  pinMode(13, OUTPUT);
}

// diese Schleife läuft endlos…
void loop() {
  digitalWrite(13, HIGH);   // LED anschalten
  delay(1000);              // LED 1 sek anlassen
  digitalWrite(13, LOW);    // LED ausschalten
  delay(1000);              // LED 1 sek auslassen
}

Kopiert mal den Code und fügt ihn in Eure Arduino IDE ein…


Nachschlage-Werk (Reference)

Arduino hat ein „eingebautes“ Nachschlagewerk, dass auch offline funktioniert!

Dazu den gewünschten Begriff markieren und mit der rechten Mousetaste anklicken. Unter „Find in Reference“ wird dann ein Browserfenster geöffnet…

Klickt man dort auf Language, erhält man einen Überblick über die häufigsten Code-Elemente…


Arduino Code-Beispiele

direkt in der Arduino IDE enthalten


Verbinden von Computer und Arduino

Damit Ihr mit dem Arduino kommunizieren könnt, müsst Ihr das richtige Arduino-Board (hier Uno) und den richtigen Port auswählen!

Dann könnt Ihr den Blink-Sketch auf das Board hochladen und probieren, ob dieser funktioniert…


Übung 1: anders blinken

Schreibt einen eigenen Arduino-Sketch, der folgendes macht:

  1. Die LED ist 3 Sekunden an
  2. Die LED ist 0.5 Sekunden aus
  3. Die LED ist 0.5 Sekunden an
  4. die LED ist 2 Sekunden aus

…und dann geht es wieder von vorne los…

Sichert den Sketch unter doppelblink auf Eurem eigenen Rechner unter Dokumente>Arduino


Nur 5 mal leuchten

Die LED blinkt nur 5 mal und hört dann auf…

Arduino

int ledPin = 13; // an welchem Pin ist die LED angeschlossen?
int anzahl = 5; // Anzahl der Wiederholungen
int i = 0; // Variable zum Zählen
int vz = 500; // Verzögerung in Milisekunden

// Einstellungen am Anfang
void setup() {
  pinMode(ledPin, OUTPUT);          // LED auf Pin 13 als OUTPUT
}

void loop() {

  if (i < anzahl) {
    digitalWrite(ledPin, HIGH);     // LED an
    delay(vz);
    digitalWrite(ledPin, LOW);      // LED aus
    delay(vz);

    i = i + 1; // bei jeder Runde 1 dazu

  } else {  // wenn die Zahl >= Anzahl ist…
    digitalWrite(ledPin, LOW);
  }

}

Übung

Wie müsst Ihr den Code ändern, dass die LED bei jeder Wiederholung um eine halbe Sekunde länger leuchtet?


Funktionsweise Breadboard

Am Breadboard sind an den äußeren Rändern die Bahnen + und – waagrecht miteinander verbunden. Im inneren Bereich sind die Bahnen senkrecht verknüpft…

Achtung

Der gezeigte Aufbau soll nur die Funktionsweise erklären.

Baut diesen so nicht auf – die LED wird überhitzt und brennt durch!


Farbcode der Widerstände (4 Band)

… es gibt auch 5-Band-Widerstände – die entsprechende Legende findet Ihr im Arduino Project Book auf Seite 41!


Welcher Widerstand ist das?

für Lösung runterscrollen…

Lösung

1 | 0 | 102 | ±5% = 10 × 100 = 1000Ω = 1kΩ mit ±5% Toleranz


Widerstand messen mit dem Multimeter

https://learn.adafruit.com/multimeters/


Breadboard & AnalogWrite

Baut die abgebildete Konstellation bitte genau nach! Der Widerstand muß 220Ω haben, sonst brennt die LED durch…

Arduino

int led = 6; // An Pin 6 ist eine LED mit Widerstand 220 Ohm angeschlossen.

void setup() {
  // Den Pin zur Ausgabe festlegen.
  pinMode(led, OUTPUT);
}

void loop() {
  // max. Wert wäre hier 255
  // Die LED leuchtet nun mit 25 % Helligkeit.
  analogWrite(led, 64);
}

Ändert mal den Wert bei analogWrite(); – mehr als 255 geht nicht…


LED leuchtet animiert

gleicher Aufbau wie beim vorherigen Sketch!

Arduino

int led = 6; // An Pin 6 ist eine LED mit Widerstand 220 Ohm angeschlossen.
int richtung = 1; // richtung gibt an, ob die LED heller oder dunkler werden soll
int i; // zum Hoch- und Runterzaehlen in der for-Schleife

void setup() {
  // Den Pin zur Ausgabe festlegen.
  pinMode(led, OUTPUT);

  // Ausgabe-Werte im Serial Monitor ermöglichen
  Serial.begin(9600);
}

void loop() {

  for (i = 0; i <= 255; i++) {

    analogWrite(led, i * richtung); // die LED wird langsam heller bzw. dunkler

    // Ausgabe der Werte im Serial-Monitor
    Serial.print(i);  // i als Wert im Serial-Monitor ausgeben
    Serial.print(", richtung: ");
    Serial.println(richtung);

    delay(10);  // 10 Milisekunden Verzögerung
  }

  // an den äußeren Rändern der Schleife ändert sich die Richtung
  if ((i >= 255) || (i <= 0)) {
    richtung = -richtung;
    i = 0;
  }
}

Serial Monitor

Öffnet diesen, indem Ihr auf das Lupen-Symbol klickt!


Photo-Resistor (Fotozelle)

Verwendet hierfür einen 10kΩ Widerstand

Arduino

int fotozelle = A0; // Pin Zuweisung bei A0; Widerstand 10 kOhm

void setup() {
  pinMode(fotozelle, INPUT);
  Serial.begin(9600);
}

void loop() {
  int hell = analogRead(fotozelle); // Wert, den Fotozelle ausgibt, wird gelesen

  Serial.print("Helligkeitswertes der Foto-Zelle: ");
  Serial.println(hell); // Ausgabe des Helligkeitswertes der Foto-Zelle

  delay(100);
}

Öffnet den Serial Monitor und schaut, welche Werte ausgegeben werden, wenn Ihr z.B. die Fotozelle mit der Hand abdeckt oder mit einen Taschenlampe draufleuchtet.

Theoretisch sollten die Werte zwischen 0 und 1023 liegen…


Photo-Resistor-Daten mit Web-Interface

Falls man sich im gleichen Wlan-Netzt befindet: http://arduinopi.local/fotozelle/

Grundlegendes

Bei diesem Projekt ist der Arduino via USB-Kabel mit einem Raspberry Pi verbunden, auf dem Apache und PHP7 installiert ist.

Der Arduino zeichnet alle 5s einen Helligkeiswert auf und schickt diesen über das USB-Kabel an den Raspberry Pi. Via Python werden dort die vom Arduino empfangenen Helligkeitswerte in einer CSV-Datei gespeichert. Via p5.js wird die CSV-Datei ausgelesen und als Graph im Browser dargestellt.

Arduino-Hardware-Aufbau

Der Arduino-Hardware-Aufbau ist identisch mit dem vorherigen Aufbau („Photo-Resistor (Fotozelle)“)

Der Arduino-Code unterscheidet sich auch nicht groß, nur das Abfrage-Intervall wurde auf 5s verlängert!

Arduino

int fotozelle = A0; // Pin Zuweisung bei A0; Widerstand 10 kOhm

void setup() {
  pinMode(fotozelle, INPUT);
  Serial.begin(9600);
}

void loop() {
  int hell = analogRead(fotozelle); // Wert, den Fotozelle ausgibt, wird gelesen

  Serial.println(hell); // Ausgabe des Helligkeitswertes der Foto-Zelle

  // alle 5sek Messung, entsprechend Python-Script "fotozelle_csv_datei.py"
  delay(5000);
}

Das hier gezeigte Python-Script läuft auf dem Raspberry Pi und erzeugt die CSV-Datei "data_log.csv" und speichert diese an einer Stelle, an der p5.js einfach darauf zugreifen kann:

Python

#!/user/bin/env python

# speichert die CSV-Datei im Ordner "/var/www/html/fotozelle/"
# damit das geht, muss das Script mit "sudo" ausgefuehrt werden
# sudo python fotozelle_csv_datei_2.py

import os
import time 
from time import sleep
from datetime import datetime

import serial

# hier richtigen Serial-Port des Arduinos angeben!
port = "/dev/ttyACM0"

# pfad zum HTML-Ordner
pfadDatei = "/var/www/html/fotozelle/daten/data_log.csv"

# Geschwindigkeit muss identisch wie bei Arduino-Script sein!
s1 = serial.Serial(port,9600)
s1.flushInput()

file = open(pfadDatei, "a")

while True:
    if s1.inWaiting()>0:

        # formatierte Datum- und Zeit-Kombination
        now = datetime.now().strftime('%Y-%m-%d,%H:%M:%S')

        # gibt den Helligkeiswert jeweil in einer Zeile aus
        inputValue =s1.readline()

        # "\n" macht jeweils eine Leerzeile
        file.write(str(now)+","+inputValue+"\n")
        file.flush()

        # Script wartet 5 Sekunden, bis es sich wiederholt (entsprechend der Zeit im Arduino-Sketch
        time.sleep(5)

file.close()

Das oben gezeigte Python-Script erzeugt eine CSV-Datei "data_log.csv", die beispielsweise so aussehen könnte:

CSV-Datei (Ausschnitt)

2018-11-03,14:59:43,793

2018-11-03,14:59:48,815

2018-11-03,14:59:53,352

2018-11-03,14:59:58,46

2018-11-03,15:00:03,29

2018-11-03,15:00:08,794

2018-11-03,15:00:13,793

2018-11-03,15:00:18,810

Via p5.js wird diese CSV-Datei eingelesen und als Graph im Canvas einer Website dargestellt

p5.js

var aktuelleWerte;
var HelligkeitsPunkte = [];
var factor = 0.6; // um wieviel wird Skala und Wert skaliert
var breite = 20; // Breite der Säulen
var abstand = 5; // Abstand der Säulen
var rowCount = 0; // wieviele Datensätze sind vorhanden?
var x; // Position des senkrechtes Nullpunktes
var y; // Position des waagrechten Nullpunktes

function preload() {
  // alle 5 Sekunden Werte laden
  loadTable("daten/data_log.csv", tableFuellen);
}

function tableFuellen(data) {
  aktuelleWerte = data;
  // console.log(aktuelleWerte);
}

function setup() {
  var myCanvas = createCanvas(800, 658);
  myCanvas.parent("graph");

  x = 35;
  y = height - 20;

  textFont("roboto_condensedregular");

  textStyle(NORMAL);

  // Ausgabe der aktuellen Zeit
  zeitAngabe();

  // wieviele Datensätze befinden sich in der CSV-Datei?
  rowCount = aktuelleWerte.getRowCount();

  AnzeigeUeberCanvas();

  // wieviele Werte sollen dargestellt werden?
  var anzahl;
  if (rowCount >= 30) {
    anzahl = 30;
  } else {
    anzahl = rowCount;
  }

  noStroke();

  // Darstellung der Rechtecke mit den Helligkeitswerten
  // werden von rechts nach links dargestellt
  // der aktuellste Wert ist also recht, nach links geht es in die Vergangenheit
  for (var i = 0; i <= anzahl; i++) {
    var helligkeit = HelligkeitsPunkte[rowCount - i];

    // Rechtecke werden Stufenweise dunkler
    fill(255 - 8.5 * i, 0, 0);

    rect(
      width - 5 - (breite + abstand) * i,
      y,
      breite,
      helligkeit * -1 * factor
    );
  }

  // Zeichnen von Skala, senkrechter Beschriftung
  SkalaLinien();
}

function draw() {}

// Angaben zu Anzahl Datensätzen und letztem Wert oberhalb des Canvas
function AnzeigeUeberCanvas() {
  var ausgabe = "Datensätze: " + rowCount;
  document.getElementById("AnzahlDaten").innerHTML = ausgabe;

  for (var i = 0; i < rowCount; i++) {
    HelligkeitsPunkte[i] = aktuelleWerte.getNum(i, 2);
  }
  var letzterWert = HelligkeitsPunkte[rowCount - 1];
  var ausgabe = "letzter Wert: " + letzterWert;
  document.getElementById("letzterWert").innerHTML = ausgabe;
}

function zeitAngabe() {
  var a = new Date();
  var h = a.getHours();
  var m = a.getMinutes();
  var s = a.getSeconds();
  var tag = a.getDate();
  var mon = a.getMonth() + 1; //Monat fängt bei 0 an
  var jahr = a.getFullYear();

  var h = zahlenAuffuellen(h);
  var m = zahlenAuffuellen(m);
  var s = zahlenAuffuellen(s);

  akt_datum = tag + "." + mon + "." + jahr;

  akt_zeit = h + ":" + m + ":" + s;
  var ausgabe = "Aktualisiert am " + akt_datum + " um " + akt_zeit + " Uhr";

  document.getElementById("AktualisierungsDatum").innerHTML = ausgabe;
}

// wenn Stunden, Minuten, Sekunden nur einstellig sind
// werden diese mit einer Null aufgefüllt
function zahlenAuffuellen(ziffer) {
  if (ziffer < 10) {
    ziffer = "0" + ziffer;
  }
  return ziffer;
}

function SkalaLinien() {
  stroke(150);
  // X-Linie
  line(x, y, width, y);
  // Y-Linie
  line(x, 10, x, y + 5);

  // waagrechte SkalaLinien
  stroke(190);
  for (var i = 0; i <= 10; i++) {
    line(x - 3, y - i * 100 * factor, width, y - i * 100 * factor);
  }

  // Einstellungen für Beschriftung
  noStroke();
  fill(100);
  textSize(16);
  textAlign(RIGHT);

  // Beschriftung der Y-Achse
  for (var i = 0; i <= 10; i++) {
    var yBeschriftung = 100 * i;
    text(yBeschriftung, x - 5, y - yBeschriftung * factor + 5);
  }

  // Beschriftung der X-Achse
  textAlign(CENTER);

  for (var i = 0; i <= 29; i = i + 2) {
    var xBeschriftung = -5 * i + "s";
    // width - 5 - (breite + abstand) * i
    text(xBeschriftung, width - 20 - (breite + abstand) * i, y + 18);
  }
}

Photo-Resistor & LED

Verwendet einen 10kΩ Widerstand bei der Fotozelle und einen 220Ω Widerstand bei der LED

Arduino

int fotozelle = A0; // Pin Zuweisung bei A0; Widerstand 10 kOhm
int led = 6; // An Pin D6 ist eine LED mit Widerstand 220 Ohm angeschlossen.

void setup() {
  pinMode(fotozelle, INPUT);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  int hell = analogRead(fotozelle); // Wert, den Fotozelle ausgibt, wird gelesen

  Serial.println(hell); // Ausgabe des Helligkeitswertes der Foto-Zelle

  // hell ist ein Wert zwischen 0 und 1023
  // die LED verträgt aber nur Wert zwischen 0 und 255
  // deswegen teile ich hell durch 4; (probiert auch mal 3 aus, weil Fotozelle real nicht bis 1024 geht…
  // 255 - hell/4 bewirkt, dass die LED umso dunkler wird, desto heller das Umgebungslicht ist
  analogWrite(led, 255 - hell / 4);

  delay(100);
}

Übung

Wie müsst Ihr den Code ändern, dass die LED umso heller wird, desto heller das Umgebungslicht wird?


Photo-Resistor & LED & Piezo

Verwendet einen 10kΩ Widerstand bei der Fotozelle und einen 220Ω Widerstand bei der LED.

Das Piezo-Element braucht keinen Widerstand und es spielt auch keine Rolle, wierum Ihr es auf das Breadboard steckt.

Arduino

int fotozelle = A0; // Pin Zuweisung bei A0; Widerstand 10 kOhm
int led = 6; // An Pin D6 ist eine LED mit Widerstand 220 Ohm angeschlossen.
int piezo = 3; // Piezo bei D3 angeschlossen

void setup() {
  pinMode(fotozelle, INPUT);
  pinMode(led, OUTPUT);
  pinMode(piezo, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  int hell = analogRead(fotozelle); // Wert, den Fotozelle ausgibt, wird gelesen

  Serial.print("Helligkeitswertes der Foto-Zelle: ");
  Serial.println(hell); // Ausgabe des Helligkeitswertes der Foto-Zelle

  analogWrite(led, 255 - hell / 4);

  // wenn es zu dunkel wird, geht der Alarm an
  if (hell < 550) {
    playTone(300, 160); // externe Funktion, siehe unten!
  }

  delay(300);
}

// duration in mSecs, frequency in hertz
void playTone(long duration, int freq) {
  duration *= 1000;
  int period = (1.0 / freq) * 1000000;
  long elapsed_time = 0;
  while (elapsed_time < duration) {
    digitalWrite(piezo, HIGH);
    delayMicroseconds(period / 2);
    digitalWrite(piezo, LOW);
    delayMicroseconds(period / 2);
    elapsed_time += (period);
  }
}

Übungen

  1. Ändert den Code so, dass der Alarm angeht, wenn das Umgebungslicht sehr hell wird
  2. Ändert den Code so, dass der Alarm angeht, wenn das Umgebungslicht entweder sehr hell oder sehr dunkel wird – der Alarm also nur aus ist, wenn das Umgebungslicht „mittelhell“ ist…

Foto Hardware-Aufbau

Da kommt einiges zusammen!


Light Theremin – ein schauriges Musikinstrument

Verwendet einen 10kΩ Widerstand bei der Fotozelle.

Das Piezo-Element braucht keinen Widerstand und es spielt auch keine Rolle, wierum Ihr es auf das Breadboard steckt.

Arduino

// Aus dem „Arduino Projects Book“, S. 71ff

int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;

// const = unveränderbarer Wert
const int ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);

  // Kalibriert die Fotozelle
  // in diesem Zeitraum die Hand über die Zelle so bewegen
  // dass die gewünschten Max- und Min-Werte eingestellt werden können
  while (millis() < 5000) {
    sensorValue = analogRead(A0);

    if (sensorValue > sensorHigh) {
      sensorHigh = sensorValue;
    }

    if (sensorValue < sensorLow) {
      sensorLow = sensorValue;
    }
  }

  // wenn die LED ausgeht, ist das Kalibrieren fertig
  digitalWrite(ledPin, LOW);
}

void loop() {
  sensorValue = analogRead(A0);

  // 50 - 4000 = Range of Frequency of Piezo
  // map überträgt die Sensor-Werte auf die Range der Frequency
  int pitch = map(sensorValue, sensorLow, sensorHigh, 50, 4000);

  // Ton an Pin8, 20 Millisekunden Länge
  tone(8, pitch, 20);

  // LED an, wenn pitch sehr niedrig ist
  if (pitch < 300){
    digitalWrite(ledPin, HIGH);
  } else {
   digitalWrite(ledPin, LOW);
  }

  delay(10);
}

Spielt mal mit den Werten der Frequenz und auch der Tonlänge…

Hardware-Aufbau


Temperatur Sensor

220Ω Widerstand bei der LED

Bitte achtet darauf, dass auf dem Sensor tatsächlich „Temp“ steht und dass Ihr diesen richtigherum (flache Seite Richtung Arduino) eingebaut habt!

Arduino

// Arduino Project Book, Seite 43ff

// Analoger Eingang 0
int sensorPin = A0;

// Widerstand hier wieder 220Ω
int ledPin = 2;

// Grenzwert-Temperatur, wenn LED an/ausgehen soll
float grenzwert = 24.0;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  // roher Sensor-Wert
  int sensorVal = analogRead(sensorPin);

  Serial.print("Sensor Wert roh: ");
  Serial.println(sensorVal);

  // Umrechung in Volt (muss zwischen 0V und 5V liegen!)
  float voltage = (sensorVal / 1024.0) * 5.0;

  Serial.print("Volt: ");
  Serial.println(voltage);

  // Temperatur in Celsius
  float temperature = (voltage - 0.5) * 100;

  Serial.print("Temperatur: ");
  Serial.print(temperature);
  Serial.println(" C\n"); // \n erzwingt eine Leerzeile

  // Wenn die Temperatur unter einen bestimmten Wert fällt
  // soll die LED angehen
  if (temperature < grenzwert){
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

  // Messung alle 0.5 sek
  delay(500);
}

Temperatur-Sensor-Erweiterungs-Aufgabe

Erweitert den Temperatur-Sensor-Sketch um folgende Funktion:

Es gibt eine weitere LED; die erste geht an, wenn die Temperatur unter einen bestimmten Wert fällt; die zweite LED geht an, wenn die Temperatur über diesen Wert geht. (Die erste LED ist dann aus). Verwendet dazu nach Möglichkeit unterschiedliche LED-Farben

Königsaufgabe

Wer schafft es, 3 LEDs anzusteuern?

  1. LED unterhalb eines bestimmten Wertes
  2. LED oberhalb des Wertes, aber unterhalb eines weiteren Wertes
  3. LED oberhalb des weiteren Wertes

Mögliche Abstufungen: 1. Grenzwert: 24° C, 2. Grenzwert: 27°C

Arduino

// Code-Schnipsel für die Bedingungen

if (temperature < grenzwert_1) { // unterer Bereich

// Bereich zwischen den Grenzwerten, durch 2 Bedingungen bestimmt!
// deswegen das &&
} else if (temperature > grenzwert_1 && temperature < grenzwert_2) { 

} else { // oberer Bereich

}

Servo-Motor ansteuern

Verbindet den Motor – wie auf dem Foto unten gezeigt – mit Breadboard und Arduino. Verwendet dabei möglichst die gleichen Farben, damit Ihr den Motor richtig anschliessen könnt.

Arduino

// http://www.oomlout.com/oom.php/products/ardx/circ-04

// Libary einfügen!
#include <Servo.h>

// create servo object to control a servo
// a maximum of eight servo objects can be created
Servo myservo;

int zeit = 1000; // wie lange soll der Arm in der Position stehen bleiben
int counter = 0; // der Servo soll nur eine bestimmte Anzahl machen und dann aufhören

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {

  // der Servo soll nur eine bestimmte Anzahl machen und dann aufhören
  if (counter < 5) {

    // Mitte
    myservo.write(90); // Gradangabe! nur Werte zwischen 0 und 180 möglich!
    delay(zeit);

    myservo.write(0);
    delay(zeit);

    myservo.write(90);
    delay(zeit);

    myservo.write(180);
    delay(zeit);

    // Kurzschreibweise von counter = counter + 1;
    counter++;

  }

}

Temperatur-Anzeige analog

Arduino

// Arduino Project Book, Seite 43ff
// http://www.oomlout.com/oom.php/products/ardx/circ-04

// Libary einfügen!
#include <Servo.h>

// create servo object to control a servo
// a maximum of eight servo objects can be created
Servo myservo;

// Analoger Eingang 0
int sensorPin = A0;

// Widerstand hier wieder 220Ω
int ledPin = 2;

// Grenzwert-Temperatur, wenn LED an/ausgehen soll
float grenzwert = 22.0;

void setup() {
  pinMode(ledPin, OUTPUT);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  Serial.begin(9600);
}

void loop() {

  int sensorVal = analogRead(sensorPin); // roher Sensor-Wert
  float voltage = (sensorVal / 1024.0) * 5.0; // Umrechung in Volt
  float temperature = (voltage - 0.5) * 100; // Temperatur in Celsius

  Serial.print("Temperatur: ");
  Serial.print(temperature);
  Serial.println(" C\n"); // \n erzwingt eine Leerzeile

  // Wenn die Temperatur unter einen bestimmten Wert fällt, soll die LED angehen
  if (temperature < grenzwert) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

  // zur Sicherheit Limits eingebaut, damit der Servo nicht kaputt geht
  // wenn die Werte < 0 oder > 180 werden
  // deswegen werden nur Werte zwischen 0° und 60° zugelassen
  if (temperature > 0 && temperature < 45) {
    // Temperatur mit 4 multipliziert, damit man merkt, wenn sich die Temperatur ändern
    // z.b. wenn man mit der Hand an das Termometer fasst
    myservo.write(temperature * 4);
  }

  // Messung alle 0.5 sek
  delay(500);
}

Analoge Temperaturanzeige

hier eingeschränkt auf den Bereich von 0° bis 45° Celsius – also ein Zimmerthermometer…

Hinter der Anzeige wäre dann der Servo-Motor verbaut…

Aufbau


Eigener Leitfähigkeitssensor

an das Ende des braunen Kabels könnt Ihr alles mögliche leitfähige hängen und somit selber Buttons und Interface-Elemente erstellen…

Library CapacitiveSensor

Die Library CapacitiveSensor.h bitte herunterladen und bei Arduino installieren – sonst geht der Sketch nicht!

Widerstand 1MΩ

Arduino

// z.b. Alu-Folie an Kabel 2 und 4
// dazwischen Widerstand 1MΩ

#include <CapacitiveSensor.h>

CapacitiveSensor capSensor = CapacitiveSensor(4, 2);

// den Wert testen (Serial.print), hängt stark davon ab, welchen Widerstand man verwendet!
int threshold = 200; 

int ledPin = 13; // LED, längerer Fuss in 13, kurzer in Ground

int piezo = 8; // Anschluss des Piezo-Elements

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  long sensorValue = capSensor.capacitiveSensor(30);

  Serial.print("Leitfaehigkeit: ");
  Serial.print(sensorValue);
  Serial.println(";");

  if (sensorValue > threshold) {
    digitalWrite(ledPin, HIGH);

    // variabler Ton
    tone(piezo, sensorValue, 100);

  } else {
    digitalWrite(ledPin, LOW);
  }

  // sehr kurze Verzögerung
  delay(100);
}

Electric Paint

leitende Farbe: http://www.bareconductive.com/shop/electric-paint-10ml/

Bleistift-Buttons

umso weicher der Bleistift, desto besser geht es…


Feuchtigkeits-Sensor

Ihr könnt den Sensor auch direkt in das Breadboard stecken

Steckt den Sensor mal in feuchte Hände oder ein Glas Wasser und beobachtet, wie sich die Sensor-Werte ändern!

Arduino

int sensorPin = A0;    // select the input pin for the potentiometer
int sensorValue = 0;  // variable to store the value coming from the sensor

void setup() {
  Serial.begin(9600);  
}

void loop() {
  // Wert zwischen 0 und 1023
  sensorValue = analogRead(sensorPin);    

  Serial.print("Sensor = " );                       
  Serial.println(sensorValue);    

  // Messung jede Sekunde
  delay(1000);   
}

Aufgabe

Baut das Piezo-Element ein und lasst diesen Geräusche machen, wenn der Sensor „trocken läuft“


Temperatur- und Luftfeuchtigkeits-Sensor-Kombination

Der Sensor kombiniert das Messen von Temperatur und Luftfeuchtigkeit

Der Code ist ziemlich komplex, weil die Werte für Temperatur und Feuchtigkeit ausgelesen müssen!

Arduino

// http://linksprite.com/wiki/index.php5?title=Advanced_Sensors_Kit_for_Arduino

int dht_dpin = A0;

byte bGlobalErr;
byte dht_dat[5];

void setup() {
  InitDHT();
  Serial.begin(9600);
  delay(300);
  Serial.println("Luftfeuchtigkeit und Temperatur");
  delay(700);
}

void loop() {
  ReadDHT();
  switch (bGlobalErr) {
    case 0:
      Serial.print("Aktuelle Luftfeuchtigkeit = ");
      Serial.print(dht_dat[0], DEC);
      Serial.print(".");
      Serial.print(dht_dat[1], DEC);
      Serial.print("% ");
      Serial.print("Temperatur = ");
      Serial.print(dht_dat[2], DEC);
      Serial.print(".");
      Serial.print(dht_dat[3], DEC);
      Serial.println("C");
      break;
    case 1:
      Serial.println("Error 1: DHT start condition 1 not met.");
      break;
    case 2:
      Serial.println("Error 2: DHT start condition 2 not met.");
      break;
    case 3:
      Serial.println("Error 3: DHT checksum error.");
      break;
    default:
      Serial.println("Error: Unrecognized code encountered.");
      break;
  }
  delay(800);
}

void InitDHT() {
  pinMode(dht_dpin, OUTPUT);
  digitalWrite(dht_dpin, HIGH);
}

void ReadDHT() {
  bGlobalErr = 0;
  byte dht_in;
  byte i;
  digitalWrite(dht_dpin, LOW);
  delay(20);
  digitalWrite(dht_dpin, HIGH);
  delayMicroseconds(40);
  pinMode(dht_dpin, INPUT);

  //delayMicroseconds(40);
  dht_in = digitalRead(dht_dpin);
  if (dht_in) {
    bGlobalErr = 1;
    return;
  }

  delayMicroseconds(80);
  dht_in = digitalRead(dht_dpin);
  if (!dht_in) {
    bGlobalErr = 2;
    return;
  }

  delayMicroseconds(80);
  for (i = 0; i < 5; i++)
    dht_dat[i] = read_dht_dat();
  pinMode(dht_dpin, OUTPUT);
  digitalWrite(dht_dpin, HIGH);
  byte dht_check_sum =
    dht_dat[0] + dht_dat[1] + dht_dat[2] + dht_dat[3];
  if (dht_dat[4] != dht_check_sum)
  {
    bGlobalErr = 3;
  }
}

byte read_dht_dat() {
  byte i = 0;
  byte
  result = 0;
  for (i = 0; i < 8; i++) {
    while (digitalRead(dht_dpin) == LOW);
    delayMicroseconds(30);
    if (digitalRead(dht_dpin) == HIGH)
      result |= (1 << (7
                       -
                       i));
    while (digitalRead(dht_dpin) == HIGH);
  }
  return result;
}

Übersichtseite mit Sensoren für Arduino

http://linksprite.com/wiki/index.php5?title=Advanced_Sensors_Kit_for_Arduino

Hier sind fast alle Sensoren, die bei „40 in 1 Sensorkit for Arduino“ enthalten sind, zusammen mit Beispiel-Code aufgelistet: https://tkkrlab.nl/wiki/Arduino_37_sensors


Ultraschall-Abstandsmesser

Achtung: Der Ultraschall-Sensor ist einer der wenigen Sensoren, der 4 Anschlüsse hat!

Arduino-Library

Damit der Sketch funktioniert, müsst Ihr die NewPing Arduino Library for Arduino herunterladen und bei Arduino hinzufügen:

Arduino

/*
   Ultrasonic-Rangefinder

   hat 4 PINS!

   GND pin to ground
   VCC pin to 5V
   TRIG pin to digital pin 8
   ECHO pin to digital 7

   Quelle : https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home#!simple-newping-sketch

*/

// Library laden: https://bitbucket.org/teckel12/arduino-new-ping/downloads/NewPing_v1.7.zip
#include <NewPing.h>

const int TRIGGER_PIN = 8;
const int ECHO_PIN = 7;

const int Led = 13; // die LED

int MAX_DISTANCE = 200; // bis 200cm Abstand messen

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
  Serial.begin(115200); // Serial Monitor entsprechend umschalten!

  pinMode(Led, OUTPUT);
}

void loop() {

  delay(50); // min 29
  unsigned int cm = sonar.ping_cm();
  Serial.print("Ping: ");
  Serial.print(cm);
  Serial.println("cm");

  if (cm == 0 && digitalRead(ECHO_PIN) == HIGH) {
    pinMode(ECHO_PIN, OUTPUT);
    digitalWrite(ECHO_PIN, LOW);
    delay(100);
    pinMode(ECHO_PIN, INPUT);
  }

  // LED geht an, wenn etwas näher als 20cm ist
  if (cm < 20) {
    digitalWrite(Led, HIGH);
  } else {
    digitalWrite(Led, LOW);
  }
}

LCD-Screen

https://www.arduino.cc/en/Tutorial/HelloWorld

  1. Schliesst den LCD-Screen – entsprechend „Arduino Starter Kit - Chapter 11“ – an das Uno an
  2. Lasst Euch Messwerte eines Sensors auf dem LCD-Screen ausgeben

Relais

Mit einem Relais kann man sogar 230V-Sachen ein- und ausschalten. Dies ist aber gefährlich, wenn Ihr nicht genau wisst, was Ihr tut!


Grove - Starter Kit for Arduino

Grove is a modular electronic platform for quick prototyping. Every module has one function, such as touch sensing, creating audio effect and so on. Just plug the modules you need to the base shield, then you are ready to test your idea buds.

Das Starterkit kostet (ohne Arduino-Board) ca. € 50.-


Grove Beispiel

Mit einem Grove-Shield und den dazugehörigen Sensoren/Aktoren kann man super schnell physikalische Prototypen erstellen!

Code-Beispiel von „Grove_Ultransonic_Ranger_LCD.ino“

Arduino

/***************************************************************************/
//  Function: Measure the distance to obstacles in front and print the distance
//        value to the serial terminal.The measured distance is from
//        the range 0 to 600cm
//  Hardware: Grove - Ultrasonic Ranger
//  Arduino IDE: Arduino-1.0
/*****************************************************************************/

// https://github.com/Seeed-Studio/Grove_Ultrasonic_Ranger
#include "Ultrasonic.h"

// Anschluss des Ultrasonic Sensors auf D7
Ultrasonic ultrasonic(7);

// die LED
int pinLed = 3;

// Buzzer
int speakerPin = 6;

// Maximalabstand in cm, ab dann geht LED an
int maxAbstand = 60;

void setup() {
  Serial.begin(9600);  // Open serial port

  // LED zum Anzeigen, wenn man nah genug ist
  pinMode(pinLed, OUTPUT);

  // eigener Tab!
  // LCD Monitor bei "I2C" anschliessen (welcher ist egal)
  lcd_start();
}

void loop() {
  long RangeInCentimeters;

  RangeInCentimeters = ultrasonic.MeasureInCentimeters();

  // die LED geht an, wenn man sich innerhalb des Maximalabstands befindet
  if (RangeInCentimeters < maxAbstand) {
    analogWrite(pinLed, 255);
  } else {
    analogWrite(pinLed, 0);
  }

  // eigener Tab!
  // dort auch die Anweisung für die Warnung
  lcd_schleife(RangeInCentimeters);

  //Serial.println(RangeInCentimeters);
  Serial.write((byte)RangeInCentimeters);  // Print variable to serial port

  delay(100);
}

// http://www.seeedstudio.com/wiki/Grove_-_Buzzer
// Buzzer schlägt Alarm
void warnung(int pin) {
  analogWrite(pin, 10);
  delay(analogRead(0));
  analogWrite(pin, 0);
  delay(analogRead(0));
}

// Angaben für den LCD-Screen

#include <Wire.h>
#include "rgb_lcd.h"

rgb_lcd lcd;

const int colorR = 150;
const int colorG = 150;
const int colorB = 150;

void lcd_start() {
  // mehr zum LCD-code: https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight/

  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);

  lcd.setRGB(colorR, colorG, colorB);

  // Print a message to the LCD.
  lcd.print("Abstand:");

  delay(1000);
}

void lcd_schleife(long wert) {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):

  lcd.setCursor(0, 1);
  lcd.print("        ");

  // Ausgabe des Abstands
  lcd.setCursor(0, 1);
  lcd.print(wert);

  // damit wird "cm" immer direkt hinter dem Wert positioniert
  // auch wenn sich die Länge des Wertes ändert
  String wertAlsString = String(wert);
  int cmPos = wertAlsString.length()+1;

   // Ausgabe der Masseinheit
  lcd.setCursor(cmPos, 1);
  lcd.print("cm");

  // wenn es ziemlich dunkel ist
  // soll das Diplay rot werden
  if (wert > 20) {
    lcd.setRGB(colorR, colorG, colorB);

  } else {
    lcd.setRGB(255, 0, 0);
    warnung(speakerPin);
  }

  delay(100);
}

Danke

Weitere Vorträge: