Anmeldung HISPOS. Klausur MAI JULI. Prüfungsanmeldung ab sofort möglich Verpflichtend Anmeldung bis zum 19. Mai 2014

Ähnliche Dokumente
Anmeldung HISPOS MAI. Prüfungsanmeldung ab sofort möglich Verpflichtend Anmeldung bis zum 27. Mai I n t e r a k t i v e HA u t o m a t e n _

saarland Prof. Dr. Andreas Zeller Verantw. Tutor: Florian Groß Übungsblatt 4

Felder und Schleifen. Themen heute. Felder Schleifen Heartbleed. Programmieren für Ingenieure Sommer Andreas Zeller, Universität des Saarlandes

Hinter den Kulissen. Bergfest. Lassen Sie uns die Aussicht genießen und etwas zurückblicken :-)

Programmieren für Ingenieure Übungs-Klausur

Arduino. Inhalt. (mit Arduino UNO)

Zeichenketten. Peter Sobe

Arduino Kurs Das LC-Display. Stephan Laage-Witt FES Lörrach

Eingaben. Themen heute. Taster. Eingaben Zuweisungen Zeitmessung. Programmieren für Ingenieure Sommer Andreas Zeller, Universität des Saarlandes

6. Bearbeitung von Strings in C Bearbeitung von Strings in C

Strings (Zeichenketten)

Algorithmen und Datenstrukturen

Zeichenketten (1) Literale von Zeichenketten werden in doppelte Anführungszeichen gesetzt

Programmiersprachen Einführung in C

LCD-Display 16x2 QAPASS (AllNet)

Arduino für FunkAmateure

Zeichenketten (Strings)

Arduino - Einfacher Teiler

Arduino für FunkAmateure

GI Vektoren

Informatik. Wiederholung Felder (Arrays), string. Vorlesung

einlesen n > 0? Ausgabe Negative Zahl

Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1

Zeichenketten sind uns bisher nur als konstante Texte begegnet, welche in "" angegeben waren; z.b. als Formatstring in der printf()-funktion:

Girls Day 2018 Programmiereinführung

Programmiersprachen Einführung in C

Erste Schritte. Programmieren für Ingenieure Sommer Andreas Zeller, Universität des Saarlandes

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Arduino für FunkAmateure

Girls Day 2017 Programmierung

Bisher hatten immer nur als Ausgänge geschaltet und hierfür folgende Befehle benutzt:

Inhalt. Zeichen und Zeichenketten (engl. Strings)

Girls Day. Einführung Mikrocontroller,

Probeklausur Name: (c)

2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

MSP-EXP430G2. LaunchPad Entwicklungskit MSP-EXP430G2. Schnellstart mit dem Texas Instruments. LaunchPad Entwicklungskit

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

4.12 Datenstrukturen/String-Bibliothek

Klausur. 2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Übungsblatt 1. Java Vorkurs (WS 2017)

Arduino für FunkAmateure

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Erste Java-Programme (Scopes und Rekursion)

Kontrollfragen Mikrocontroller Programmiersprache C H1203 Felix Rohrer

Arbeitsblatt Nr.19: RFID Kit

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

E-/A-Funktionalität nicht Teil der Programmiersprache

Variablen, Konstanten und Datentypen

C++ Teil Schleifen. Man kann bestimme Anweisungen in einem Programm mehrfach ausführen lassen. Dazu gibt es in C++ verschiedene Schleifen.

Programmierkurs C++ Lösungen zum Übungsblatt 3. Nils Eissfeldt und Jürgen Gräfe. 2. November Aufgabe 5

Programmieren in C++

Praktikum DST (MRT Teil) 2. Termin

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

Erste Schritte. Das Arduino-Board. Ihr Fundino-Board. Programmieren für Ingenieure Sommer Andreas Zeller, Universität des Saarlandes

Fakultät IV Elektrotechnik/Informatik

Mit dieser kleinen Adapter-Platine können HD44780 kompatible LCD-Displays am I2C-Bus betrieben werden.

Elementare Datentypen in C++

Hochschule Darmstadt Informatik-Praktikum WS 2016/2017 WIng Bachelor 4. Aufgabenblatt Modularisierung, Funktionen, Unterprogramme

F Zeiger, Felder und Strukturen in C

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

Grundlagen der Programmierung

Klausur in Programmieren

Arrays (Felder/Vektoren)

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

Welche Informatik-Kenntnisse bringen Sie mit?

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Übungspaket 24 Zeichenketten

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Klausur Programmiersprachen SS 2005

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

C/C++-Programmierung

Bei jedem Arduino-Projekt muss man ein Grundgerüst "bauen". Das sieht dann so aus:

Einführung in die Programmierung für NF. Übung

// Daniel Ettenhuber // Projekt Kameraslider // letzte Änderung: // //

Ein-/Ausgabe, Dateisystem. Kapitel 9: Ein-/Ausgabe. Programmieren in C für Elektrotechniker. Programmieren in C. Dateisystem. Programmieren in C

Variablenarten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Wiederholung, Abbruch von Schleifen, switch-anweisung Datentypen, char, formatierte Ausgabe

Hall Magnetfeld Sensor KY-003

I2C Serial 2.6 LCD Modul

Arduino Kurs Bits und Bytes. Stephan Laage-Witt FES Lörrach

Ulrich Stein

H S R R a p p e r s w i l \0

Arduino LCD Shield. Quelle:

Entwickeln Sie ein C/C++-Programm für die Verwaltung einer Artikeldatei gemäß folgender Vorgaben!

Organisatorisches. Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Definition Datenstruktur. Nächste Woche keine Vorlesung!

Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

9. Vektoren. (auch Felder/array)

Transkript:

I n t e r a k t i v e HA u t o m a t e n _ Programmieren für Ingenieure Sommer 214 Andreas Zeller, Universität des Saarlandes Anmeldung HISPOS Prüfungsanmeldung ab sofort möglich Verpflichtend Anmeldung bis zum 19. Mai 214 MAI 19 Klausur JULI 19

leds Felder initialisieren While-Schleifen 1 2 3 4 5 6 13 12 11 1 9 8 7 int leds[7]; void setup() { int leds[] = leds[] = 13; { 13, 12, 11, 1, 9, 8, 7 ; leds[1] = 12; leds[2] = 11; leds[3] = 1; void setup() { leds[4] = 9; // Bereits initialisiert leds[5] = 8; leds[6] = 7; i = 1; while (i < 5) { Serial.println(i); i = i + 1; Serial.println("ENDE"); Ausgeführte Anweisungen i = 1; Serial.println(i); i = i + 1; // 2 Serial.println(i); i = i + 1; // 3 Serial.println(i); i = i + 1; // 4 Serial.println(i); i = i + 1; // 5 Serial.println("ENDE"); s Zeichenkette 1 2 3 4 5 6 7 8 9 1 H a l l o \ char s[] = { 'H', 'a', 'l', 'l', 'o', '', '\'; oder kürzer char s[] = "Hallo"; Was ist s[]? Heartbeat void setup() { Serial.begin(96); char buffer[1]; char secret[2] = Joshua"; // Puffer // Geheime Daten while (1) { // Endlosschleife if (Serial.available() > ) { // Daten verfügbar int n = Serial.parseInt(); // Anzahl Zeichen Serial.readBytes(buffer, n); // Zeichen einlesen for (int i = ; i < n; i++) // Zeichen ausgeben Serial.print(buffer[i]); Serial.println(); Themen heute http://commons.wikimedia.org/ wiki/file:media-markt-automat.jpg Zeichenketten Interaktion Automaten Ein Kauf Artikel auswählen Münzen einwerfen Artikel ausgeben

Artikel auswählen Artikel auswählen Zeige eine Auswahl (Menü) vorhandener Artikel an Der Benutzer soll mit Tasten zwischen Artikeln navigieren Dabei soll jeweils der Preis angezeigt werden Ein Kauf Artikel auswählen Münzen einwerfen Artikel ausgeben Münzen einwerfen Münzen (,1 2, ) erkennen Nach Einwurf vom Betrag abziehen Münzen einwerfen Zu zahlenden Restbetrag anzeigen Wiederholen, bis Restbetrag =,

Ein Kauf Artikel auswählen Münzen einwerfen Artikel ausgeben Artikel ausgeben Bei uns etwa: LED leuchten lassen Artikel ausgeben Interaktion Fotos: Wikipedia, Pixabay

LCD-Anzeige Für Interaktion mit Käufer: Preis anzeigen Restbetrag anzeigen Plan Wir schließen ein LCD-Display an Wir schließen Taster an für die Auswahl des Artikels als Sensoren für den Münzeinwurf Wir führen den Käufer durch den Kauf LCD anschließen http://arduino.cc/en/uploads/ Tutorial/LCD_bb.png steuert Anzeige Potentiometer steuert Kontrast

LCD-Bibliothek Eine Bibliothek sammelt Funktionen zu einem bestimmten Zweck Die LiquidCrystal-Bibliothek erlaubt es, ein angeschlossenes LCD anzusprechen Um die Bibliothek zu nutzen, muss sie zunächst eingebunden werden. #include <LiquidCrystal.h> LCD einrichten Dieser Code richtet ein lcd-objekt ein, dessen Funktionen wir dann nutzen können // Anschlüsse der LCD-Anzeige int rspin = 2; int epin = 3; int d4pin = 4; int d5pin = 5; int d6pin = 6; int d7pin = 7; LiquidCrystal lcd(rspin, epin, d4pin, d5pin, d6pin, d7pin); Ausgabe auf LCD lcd.print() gibt einen Text oder einen Wert auf dem LCD aus void setup() { lcd.begin(16, 2); // Breite, Höhe lcd.print("hello, world"); 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 H e l l o, w o r l d 1

Texte und Werte eigener Wahl ausgeben Demo Schreibmarke Die Schreibmarke (Cursor) bestimmt, wo der nächste Text ausgegeben wird Zu Beginn links oben; wird mit jeder Ausgabe weiterbewegt Analog: Schreibmarke in Textverarbeitung Schreibmarke bewegen Die Funktion lcd.setcursor(x, y) bewegt die Schreibmarke auf Spalte x, Zeile y Position oben links ist (, )

Schreibmarke bewegen void setup() { lcd.clear(); // Bildschirm löschen lcd.print("hello, world"); lcd.setcursor(, 7); lcd.print("class"); 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 1 Schreibmarke bewegen void setup() { lcd.clear(); // Bildschirm löschen lcd.print("hello, world"); lcd.setcursor(, 7); lcd.print("class"); 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 H e l l o, w o r l d 1 Schreibmarke bewegen void setup() { lcd.clear(); // Bildschirm löschen lcd.print("hello, world"); lcd.setcursor(, 7); lcd.print("class"); 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 H e l l o, c l a s s 1 w

Zeit ausgeben void setup() { lcd.begin(16, 2); // Breite, Höhe lcd.print("hello, world"); void loop() { lcd.setcursor(, 1); lcd.print(millis() / 1); 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 H e l l o, w o r l d 1 3 2 Schreibmarke bewegen; mit cursor() anzeigen lassen Demo Zeichenketten in C Ein einzelnes Zeichen wird in C in einzelne Hochkomma eingeschlossen: char c = 'a'; lcd.print(c); Die wichtigste Verwendung ist als Feld von Zeichen (Zeichenkette, auch String) Zeichenketten enden mit einem speziellen Null-Zeichen, geschrieben als \

s Zeichenkette 1 2 3 4 5 6 7 8 9 1 H a l l o \ char s[] = { 'H', 'a', 'l', 'l', 'o', '', '\'; oder kürzer char s[] = "Hallo"; String-Funktionen Um mit Zeichenketten umzugehen, bietet C zahlreiche Funktionen: strcpy() Zeichenkette kopieren strcat() Zeichenketten verknüpfen strlen() Länge bestimmen strcmp() Zeichenketten vergleichen Zeichenketten kopieren strcpy(ziel, quelle) kopiert quelle nach ziel ziel muss groß genug sein für quelle name char name[2]; strcpy(name, "Test"); 1 2 3 4 5 6 7 8 9 1 T e s t \

Zeichenketten verknüpfen strcat(ziel, quelle) hängt quelle an ziel an ziel muss groß genug sein name char name[2]; strcpy(name, "Test"); strcat(name, "en"); 1 2 3 4 5 6 7 8 9 1 T e s t \ Zeichenketten verknüpfen strcat(ziel, quelle) hängt quelle an ziel an ziel muss groß genug sein name char name[2]; strcpy(name, "Test"); strcat(name, "en"); 1 2 3 4 5 6 7 8 9 1 T e s t e n \ Länge bestimmen strlen(s) gibt die Länge von s zurück name char name[2]; strcpy(name, "Test"); n = strlen(name); // n = 4 1 2 3 4 5 6 7 8 9 1 T e s t \

Zeichenketten vergleichen Zeichenketten können nicht mit ==, = usw. verglichen werden strcmp(s, t) vergleicht s und t Rückgabe: bei gleichem Inhalt < wenn s alphabetisch vor t kommt > wenn s alphabetisch nach t kommt int u = strcmp("anton", "Anton"); int v = strcmp("anton", "Berta"); Zeichenketten als Parameter Eine Zeichenkette name als Parameter wird so deklariert: char name[] (oft auch: char *name) void print_ten_times(char text[]) { lcd.print(text); // noch neun Mal ausgeben strcpy() So könnte eine Implementierung von strcpy() (Zeichenkette kopieren) aussehen: void strcpy(char ziel[], char quelle[]) { int i = ; while (quelle[i] = '\') { ziel[i] = quelle[i]; i++; ziel[i] = '\';

strcpy() Warum nicht ziel[i++] = quelle[i]? Weil nicht exakt definiert ist, wann i erhöht wird. Alternative Implementierung für Tippfaule void strcpy(char ziel[], char quelle[]) { int i = ; int j = ; while (ziel[i++] = quelle[j++]) { Echte C-Experten können das noch kürzer strcat() So könnte eine Implementierung von strcat() (Zeichenketten verknüpfen) aussehen: void strcat(char ziel[], char quelle[]) { int i = strlen(ziel); int j = ; while (quelle[j] = '\') { ziel[i] = quelle[j]; i++; j++; ziel[i] = '\'; strcat(ziel, en ) void strcat(char ziel[], char quelle[]) { int i = strlen(ziel); int j = ; while (quelle[j] = '\') { ziel[i] = quelle[j]; i++; j++; ziel[i] = '\'; ziel 1 2 3 4 5 6 7 8 9 1 T e s t \

strcat(ziel, en ) void strcat(char ziel[], char quelle[]) { int i = strlen(ziel); int j = ; while (quelle[j] = '\') { ziel[i] = quelle[j]; i++; j++; ziel[i] = '\'; ziel 1 2 3 4 5 6 7 8 9 1 T e s t e n \ strlen() So könnte eine Implementierung von strlen() (Länge bestimmen) aussehen: Typ des Rückgabewertes int strlen(char s[]) { int i = ; while (s[i] = '\') { i++; return i; int n = strlen(ziel); Rückgabe Artikel auswählen Artikel auswählen Zeige eine Auswahl (Menü) vorhandener Artikel an Der Benutzer soll mit Tasten zwischen Artikeln navigieren Dabei soll jeweils der Preis angezeigt werden

Plan In oberer Zeile Artikel anzeigen Artikel anzeigen int DRINKS = 3; char *drink_name[] = { "Wasser", "Limo", "Bier" ; void print_drinks() { char buffer[2]; strcpy(buffer, ""); for (int i = ; i < DRINKS; i++) { if (i > ) strcat(buffer, " "); strcat(buffer, drink_name[i]); lcd.print(buffer); Getränkemenü 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 a s s e r L i m o B i e r H W 1

Schreibmarke bewegen; mit cursor() anzeigen lassen Demo Artikel auswählen Artikel auswählen Zeige eine Auswahl (Menü) vorhandener Artikel an Der Benutzer soll mit Tasten zwischen Artikeln navigieren Dabei soll jeweils der Preis angezeigt werden Plan In unterer Zeile Preise anzeigen Jeweils unter dem Artikelnamen Problem: Preise als Zeichenketten darstellen

Zeichen zu Zahlen Die Funktion atoi(s) wandelt den Beginn einer Zeichenkette s in eine ganze Zahl um Führende Leerzeichen werden überlesen s bleibt unverändert Keine Fehlererkennung n = atoi("25"); n = atoi(" 25"); n = atoi(" 25 years"); n = atoi("25years"); Zahlen zu Zeichen Die Funktion sprintf(s, format, werte ) füllt s mit werte, wie in format angegeben: %d Dezimalzahl (decimal) char buf[128]; sprintf(buf, "%d", 25); // buf[] == "25" %s Zeichenkette (string) sprintf(buf, "%s", "Hugo"); // buf[] == "Hugo" %f Fließkommawert (floating point) sprintf(buf, "%f", 3.14); // buf[] == "3.14" Zahlen zu Zeichen Das sprintf()-format kann weiteren Text enthalten, der dann mitkopiert wird: char buf[128]; int n = 25; sprintf(buf, "Kaufen Sie %d Pelze", n); // buf[] == "Kaufen Sie 25 Pelze"

Zahlen zu Zeichen Die Ausgabe von mehreren Parametern ist ebenfalls möglich: char buf[128]; int n = 25; int p = 6; sprintf(buf, "%d Bohrer zu %d Euro", n, p); // buf[] == "25 Bohrer zu 6 Euro" Maximale Länge Zahlen vor der Formatangabe bestimmen die maximale Länge char buf[128]; int n = 25; sprintf(buf, "Anzahl:%5d", n); // buf[] == "Anzahl: 25 5 Zeichen sprintf(buf, "Anzahl:%7d", n); // buf[] == "Anzahl: 25" 7 Zeichen Nachkommastellen Punkt und Zahl vor der Formatangabe bestimmen die Nachkommastellen: char buf[128]; double pi = 3.1415; sprintf(buf, "pi = %.3f", pi); // buf[] == "pi = 3.142" 3 Stellen sprintf(buf, "pi = %7.2f", pi); // buf[] == "pi = 3.14" 2 Stellen

Menü mit Preis int DRINKS = 3; char *drink_name[] = { "Wasser", "Limo", "Bier" ; double drink_price[] = { 1., 1.5, 2.5 ; void print_prices() { int x = ; for (int i = ; i < DRINKS; i++) { char buffer[1]; lcd.setcursor(x, 1); sprintf(buffer, "%.2f", drink_price[i]); lcd.print(buffer); x += strlen(drink_name[i]) + 1; Getränkemenü 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 W a s s e r L i m o B i e r 1 1 H. 1. 5 2. Schreibmarke bewegen; mit cursor() anzeigen lassen Demo

Artikel auswählen Artikel auswählen Zeige eine Auswahl (Menü) vorhandener Artikel an Der Benutzer soll mit Tasten zwischen Artikeln navigieren Dabei soll jeweils der Preis angezeigt werden Plan Aktuell ausgewählten Artikel durch Blinken sichtbar machen Auswahl mit Drehimpulsgeber Drehimpulsgeber Quelle: http://cdn-reichelt.de/ bilder/web/xxl_ws/b4/ STEC12E-VERT.png Beim Drehen kurzer Impuls (= Verbindung zwischen Pin Impuls und Impuls links bzw. Impuls rechts) Beim Drücken wie Taster Impuls links Pin Impuls Pins Taster Impuls rechts

Anschluss Drehimpulsgeber // Impulsgeber und Taster verbinden mit GND int turnleftpin = 1; // Impulsgeber int turnrightpin = 11; int selectpin = 12; // Taster void setup() { pinmode(turnleftpin, INPUT_PULLUP); pinmode(turnrightpin, INPUT_PULLUP); pinmode(selectpin, INPUT_PULLUP); // Weitere Initialisierungen Aktiviert eingebauten Pullup-Widerstand Getränkemenü 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 ஏW a s s e r L i m o B i e r 1 1 H. 1. 5 2. Getränkemenü 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 W a s s e r ஏL i m o B i e r 1 1 H. 1. 5 2.

Getränkemenü 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 W a s s e r L i m o ஏB i e r 1 1 H. 1. 5 2. Getränkemenü 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 W a s s e r ஏL i m o B i e r 1 1 H. 1. 5 2. Schreibmarke sichtbar machen Mit lcd.cursor() können wir die Schreibmarke als Unterstrich (_) sichtbar machen lcd.blink() lässt sie als Block blinken lcd.nocursor(), lcd.noblink() schaltet dies wieder ab

Auswahl anzeigen // Schreibmarke auf Getränkename positionieren // drink = : 1. Getränk, // drink = 1: 2. Getränk, usw. void show_selection(int drink) { int x = ; for (int i = ; i < drink; i++) { x += strlen(drink_name[i]); x += strlen(" "); lcd.setcursor(x, ); lcd.blink(); Getränk wählen // Getränk auswählen und dessen Nummer zurückgeben int choose_drink() { int current_selection = ; unsigned long last_select = millis(); show_selection(current_selection); while (1) { if (millis() - last_select > 2) { // Drehen nach rechts if (digitalread(turnrightpin) == LOW) { if (current_selection < DRINKS - 1) { current_selection++; show_selection(current_selection); last_select = millis(); // Drehen nach links if (digitalread(turnleftpin) == LOW) { if (current_selection > ) { current_selection--; show_selection(current_selection); last_select = millis(); // Drücken if (digitalread(selectpin) == LOW) { lcd.noblink(); return current_selection;

// Getränk auswählen und dessen Nummer zurückgeben int choose_drink() { int current_selection = ; unsigned long last_select = millis(); show_selection(current_selection); while (1) { if (millis() - last_select > 2) { // Drehen nach rechts if (digitalread(turnrightpin) == LOW) { if (current_selection < DRINKS - 1) { current_selection++; show_selection(current_selection); last_select = millis(); // Drehen nach links if (digitalread(turnleftpin) == LOW) { if (current_selection > ) { current_selection--; show_selection(current_selection); last_select = millis(); // Drücken if (digitalread(selectpin) == LOW) { lcd.noblink(); return current_selection; Impuls links Pin Impuls Pins Taster Impuls rechts Alles zusammen void loop() { lcd.clear(); print_drinks(); print_prices(); int selection = choose_drink(); // Weitere Funktionen, etwa: // pay_for_drink(selection); // dispense_drink(selection); Schreibmarke bewegen; mit cursor() anzeigen lassen Demo

Ein Kauf Fertig siehe Übung siehe Übung Artikel auswählen Münzen einwerfen Artikel ausgeben LCD einrichten // Anschlüsse der LCD-Anzeige int rspin = 2; 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 int epin = 3; int d4pin = 4; H e l l o, w o r l d int d5pin = 5; 1 int d6pin = 6; int d7pin = 7; LiquidCrystal lcd(rspin, epin, d4pin, d5pin, d6pin, d7pin); void setup() { lcd.begin(16, 2); // Breite, Höhe lcd.print("hello, world"); Drehimpulsgeber Beim Drehen kurzer Impuls (= Verbindung zwischen Pin Impuls und Impuls links bzw. Impuls rechts) Beim Drücken wie Taster Impuls links Pin Impuls Pins Taster Impuls rechts Zeichenketten in C Ein einzelnes Zeichen wird in C in einzelne Hochkomma eingeschlossen: char c = 'a'; lcd.print(c); Die wichtigste Verwendung ist als Feld von Zeichen (Zeichenkette, auch String) Zeichenketten enden mit einem speziellen Null-Zeichen, geschrieben als \ Menü mit Preis int DRINKS = 3; char *drink_name[] = { "Wasser", "Limo", "Bier" ; double drink_price[] = { 1., 1.5, 2.5 ; void print_prices() { int x = ; for (int i = ; i < DRINKS; i++) { char buffer[1]; lcd.setcursor(x, 1); sprintf(buffer, "%.2f", drink_price[i]); lcd.print(buffer); x += strlen(drink_name[i]) + 1; Handouts

strlen() So könnte eine Implementierung von strlen() (Länge bestimmen) aussehen: Typ des Rückgabewertes int strlen(char s[]) { int i = ; while (s[i] = '\') { i++; return i; int n = strlen(ziel); Rückgabe LCD einrichten // Anschlüsse der LCD-Anzeige int rspin = 2; int epin = 3; int d4pin = 4; H e l l o, w o r l d int d5pin = 5; 1 int d6pin = 6; int d7pin = 7; LiquidCrystal lcd(rspin, epin, d4pin, d5pin, d6pin, d7pin); void setup() { lcd.begin(16, 2); // Breite, Höhe lcd.print("hello, world"); 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 Artikel anzeigen int DRINKS = 3; char *drink_name[] = { "Wasser", "Limo", "Bier" ; void print_drinks() { char buffer[2]; strcpy(buffer, ""); for (int i = ; i < DRINKS; i++) { if (i > ) strcat(buffer, " "); strcat(buffer, drink_name[i]); lcd.print(buffer);

Menü mit Preis int DRINKS = 3; char *drink_name[] = { "Wasser", "Limo", "Bier" ; double drink_price[] = { 1., 1.5, 2.5 ; void print_prices() { int x = ; for (int i = ; i < DRINKS; i++) { char buffer[1]; lcd.setcursor(x, 1); sprintf(buffer, "%.2f", drink_price[i]); lcd.print(buffer); x += strlen(drink_name[i]) + 1; Anschluss Drehimpulsgeber // Impulsgeber und Taster verbinden mit GND int turnleftpin = 1; // Impulsgeber int turnrightpin = 11; int selectpin = 12; // Taster void setup() { pinmode(turnleftpin, INPUT_PULLUP); pinmode(turnrightpin, INPUT_PULLUP); pinmode(selectpin, INPUT_PULLUP); // Weitere Initialisierungen Aktiviert eingebauten Pullup-Widerstand Getränk wählen // Getränk auswählen und dessen Nummer zurückgeben int choose_drink() { int current_selection = ; unsigned long last_select = millis(); show_selection(current_selection); while (1) { if (millis() - last_select > 2) { // Drehen nach rechts if (digitalread(turnrightpin) == LOW) { if (current_selection < DRINKS - 1) { current_selection++; show_selection(current_selection); last_select = millis();

// Drehen nach links if (digitalread(turnleftpin) == LOW) { if (current_selection > ) { current_selection--; show_selection(current_selection); last_select = millis(); // Drücken if (digitalread(selectpin) == LOW) { lcd.noblink(); return current_selection; Alles zusammen void loop() { lcd.clear(); print_drinks(); print_prices(); int selection = choose_drink(); // Weitere Funktionen, etwa: // pay_for_drink(selection); // dispense_drink(selection);