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