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