So wir kommen so langsam vorran.
Das Program zum Lampenschalten hab ich fertig.
Derzeit beschäftige ich mich mit der Frage ob ich einen Mega für die Lampen und einen für die Jalousien machen soll oder zwei, drei gemischte.
Zur I2C Kommunikation von Arduinos
hätte ich eine Frage:
Viele Taster Abfragen und auf click und doppelclick prüfen
#define INPUTMODE INPUT_PULLUP // INPUT oder INPUT_PULLUP
#define PRELLZEIT 5 // Prellzeit in Millisekunden
#define SHORTCLICKTIME 250 // Längste Zeit für einen SHORTCLICK
#define DOUBLECLICKTIME 400 // Längste Zeit für den zweiten Klick beim DOUBLECLICK
#define LONGCLICKTIME 600 // Mindestzeit für einen LONGGLICK
byte buttonPins[]={2,3,4,5...usw.}; // Arduino Pins
#define NUMBUTTONS sizeof(buttonPins)
byte buttonState[NUMBUTTONS]; // Aktueller Status des Buttons HIGH/LOW
enum {NONE, FIRSTDOWN, FIRSTUP, SHORTCLICK, DOUBLECLICK, LONGCLICK};
byte buttonResult[NUMBUTTONS]; // Aktueller Klickstatus der Buttons NONE/SHORTCLICK/LONGCLICK
void setup() {
for (int i=0;i<NUMBUTTONS;i++) pinMode(buttonPins[i],INPUTMODE);
}
boolean eingabe()
// Rückgabewert false ==> Prellzeit läuft, Taster wurden nicht abgefragt
// Rückgabewert true ==> Taster wurden abgefragt und Status gesetzt
{
static unsigned long lastRunTime;
static unsigned long buttonDownTime[NUMBUTTONS];
unsigned long now=millis();
if (now-lastRunTime<PRELLZEIT) return false; // Prellzeit läuft noch
lastRunTime=now;
for (int i=0;i<NUMBUTTONS;i++)
{
byte curState=digitalRead(buttonPins[i]);
if (INPUTMODE==INPUT_PULLUP) curState=!curState; // Vertauschte Logik bei INPPUT_PULLUP
if (buttonResult[i]>=SHORTCLICK) buttonResult[i]=NONE; // Letztes buttonResult löschen
if (curState!=buttonState[i]) // Flankenwechsel am Button festgestellt
{
if (curState) // Taster wird gedrückt, Zeit merken
{
if (buttonResult[i]==FIRSTUP && now-buttonDownTime[i]<DOUBLECLICKTIME)
buttonResult[i]=DOUBLECLICK;
else
{
buttonDownTime[i]=now;
buttonResult[i]=FIRSTDOWN;
}
}
else // Taster wird losgelassen
{
if (buttonResult[i]==FIRSTDOWN) buttonResult[i]=FIRSTUP;
if (now-buttonDownTime[i]>=LONGCLICKTIME) buttonResult[i]=LONGCLICK;
}
}
else // kein Flankenwechsel, Up/Down Status ist unverändert
{
if (buttonResult[i]==FIRSTUP && now-buttonDownTime[i]>DOUBLECLICKTIME)
buttonResult[i]=SHORTCLICK;
}
buttonState[i]=curState;
} // for
return true;
}
void loop() {
eingabe()
}
I2C Master schaltet per Taster am Slave eine LED ein
#include < Wire.h > // <-- remove spaces
int x =0;
int slaveAddress = 9;
const int buttonPin = 2; // the number of the pushbutton pin
int buttonState = 0; // variable for reading the pushbutton status
void setup()
{
pinMode( buttonPin, INPUT ); // initialize the pushbutton pin as an input
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin( 9600 ); // start serial for output
}
void loop()
{
// read the state of the pushbutton value:
buttonState = digitalRead( buttonPin );
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if ( buttonState == HIGH )
{
x = 1;
}
else
{
x = 0;
}
Wire.beginTransmission( slaveAddress ); // transmit to device #9
Wire.write(x); // sends x
Wire.endTransmission(); // stop transmitting
delay(200);
}
Wenn ich wie hier meherere Pin´s abfrage und unserem Fall dann ja 48 oder so,
kann ich dann
for (int i=0;i<NUMBUTTONS;i++)
Wire.write(buttonResult[i]);
Was z.B. ein Shortclick sein kann zum anderen Arduino schicken oder empfiehlt es sich hier 0, 1, 2 für z.B Aus, Shortclick und Doppelclick zu nutzen?
Hoff ich hab die I2C Kommunikation soweit verstanden...
Für was ist eigentlich das delay(200) am Ende?
Gruß Joe