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); }