Anpassung für blinkende Lichterkette

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

Antworten
Corvinius
Beiträge: 2
Registriert: 05.02.2022, 12:24
System: Alternative CCU (auf Basis OCCU)

Anpassung für blinkende Lichterkette

Beitrag von Corvinius » 01.05.2022, 20:38

Hello Zusammen,

vielen Dank, dass ich mit im Forum sein darf. Ich nutze aktuell RaspberryMatic als CCU und hab schon einige Geräte im Einsatz.
Nun habe ich mir vor Kurzem ein paar schöne Garten-Lichterketten besorgt, welche mit Solar auf 3,3V Basis funktionieren. Gern würde ich die via Homekit steuern. Mein erster Ansatz über einen ESP8266 haben theoretisch funktioniert aber der Batteriverbrauch war zu hoch.
Daher habe ich mich auf AskSin++ zurückbesonnen. Mein erster Versuch mit dem Batteri-Aktor von Papa ( https://github.com/pa-pa/AskSinPP/blob/ ... BA-PCB.ino ) war auch gut, jedoch habe ich folgendes "Problem" und würde mich über eure Hilfe sehr freuen:
Die Lichterkette hat nur einen Schalter, welcher quasi Programme "durchschaltet" -> also 1x Drücken An, noch mal Drücken langsam blinken, noch mal schnell blinken usw. bis "Aus".
Gern möchte ich das natürlich abbilden und mit verarbeiten, aber da scheitert es leider. Im ESP hatte ich im loop() quasi eine "Zählfunktion" und habe im Interval den A0 gemessen, ob Spannung anliegt. Wenn über 20 Durchläufe alle 1 sec 20 Werte "high" waren, wusste ich, die Lampe ist an. Wenn 20 Werte "low" waren war sie aus, wenn weniger als 20 aber mehr als 0 waren war die Lampe grad irgendwie am Blinken und ich konnte über den Schalter quasi digital so lange drücken, bis sie wieder an oder aus war. Somit ist quasi die "Blinken" Funktion nicht mehr da, würde mir aber auch reichen.
Quasi so…

Code: Alles auswählen

 unsigned long currentMillis = millis();

  if ((unsigned long)(currentMillis - previousLampStateChange) >= timeIntervalLampStateChange)
  {
    previousLampStateChange = currentMillis;
    getLampStatus();
  }
  
  …
  
  void getLampStatus() {
  int inputState = digitalRead(statusInput);
  statusCounter = statusCounter + inputState;
  counter++;

  if (counter == 20 && statusCounter == 0) {
    Serial.println("Lamp On");
    counter = 0;
    statusCounter = 0;
    globalLampStatus = lampOn;
    sendMQTTdata("currentStatus", "lampOn");
  }

  if (counter == 20 && statusCounter == 20) {
    Serial.println("Lamp Off");
    counter = 0;
    statusCounter = 0;
    globalLampStatus = lampOff;
    sendMQTTdata("currentStatus", "lampOff");
  }

  if (counter == 20 && statusCounter < 20 && statusCounter > 0) {
    Serial.println("Lamp blinking");
    counter = 0;
    statusCounter = 0;
    globalLampStatus = lampBlinking;
    sendMQTTdata("currentStatus", "lampBlinking");
  }

  if (counter > 20) {
    counter = 0;
    statusCounter = 0;
  }

}
  

Meine Frage wäre jetzt - wie kann ich diese Funktion quasi oben in den AskSin++ Sketch einbauen, sodass ich die Lampe entsprechend steuern kann. Grob gesagt: wenn jemand den Knopf am Gehäuse drückt, soll sie halt auch angehen. Und ich will dann am HomeKit Gerät sehen, dass die Lampe an ist. Und wenn jemand noch mal drückt oder ich sie halt via HomeKit ausschalte, muss der Sketch quasi "durchschalten", bis sie aus ist.

Sollte es wieder meinen Erwartungen möglich sein, eine "blinkende" Lampe in HomeKit mit einzubauen, wäre das toll. Aber ich hab bisher nur farbige Lampen gesehen…

Ich hoffe, ich hab niemanden verwirrt :roll: :roll: und ihr könnt mir helfen :?:
Vielen Dank im Voraus und einen schönen Abend.

papa
Beiträge: 631
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 12 Mal
Danksagung erhalten: 102 Mal

Re: Anpassung für blinkende Lichterkette

Beitrag von papa » 02.05.2022, 08:52

Im Prinzip sollte das Erkennen des aktuellen Zustandes mit der Alarm-Klasse recht einfach zu machen sein.
Grob könnte das so aussehen - ohne Deine Logik:

Code: Alles auswählen

class StatusMon : public Alarm {
  int state; // 0=off, 1=on, 2=blink
public:
  StatusMon () : Alarm(0,true), state(0) {
    // init you input pin
  }
  virtual ~StatusMon () {}

  virtual void trigger (AlarmClock& clock) {
    // read input pin and update counters
    // and store state in member

    // reactivate alarm
    set(millis2ticks(100));
    clock.add(*this);
  }

  void start (AlarmClock& clock) {
    trigger(clock);
  }
  
  int getState () {
    return state;
  }
};
Dann muss das nur noch als Object im Sketch angelegt und im setup() aktiviert werden.

Code: Alles auswählen

StatusMon statusmonitor;

void setup () {
  // ... you setup code
  
  statusmonitor.start();
}
Anfragen zur AskSin++ werden nur im Forum beantwortet

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“