Mit Arduino Mega 24V Relais schalten // Derzeit I2C Master-Slave Frage

Nicht viel schnacken, einfach machen!

Ein UNO Set ist ja schön und gut aber ihr braucht zuerst eine Platine.
Ok, Programmieren lernen könnt ihr, LEDs leuchten lassen aber im Endeffekt braucht ihr erst die Platine.
Macht ein Schaltplan, holt euch Eagle, am besten Version 7. Beim erstellen kann man hier auch helfen.

Meiner Meinung nach sind die bisherigen Platinen brauchbar.
Warum neue machen? Für vernünftige neue Platinen scheint mir die notwendige Expertise zu fehlen.

Aber jeder muss seinen eigenen Weg finden um sich unglücklich zu machen.

Aber jeder muss seinen eigenen Weg finden um sich unglücklich zu machen.

Genau!

Was ich tun würde (wenn ich die Bedingungen richtig einschätze):

Schaltplan malen
1 bis 2 Megas(Wozu einen UNO?) beschaffen (einen zum kaputt spielen, einen als Ersatzteil)
Arduino IDE installieren.
Mit Avrdude(gehört zur IDE) ein Backup der jetzigen Software machen

Dann kann es ans schreiben einer neuen Software gehen.
Dazu wird es nötig sein, sich ins Arduino Umfeld einzuarbeiten.
Zwingend: C++ lernen.

Und ja, eine Anbindung an das vorhandene (W)LAN ist möglich, und damit auch die Steuerung über ein Händi.
Das ist ein ausgetretener Pfad.

Bei den recht simplen Platinen würd ich nicht mal ein Schaltplan malen, wozu? Nur um zu wissen welcher Pin was schaltet? Das kann man sich aufschreiben und gut ist. Ok, für die nachfolgenden/Elektriker wärs nett.

Kunde ist König, die wollten neue Platinen, solln die machen. Funktionieren tun ja diese. Man könnt nur 1 Arduino sparen.

Ok, für die nachfolgenden/Elektriker wärs nett.

So hat eben jeder seine eigenen Prioritäten...

Für mich ist das ein Schaltschrank, und zu jedem Schaltschrank gehört ein Ordner, mit dem ganzen Tüddel.

Auch:
Das malen des Plans, verinnerlicht den Aufbau.

SkobyMobil:
Hallo,
das Projekt ist zum scheitern verurteilt. Holt euch einen Elektriker. Ich bin raus.
Gruß und Spaß
Andreas

Bin darauf erst gar nicht eingegangen da für mich klar war das wir das als erstes fachgerecht verdrahten müssen und mir keine Probleme bereiten wird.....
Hutschiene mit Dreistock Wago´s rein, alle Schalter mit Zugentlastung sauber anschließen, die Arduino´s "fest" montieren und verdrahten.
Machen wir wenn ich das nächste mal bei Jonas bin.

Zwischenzeitlich werden wir .uns mit den Starter Kit´s beide in die Arduinowelt einarbeiten um erste erfahrungen zu sammeln.

Dachach werden mir uns auf jeden fall einen Mega, einen ULN und 8 Relais und Schalter besorgen um ausgibig am Programm zu arbeiten und testen zu können.

Anschließend wird entscheiden wir ob wir die 3 Platien weiter nutzen, wir uns nach deren Vorlage neu machen werden, evt. auch mit Optokopplern, ob wir mehr Ein und Ausgänge benötigen oder auf zwei oder vier Arduino´s gehen wollen.

Euch allen schon mal vielen Dank für eure Hilfe
Wir werden regelmäßig berichten wie wir vorrankommen und ggf. wieder das ein oder andere Problem mit euch besprechen. Wird aber immer etwas Zeit vergen da wir nicht all zu nah beieinander wohnen.

Grüße Joe

Macht weiter, ich freue mich schon auf die Ablaufsteuerung für die Rollos :slight_smile:

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

Joe-muc:
Für was ist eigentlich das delay(200) am Ende?

Ohne ballert der Master den Slave mit Daten zu, die Unterbrechung verschafft dem Slave "Luft zum Atmen".

Dein derzeitiges Konzept: Alles wird ständig, abgesehen vom delay, übertragen. Natürlich könntest Du die zu übertragene Datenmenge reduzieren, wenn Du Dich auf Änderungen beschränkst. Das bedeutet mehr Programmieraufwand, dafür weniger Daten. Was für Dein Projekt optimal ist, kann ich Dir auch nicht sagen, hat alles so seine Vor- und Nachteile. Was intern abläuft, ist nicht so relevant, wenn der Bediener aber merkliche Verzögerungen spürt, kann das recht unangenehm sein. Versuch macht kluch!