Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

C / C++ für das Internet der Dinge und Hausautomatisierung Arduino Uno / Nano / … Input, Interrupts, Timer, Sleepmode Hochschule Fulda – FB AI Sommersemester.

Ähnliche Präsentationen


Präsentation zum Thema: "C / C++ für das Internet der Dinge und Hausautomatisierung Arduino Uno / Nano / … Input, Interrupts, Timer, Sleepmode Hochschule Fulda – FB AI Sommersemester."—  Präsentation transkript:

1 C / C++ für das Internet der Dinge und Hausautomatisierung Arduino Uno / Nano / … Input, Interrupts, Timer, Sleepmode Hochschule Fulda – FB AI Sommersemester 2017 Peter Klingebiel, HS Fulda, FB AI

2 Arduino Nano V C / C++ - Peter Klingebiel - HS Fulda - FB AI 2

3 Arduino Nano V C / C++ - Peter Klingebiel - HS Fulda - FB AI 3

4 Arduino Nano Input/Output 1
C / C++ - Peter Klingebiel - HS Fulda - FB AI 4

5 Arduino Nano Input/Output 2
Mikroprozessor Atmel ATmega328P Clock 16 MHz Betriebsspannung 5 Volt Eingangsspannung 7 Volt bis 12 Volt Stromverbrauch 19 mA Speicher Flash 32 KB (davon 2KB für Bootloader) SRAM 2 KB EEPROM 1 KB 32 Pins, davon 22 Input- und Output-Pins maximale Last je IO-Pin 40 mA C / C++ - Peter Klingebiel - HS Fulda - FB AI

6 Arduino Nano Input/Output 3
22 digitale IO-Pins D0 und D1 (serielle Schnittstelle Serial, USB) D2 .. D13 (frei nutzbar) A0 .. A7 (analoge Eingänge auch digital nutzbar) externe Interrupts INT0 auf D2, INT1 auf D3 Pin Change Interrupts auf allen digitalen Pins SoftwareSerial auf allen digitalen Pins möglich analoge Ausgabe per PWM auf 6 Pins möglich 8 analoge IO-Pins A0 .. A7 auch als digitale Ausgänge nutzbar (Port C) analoger Input mit 10 Bit (Wertebereich ) analoger Output 8 Bit auf D3, D5, D6, D9, D10 und D11 C / C++ - Peter Klingebiel - HS Fulda - FB AI

7 Arduino Nano Input/Output 4
C / C++ - Peter Klingebiel - HS Fulda - FB AI 7

8 IO-Programmierung 1 Pin auf Eingang oder Ausgang schalten
void pinMode(int pin, int mode) Eingang p auf Modus INPUT oder OUTPUT einstellen digital schreiben und lesen void digitalWrite(int pin, int value) Wert value (0, 1) auf digitalen Ausgang pin schreiben int digitalRead(int pin) Wert (0, 1) vom digitalen Eingang pin lesen analog schreiben und lesen void analogWrite(int pin, int value) Wert value (8 Bit, ) auf PWM-Ausgang pin schreiben int analogRead(int p) Wert (10 Bit, ) von analogen Eingang pin (A0..A7) lesen C / C++ - Peter Klingebiel - HS Fulda - FB AI

9 PWM - Pulsweitenmodulation 1
der Arduino bietet keine echt-analoge Ausgabe meist reicht eine quasi-analoge Ausgabe per PWM, die die Trägheit vieler Systeme ausnutzt Standard-PWM-Frequenzen: Pins D5 und D6: ~1 kHz Pins D3, D9, D10, D11: ~ 500 Hz C / C++ - Peter Klingebiel - HS Fulda - FB AI

10 PWM - Pulsweitenmodulation 2
PWM „selbstgebaut“ Frequenz: ~ 1 kHz, Output: 63 bzw. 25% #define PIN // PWM auf Pin D12 void setup() { pinMode(PIN, OUTPUT); } void loop() { for(int i = 0; i < 1000; i++) { // 1 sec digitalWrite(PIN, HIGH); delayMicroseconds(250); // ms digitalWrite(PIN, LOW); delayMicroseconds(750); // ms } Besser: Verwendung von Timern und Interrupts C / C++ - Peter Klingebiel - HS Fulda - FB AI

11 Polling oft: Abfragen von externen asynchronen Ereignissen, auf die angemessen reagiert werden soll Bsp: Taster schaltet eine LED void loop() { int s = digitalRead(schalter); if(s == HIGH) digitalWrite(led, HIGH); else digitalWrite(led, LOW); } ständiges Abfragen (Polling) ist sehr ungünstig! C / C++ - Peter Klingebiel - HS Fulda - FB AI

12 Interrupts Besser: auf asynchrones Ereignis mit asynchronem Mittel reagieren: Interrupt Interrupt unterbricht den normalen Programmlauf und arbeitet einen sog. Interrupthandler ab C / C++ - Peter Klingebiel - HS Fulda - FB AI

13 Interrupts für Reaktion auf und Behandlung von asynchronen Ereignissen sind drei Dinge notwendig: asynchrones Ereignis festlegen, Beispiel: Schalter betätigt  Pegel auf HIGH Interrupthandler installieren, Beispiel: bei Schalterdruck soll die Funktion handler() aufgerufen werden Interrupthandler programmieren wichtig: Interrupthandler sollen kurz sein und nur die notwendigsten Aktionen durchführen notwendig: volatile Variable C / C++ - Peter Klingebiel - HS Fulda - FB AI

14 Interrupts Definition einer Zustandsvariablen als volatile volatile int ledstatus = LOW;  Compiler optimiert diese Variable nicht Interrupthandler schaltet LED void handler() { ledstatus = !ledstatus; digitalWrite(led, ledstatus); } Interrupthandler installieren: bei Schalterbetätigung  hier bei fallender Flanke (FALLING) attachInterrupt(digitalPinToInterrupt(swt), handler, FALLING); Interruptmodi: LOW, CHANGE, RISING, FALLING C / C++ - Peter Klingebiel - HS Fulda - FB AI

15 Sleep oft sinnvoll: Mikrocontroller „schlafen“ legen, d.h. auf minimale Funktionalität reduzieren Ziel: Stromverbrauch senken, um lange Lebensdauer von Batterien/Akkus zu gewährleisten meist sind nur noch externe Events über Interrupts in Betrieb, um den Mikrocontroller aufzuwecken, d.h. wieder in den Normalbetrieb zu versetzen  Sleepmodus immer in Verbindung mit Interrupt wichtigster Sleepmodus: SLEEP_MODE_PWR_DOWN weitere Modi: IDLE, PWR_SAVE, STANDBY bei Nano/Uno usw. wegen USB nur geringe Wirkung! C / C++ - Peter Klingebiel - HS Fulda - FB AI

16 Sleep Beispiel: in setup() Sleepmodus einstellen … set_sleep_mode(SLEEP_MODE_PWR_DOWN); … und ISR (Interrupthandler) installieren attachInterrupt(digitalPinToInterrupt(pin),..); an passender Stelle, z.B. in loop() oder in eigener Funktion gosleep() MC in den Schlafmodus versetzen ... sleep_enable(); // sleep modus ein sleep_mode(); // in sleep modus gehen // hier geht’s nur nach Interrupt weiter sleep_disable(); // sleep modus aus ... C / C++ - Peter Klingebiel - HS Fulda - FB AI

17 Timer oft ist es notwendig, bestimmte Aktivitäten zeit- und interruptgesteuert, d.h. mit Timern und entsprechenden ISR durchzuführen dabei wird ein Timer so eingestellt, dass nach einer bestimmten Zeitdauer ein Interrupt ausgelöst wird im Interrupthandler werden dann die gewünschten Aktionen ausgeführt für Arduino bietet sich hierfür eine der Timerlibraries, z.B. die Library TimerOne an diese bietet eine einfach zu bedienende Schnittstelle für das Handling von Timern an C / C++ - Peter Klingebiel - HS Fulda - FB AI

18 Timer Beispiel: blinkende LED mit Timer gesteuert #include <TimerOne.h> volatile int ledstatus = LOW; void blink() { digitalWrite(13, ledstatus = !ledstatus); } void setup() { pinMode(13, OUTPUT); Timer1.initialize( ); // 1 sec Timer1.attachInterrupt(blink); } void loop() { // mach was!!! } C / C++ - Peter Klingebiel - HS Fulda - FB AI


Herunterladen ppt "C / C++ für das Internet der Dinge und Hausautomatisierung Arduino Uno / Nano / … Input, Interrupts, Timer, Sleepmode Hochschule Fulda – FB AI Sommersemester."

Ähnliche Präsentationen


Google-Anzeigen