Dies ist eine alte Version des Dokuments!
Arduino WS (8) Jan.19
Die Idee war, möglichst viele Dinge an einem Arduino anzuschließen, ohne daß der Code kompliziert wird. Hier der Beispielcode.
Eingaben: 2 Taster, 1 Poti, Temperatur- und Feuchtesensor
Ausgaben: 1 LED blinkt, von 4 LEDs leuchtet eine (Nr. 0..3), LCD Display 2 Zeilen a 16 Zeichen, LED Streifen mit 8 LEDs
// Programm zum Demonstrieren von einfachem Abfragen vieler // Sensoren / Eingaben und steuern vieler Aktoren / Ausgaben // mit einfachen Mitteln // dht: DHT11 - Temperatur- und Feuchtesensor #include <DHT.h> #include <DHT_U.h> // https://desire.giesecke.tk/index.php/2018/01/30/esp32-dht11/ // DHT11-Anschluss: VCC (+), data(pullup 10k), NC (not connected), GND (-) const int DHTPin = 9; // data Pin const int DHTType = DHT11; DHT dht(DHTPin, DHTType); // lcd: LCD mit 16*2 Zeichen*Zeilen (via Serial/Parallel Umsetzer) #include <Wire.h> #include <LiquidCrystal_PCF8574.h> // https://github.com/mathertel/LiquidCrystal_PCF8574/blob/master/examples/LiquidCrystal_PCF8574_Test/LiquidCrystal_PCF8574_Test.ino LiquidCrystal_PCF8574 lcd(0x27); // 0x27==1602LCD // strip: LED-Streifen mit einzeln ansteuerbaren RGB LEDs #include <FastLED.h> const int StripPin = 8; const int StripLEN = 8; CRGB strip[StripLEN]; // Diverse Ein-/Ausgabepins const int PotiPIN = A0; const int PINblink = 13; // Wiederverwendbare Logik zur Abfragen von Buttons incl. Entprellen typedef struct { int press; int wait; int pin; } t_button; t_button button_abc = {HIGH,0,2}; // Vorwärts-Knopf Pin 2 t_button button_cba = {HIGH,0,7}; // Rückwärts-Knopf Pin 7 int abc = 0; // aktuelle Position const int PINled[] = {3,4,5,6}; // LEDs dafür const int PINleds = sizeof(PINled)/sizeof(int); // Anzahl=4 // dazu... // check_button(&button) liefert, ob Taste gedrückt wurde und macht Entprellung // (wartet aber nie, falls nix passiert liefert es 0 (false)) // (setzt voraus, daß es in ca. 1ms Abständen aufgerufen wird) int check_button(t_button *b) { if (b->wait > 0) { b->wait--; return 0; } if (digitalRead(b->pin)==b->press) return 0; if (b->press==HIGH) b->press = LOW; else b->press = HIGH; b->wait=50; return !(b->press); } void setup() // Initialisierungen { // LEDs und buttons dazu pinMode(button_abc.pin, INPUT_PULLUP); pinMode(button_cba.pin, INPUT_PULLUP); for(int i=0; i<PINleds; i++) pinMode(PINled[i], OUTPUT); digitalWrite(PINled[abc],1); // LED strip FastLED.addLeds<NEOPIXEL, StripPin>(strip, StripLEN); for (int i=0; i<StripLEN; i++) { strip[i].setRGB(1,0,0); } FastLED.show(); // lcd Wire.begin(); Wire.beginTransmission(0x27); int error = Wire.endTransmission(); delay(100); lcd.begin(16,2); lcd.clear(); lcd.print("Hello world!"); lcd.setBacklight(15); //lcd.blink(); lcd.noBlink(); //lcd.cursor(); lcd.noCursor(); delay(100); } int counter = 0; // zählt immer bis 2000, dann wieder 0, für Diverses // void loop() // Hauptschleife von ca. 1ms Länge { // Lese Poti-Position und Zeige diese auf dem LED strip an static int poti = 0; if ((counter&0xf)==0xf) // (ausdünnen, nicht immer machen) { strip[poti*StripLEN/1024].setRGB(1,0,0); poti=analogRead(PotiPIN); strip[poti*StripLEN/1024].setRGB(1,10,0); FastLED.show(); // Zeige auf lcd Zustand von led (abc) und Poti-Position if ((counter&0xff)==0xff) // (ausdünnen, nicht immer machen) { lcd.setCursor(0,0); char s[100]; sprintf(s,"led=%d poti=%d ",abc,poti); lcd.print(s); // Zeile0: led=x poti=xxx // DHT11 - Temperatur- und Feuchtesensorwerte, // sowie Zeit seit Start anzeigen lcd.setCursor(0,1); if ((counter&0x3ff)==0x3ff) // (ausdünnen, nicht immer machen) { float h = dht.readHumidity(); float t = dht.readTemperature(); if (t>0) t-=4; // Calib.: -4 if (h>0) // h==0 deutet auf Fehler, dann also nicht { sprintf(s,"%dC %d%% %d:%02d",(int)t,(int)h,(int)(millis()/60000),(int)((millis()/1000)%60)); lcd.print(s); // Zeile1: xxC xx% m:ss } } } } // Tasten, die die LED (Nr. abc) Vor-/Rückwärts steuern if (check_button(&button_abc)) // vorwärts? { digitalWrite(PINled[abc],0); // alte LED aus abc++; // 1 weiter if (abc>=PINleds) abc=0; // zyklisch digitalWrite(PINled[abc],1); // neue LED an } if (check_button(&button_cba)) // rückwärts? { digitalWrite(PINled[abc],0); // alte LED aus abc--; // 1 zurück if (abc<0) abc=PINleds-1; // zyklisch digitalWrite(PINled[abc],1); // neue LED an } // Eine LED blinkt counter++; if (counter==1000) { digitalWrite(PINblink,1); } if (counter==2000) { digitalWrite(PINblink,0); counter=0; } // Warte etwas eniger als 1ms (weil Rest der Rechenzeit zu 1ms braucht // das Programm durchschnittlich, jedenfalls ungefähr) delayMicroseconds(900); }