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

Dieses Thema existiert noch nicht

Sie sind einem Link zu einer Seite gefolgt, die noch nicht existiert. Sie können die Seite mit dem Knopf Seite anlegen selbst anlegen und mit Inhalt füllen.