Prof. Dr. Sebastian Zug, Technische Universität Bergakademie Freiberg
Die interaktive Ansicht dieses Kurses ist unter folgendem Link verfügbar.
Der Quellcode der Materialien ist unter https://github.com/liaScript/ArduinoEinstieg/blob/master/3days_Introduction_day2.md zu finden.
Ich habe den Zeitplan etwas angepasst ...
Wochentag | Zeit | Inhalt |
---|---|---|
Montag (Mikrocontroller) | 09:00 - 10:00 | Grundlage C, Hello World, Serielle Schnittstelle |
10:10 - 11:30 | Taster, Distanzsensor, Mehrfarben-Leds | |
11:40 - 12:30 | Display | |
Dienstag (Mikrocontroller) | 09:00 - 10:40 | String Klasse und Displays |
10:50 - 11:55 | Beispielanwendungen mit dem Display | |
12:00 - 13:00 | Inbetriebnahme App-Inventor | |
Mittwoch (App Entwicklung) | 09:00 - 10:30 | Bluetooth Kommunikation im App Inventor |
10:40 - 11:55 | Fernsteuern des Mikrocontrollers über die App | |
12:00 - 13:00 | Freie Anwendungsentwicklung |
US Sensor
USB/Serielle | Serielle Bluetooth
Schnittstelle v Schnittstelle
╔══════════════╗ +-------------+ +-------------+ ╔══════════════╗
║ Arduino IDE ║ LED-Cmds | Arduino | ----------> | HC-06 | ║ Handy-App ║
║ ║ -----------> | | Messungen | Bluetooth | ║ ║
║ ║ | | | to | ))) ((( ║ ║
║ ║ Display Cmds | | <---------- | Serial | ║ ║
║ ║ -----------> | | Commands | | ║ ║
╚══════════════╝ +-------------+ +-------------+ ╚══════════════╝
| |
v v
Display LED
Und wie gehen wir bei der Fehlersuche vor?
-
Ruhe bewahren!
-
Ruhe bewahren!
-
Situation prüfen
-
Syntaktischer Fehler (Dein Kompiler meckert!)
-
Logischer Fehler (Du hast einen Denkfehler!)
-
Hardwarefehler (Ups, draufgetreten!)
-
-
Fehlermeldung aufmerksam lesen
-
ggf. Hypothesen aufstellen und prüfen
Aufgabe: Debuggen Sie den Quellcode!.
const int buttonPin = 2;
const int ledPin = 13;
int buttonState = 0;
int setup() {
pinMode(ledPin, INPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH)
} else {
digitalWrite(buttonPin, LOW);
}
}
-
Referenzübersicht Arduino
- deutsch (unvollständig) https://www.arduino.cc/reference/de/
- englisch https://www.arduino.cc/reference/en/
Die zugehörigen Methoden der String-Klasse finden sich in der Dokumentation unter String
void loop() { }
@AVR8js.sketch
> Aufgabe: Suchen Sie in der Dokumentation nach Methoden, die im obigen Beispiel
> die Lehrzeichen in `Greetings` entfernt und `HelloWorld` die großen Buchstaben
> in kleine umwandelt.
> Frage: Warum sind die beiden Operationen für unsere Anwendung wichtig?
{{1-2}}
********************************************************************************
<div>
<span id="simulation-time"></span>
</div>
```c ardunino.cpp
//char incomingByte;
String receivedString;
void setup() {
Serial.begin(9600);
Serial.println("Geben Sie Ihren Namen ein!");
}
void loop() {
if (Serial.available() > 0) {
//incomingByte = Serial.read(); // Lesen eines Zeichens
receivedString = Serial.readString();
Serial.print(receivedString);
if (receivedString.equals("Robin"))
{
Serial.println(" Hood");
}
}
}
@AVR8js.sketch
Aufgabe: Führen Sie den Code auf dem Mikrocontroller aus und testen Sie, ob Ihr Name eingeben wurde.
Aufgabe: Lesen Sie folgenden Code und erklären Sie diesen!
void setup() { Serial.begin(9600); Serial.println("Zerlege das Befehlswort:"); pinMode(ledPin, OUTPUT);
String LEDCommand = "7, 12, 4"; Serial.println(LEDCommand); int firstCommaPosition = LEDCommand.indexOf(","); String redString = LEDCommand.substring(0, firstCommaPosition); int redNumber = redString.toInt(); Serial.println(redNumber); }
void loop() { }
@AVR8js.sketch
> Aufgabe: Wie können wir ALLE Farbwerte auslesen?
{{1-2}}
********************************************************************************
<div>
<span id="simulation-time"></span>
</div>
```cpp StringAuswertung.cpp
void setup() {
Serial.begin(9600);
Serial.print("Zerlege das Befehlswort: ");
pinMode(ledPin, OUTPUT);
String LEDCommand = "7, 12, 4";
Serial.println(LEDCommand);
int LEDValues [] = {0,0,0};
int startPosition = 0;
for (int i=0; i<3; i++){
int CommaPosition = LEDCommand.indexOf(",");
String colorString = LEDCommand.substring(startPosition, CommaPosition);
int colorStringLength = colorString.length();
LEDValues[i] = colorString.toInt();
LEDCommand.remove(startPosition, colorStringLength + 1);
LEDCommand.trim();
}
Serial.println(LEDValues[0]);
Serial.println(LEDValues[1]);
Serial.println(LEDValues[2]);
}
void loop() {
}
@AVR8js.sketch
Aufgabe: Jetzt wird es ernst - erweitern Sie unseren Code der Mehrfarben LED, um diese mit den Kommandos der Seriellen Eingabe zu steuern.
const int redPin = 11;
const int greenPin = 10;
const int bluePin = 9;
void setColourRgb(unsigned int red, unsigned int green, unsigned int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
void setup() {
setColourRgb(0,0,0);
}
void loop() {
setColourRgb(255, 0, 0);
delay(1000);
}
Langweilig ... ! Ich möchte was sehen!
Aufgabe: Verbinden Sie das Display mit dem Board entsprechend dem Beschaltungsplan.
Achtung für diese Aufgabe müssen Sie die zusätzliche Bibliothek Link LiquidCrystal_PCF8574
installieren. Informieren Sie sich, wie dies umzusetzen ist "How to install a library for Arduino?".
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
int lcdi2c = 0x27; // <- Hart eingecodete Adresse, die nur für unser
// Beispiel funktioniert, vgl. Datenblatt
void setup()
{
LiquidCrystal_PCF8574 lcd(lcdi2c);
lcd.begin(16, 2);
lcd.setBacklight(255);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gymnasium DD");
lcd.setCursor(0, 1);
lcd.print("Projektwoche");
}
void loop()
{}
0 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
╔═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╗
0 ║G│y│m│n│a│s│i│u│m│ │D│D│ │ │ │ ║
╟─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─╢
1 ║P│r│o│j│e│k│t│w│o│c│h│e│ │ │ │ ║
╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╝
Welche Methoden stehen denn für das Display bereit?
** 1. Cursor Konfiguration**
{{0-1}}
Name | Bedeutung |
---|---|
void noBlink(); |
|
void blink(); |
Blinkender Cursor |
void noCursor(); |
Cursor unsichtbar |
void cursor(); |
Aktiviert den Cursor |
void setCursor(); |
Bewege den Cursor an eine Position |
** 2. Bewegung des Cursors **
{{1-2}}
Name | Bedeutung |
---|---|
void scrollDisplayLeft(); |
Verschiebt den Inhalt um ein Feld nach links |
void scrollDisplayRight(); |
... nach rechts |
void leftToRight(); |
Textrichtung (Bewegung des Cursors nach dem Schreiben) |
void rightToLeft(); |
... nach links |
void autoscroll(); |
Die Darstellung verschiebt sich automatisch mit dem erzeugen eines neuen Zeichens lcd.print('A') |
void noAutoscroll(); |
... aux |
** 3. Bewegung des Cursors**
{{2-3}}
Name | Bedeutung |
---|---|
void print(); |
Schreibt Text auf das Display, startet an der Stelle des Cursors |
void write(); |
Schreibt ein Zeichen auf das Display |
void clear(); |
Löschen des gesamten Displays |
{{0-1}}
lcd.setCursor(5, 1);
lcd.print("Gymnasium DD");
0 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
╔═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╗
0 ║ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║
╟─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─╢
1 ║ │ │ │ │ │G│y│m│n│a│s│i│u│m│ │D║
╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╝
{{1}}
lcd.setCursor(2, 1);
String s = "Das ist ein Test";
int number = s.length();
for (int i = 0; i< number; i++)
lcd.write(s[i]);
{{2}}
0 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
╔═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╗
0 ║ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║
╟─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─╢
1 ║ │ │D│a│s│ │i│s│t│ │e│i│n│ │T│e║
╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╝
{{3}}
lcd.setCursor(15, 1);
lcd.rightToLeft();
String s = "Das ist ein superlanger Text der gar nicht aufhört";
int number = s.length();
for (int i = 0; i< number; i++)
lcd.write(s[i]);
{{4}}
0 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
╔═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╗
0 ║ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║
╟─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─╢
1 ║t│s│e│T│ │n│i│e│ │t│s│i│ │s│a│D║
╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╝
{{6}}
lcd.setCursor(15, 1);
lcd.autoscroll();
String s = "Das ist ein superlanger Text der gar nicht aufhört";
int number = s.length();
for (int i = 0; i< number; i++){
lcd.write(s[i]);
delay(1000);
}
{{7}}
0 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
╔═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╗
0 ║ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║
╟─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─╢
1 ║ │ │ │ │ │ │ │ │ │ │ │ │D│a│s│ ║
╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╝
Aufgabe: Geben Sie die Messwerte des Ultraschallsensors auf dem Display aus!.
Aufgabe: Geben Sie einen Text von der Seriellen Schnittstelle auf dem Display aus!.
App Inventor ist eine ursprünglich vom US-amerikanischen Unternehmen Google Inc. entwickelte Integrierte Entwicklungsumgebung, um Anwendungen für Android zu programmieren. Die verwendete grafische Schnittstelle ermöglicht es Anwendern, per Drag and Drop grafische Blöcke (grafische Programmiersprache) zu einer Anwendung für Mobiltelefone mit dem Android-System zu erstellen.
Aufgabe: Melden Sie sich bitte unter dem angegebenen Link an.
// Mitmachdemo
Erweitern Sie Ihre Schaltung um einen HC-06 Bluetooth Dongle und steuern Sie den Status einer LED über die Eingaben der Pins. Die Beschaltung entnehmen Sie dem obigen Schaubild.
#include <SoftwareSerial.h>
char Incoming_value = 0;
const byte rxPin = 2;
const byte txPin = 3;
// Set up a new SoftwareSerial object
SoftwareSerial mySerial (rxPin, txPin);
void setup()
{
mySerial.begin(9600);
mySerial.println("Los geht's");
pinMode(13, OUTPUT);
}
void loop()
{
if(mySerial.available() > 0)
{
Incoming_value = mySerial.read();
mySerial.print(Incoming_value);
mySerial.print("\n");
if(Incoming_value == '1')
digitalWrite(13, HIGH);
else if(Incoming_value == '0')
digitalWrite(13, LOW);
}
}
Frage: Warum brauchen wir die Software-Serial Link Implementierung?
Die aai Datei finden Sie unter Github-link