HM-SEC-MDIR anpassen zum Nachtlicht

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

Moderator: Co-Administratoren

Alveran
Beiträge: 250
Registriert: 07.08.2018, 20:17
Hat sich bedankt: 74 Mal
Danksagung erhalten: 25 Mal

HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von Alveran » 17.03.2020, 16:04

HM-SEC-MDIR Nachtlicht

Der HM-SEC-MDIR Sketch soll so angepasst werden das daraus ein Nachtlicht entsteht. Dazu müsste der Sketch so angepasst werden, das am Atmega ein Ausgang geschaltet wird(für eine Zeit X) wenn ein gewisser Helligkeitswert unterschritten wird und eine Bewegung erkannt wird.
An der CCU soll dazu nichts modifiziert werden, das Nachtlicht wird als ganz normal Bewegungsmelder erkannt und funktioniert auch so.

Vielen Dank an jp112sdl, TomMajor und papa für die Anpassungen am Sketch.

Code: Alles auswählen

// AskSin++
// 2016-10-31 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
// 2020-03-23 Tom Major - Nightlight extension
//- -----------------------------------------------------------------------------------------------------------------------

// define this to read the device id, serial and device type from bootloader section
// #define USE_OTA_BOOTLOADER

#define EI_NOTEXTERNAL
#include <EnableInterrupt.h>
#include <AskSinPP.h>
#include <LowPower.h>
// uncomment the following 2 lines if you have a TSL2561 connected at address 0x29
#include <Wire.h>
#include <sensors/Bh1750.h>

#include <MultiChannelDevice.h>
#include <Motion.h>

// we use a Pro Mini
// Arduino pin for the LED
// D4 == PIN 4 on Pro Mini
#define LED_PIN 4
// Arduino pin for the config button
// B0 == PIN 8 on Pro Mini
#define CONFIG_BUTTON_PIN 8
// Arduino pin for the PIR
// A0 == PIN 14 on Pro Mini
#define PIR_PIN 14

// Nightlight extension
#define NIGHTLI_PIN 6
#define NIGHTLI_BRIGHTN_THRESHOLD 5
#define NIGHTLI_TIME_SEC 180

// number of available peers per channel
#define PEERS_PER_CHANNEL 6

// all library classes are placed in the namespace 'as'
using namespace as;

// define all device properties
const struct DeviceInfo PROGMEM devinfo = {
    {0x56,0x78,0x90},       // Device ID
    "papa222222",           // Device Serial
    {0x00,0x4a},            // Device Model
    0x16,                   // Firmware Version
    as::DeviceType::MotionDetector, // Device Type
    {0x01,0x00}             // Info Bytes
};

/**
 * Configure the used hardware
 */
typedef AvrSPI<10,11,12,13> SPIType;
typedef Radio<SPIType,2> RadioType;
typedef StatusLed<LED_PIN> LedType;
typedef AskSin<LedType,BatterySensor,RadioType> BaseHal;
class Hal : public BaseHal {
public:
  void init (const HMID& id) {
    BaseHal::init(id);
    // set low voltage to 2.2V
    // measure battery every 1h
    battery.init(seconds2ticks(60UL*60),sysclock);
    battery.low(22);
    battery.critical(19);
  }
} hal;

typedef MotionChannel<Hal,PEERS_PER_CHANNEL,List0,Bh1750<> > MChannel;

typedef MultiChannelDevice<Hal,MChannel,1> MotionType;
MotionType sdev(devinfo,0x20);

ConfigButton<MotionType> cfgBtn(sdev);

void setup () {
  DINIT(57600,ASKSIN_PLUS_PLUS_IDENTIFIER);
  sdev.init(hal);
  buttonISR(cfgBtn,CONFIG_BUTTON_PIN);
  motionISR(sdev,1,PIR_PIN);
  sdev.initDone();
}

class LightAlarm : public Alarm {
  public:
  LightAlarm() : Alarm(0) {
    pinMode(NIGHTLI_PIN,OUTPUT);
    digitalWrite(NIGHTLI_PIN,LOW);
  }
  virtual ~LightAlarm() {}

  void setOn () {
    digitalWrite(NIGHTLI_PIN,HIGH);
    set(seconds2ticks(NIGHTLI_TIME_SEC));
    sysclock.add(*this);
  }

  virtual void trigger (__attribute__ ((unused)) AlarmClock& clock) {
    digitalWrite(NIGHTLI_PIN,LOW);
  }
} nightlight;

void loop() {
  bool worked = hal.runready();
  bool poll = sdev.pollRadio();
  // falls Bewegung und Helligkeit <= Schwelle und Nachtlicht nicht bereits aktiv, dann Anschalten für definierte Zeit
  if( sdev.channel(1).isMotion() && sdev.channel(1).status() <= NIGHTLI_BRIGHTN_THRESHOLD && nightlight.active()==false ) {
    nightlight.setOn();
  }
  if( worked == false && poll == false ) {
    // deep discharge protection
    // if we drop below critical battery level - switch off all and sleep forever
    if( hal.battery.critical() ) {
      // this call will never return
      hal.activity.sleepForever(hal);
    }
    // if nothing to do - go sleep
    hal.activity.savePower<Sleep<>>(hal);
  }
} 

Bauteile

• 1x Arduino Pro Mini (3.3V / 8MHz)
• 1x CC1101 868MHz Funkmodul
• AM312
• BH1750
• Teelicht LED
• 330Ohm Widerstand
• Taster

Aufbau
wiring_Steckplatine.png
Konfiguration

Code: Alles auswählen

#define NIGHTLI_PIN 6
#define NIGHTLI_BRIGHTN_THRESHOLD 5
#define NIGHTLI_TIME_SEC 300
IMG_20200421_115414.jpg
Der WAF ist natürlich Immens.

Ich würde die Anleitung für https://asksinpp.de/Projekte/ bereit stellen(wie?)

Vielleicht kann nochmal jemand was dazu sagen?
Macht es Sinn auf dem Bh1750 und auf dem AM312 noch die Spannungswandler zu entfernen? (Spannungsversorgung kommt von zwei AAA Batterien)
Zuletzt geändert von Alveran am 21.04.2020, 12:05, insgesamt 1-mal geändert.

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von jp112sdl » 17.03.2020, 18:04

Der Sketch ist ja nur die halbe Miete.
Du wirst sicher nicht bei jeder Umkonfiguration (Anpassen des Helligkeitswerts) den Sketch neu flashen wollen und auch in der CCU sehen, ob der Aktorkanal gerade EIN oder AUS ist...
Es müsste also zudem ein Custom Device für die CCU erstellt werden, mit dem Aktorkanal und konfigurierbaren Einstellungen

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Alveran
Beiträge: 250
Registriert: 07.08.2018, 20:17
Hat sich bedankt: 74 Mal
Danksagung erhalten: 25 Mal

Re: HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von Alveran » 17.03.2020, 18:45

Tatsächlich würde mir ein "dummes" Nachtlicht reichen. Also keinen extra Anpassungen für die CCU notwendig. Kann ruhig so aussehen wie ein normaler Bewegungsmelder.
Es reicht die Zeit und die Helligkeit im Sketch einmal festzulegen. Soll ja wirklich nur als Nachtlicht in absoluter Dunkelheit arbeiten.

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von jp112sdl » 17.03.2020, 19:01

machst im setup() ein pinMode(AKTORPIN, OUTPUT);
und im loop() digitalWrite(AKTORPIN, sdev.channel(1).status() == 0);

Wenn ich es richtig sehe, dann liefert status() den Helligkeitswert als 0...255 Range zurück.
0 ist dann dunkel.

So lange Helligkeit = 0 ist wird der Pin auf HIGH geschaltet, sonst LOW

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Alveran
Beiträge: 250
Registriert: 07.08.2018, 20:17
Hat sich bedankt: 74 Mal
Danksagung erhalten: 25 Mal

Re: HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von Alveran » 18.03.2020, 15:09

Ahh sorry hab mich wahrscheinlich doch noch etwas falsch ausgedrückt. Die Einschaltbedingung ist wenn Bewegung erkannt und wenn es dunkel ist für eine Zeit X einschalten.

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von jp112sdl » 18.03.2020, 20:43

Machs am besten mit einem direktverknüpften Aktor ^^
Diese Parameter kann man nämlich genau so in einer Direktverknüpfung angeben.
Aber vielleicht baut dir noch jemand das direkt in den MDIR ein

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Alveran
Beiträge: 250
Registriert: 07.08.2018, 20:17
Hat sich bedankt: 74 Mal
Danksagung erhalten: 25 Mal

Re: HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von Alveran » 18.03.2020, 20:46

Stimmt gute Idee. Danke.

TomMajor
Beiträge: 1793
Registriert: 30.08.2017, 23:25
Hat sich bedankt: 175 Mal
Danksagung erhalten: 399 Mal
Kontaktdaten:

Re: HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von TomMajor » 23.03.2020, 00:05

Alveran hat mich gebeten da mal drauf zu schauen.
Und wegen seinen hervorragenden 3D Arbeiten konnte ich das nicht ablehnen. :)

Ich kenne aber den sketch nicht und bei AskSinPP habe ich auch lange nicht reingeschaut.
Also zum Verständnis, bei Bewegung wacht das Gerät nach der Stelle

Code: Alles auswählen

hal.activity.savePower<Sleep<>>(hal);
auf.

Jerome schreibt oben man bekommt die Helligkeit mit

Code: Alles auswählen

sdev.channel(1).status()
So weit so gut.
Jetzt brauchen wir z.B. noch einen Timer für die OnTime des Lichtes, oder?
papa hatte mal die timer in einem Thread erklärt, ich weiß aber nicht mehr wo.
In AlarmClock.h finde ich z.B. die add() Methode.
Wie kann man in loop() einen timer mit einer best. Zeit setzen und wie erfährt man wann er fertig ist?

So in etwa, aber wie genau?

Code: Alles auswählen

void LichtAus (AlarmClock& clock) {
  // io pin aus
}

loop() {
...
if (Dunkel) {
  sysclock.set(5min)
  sysclock.add(&LichtAus);
...
Viele Grüße,
Tom

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von jp112sdl » 23.03.2020, 06:32

TomMajor hat geschrieben:
23.03.2020, 00:05
Also zum Verständnis, bei Bewegung wacht das Gerät nach der Stelle
CODE: ALLES AUSWÄHLEN
hal.activity.savePower<Sleep<>>(hal);
auf.
Ja, aber auch wenn eine zyklische Meldung gesendet wird (z.B. Helligkeitswert), wenn die Batterie gemessen wird...
Es müsste also noch konkret BEWEGUNG erfasst werden.
Eigentlich müsste man den kompletten trigger() aus dem MotionChannel reinholen, um dort bei Bewegung ein weiteres Ereignis (Nachtlichttimer) zu starten.
TomMajor hat geschrieben:
23.03.2020, 00:05
Wie kann man in loop() einen timer mit einer best. Zeit setzen und wie erfährt man wann er fertig ist?
Die trigger() Methode wird aufgerufen, wenn die Zeit abgelaufen ist

Code: Alles auswählen

class LichtAusAlarm : public Alarm {
  public:
  LichtAusAlarm () : Alarm (0) {}
  virtual ~LichtAusAlarm () {}

  void trigger (AlarmClock& clock)  {
     //hier das Licht ausschalten
  }
  
} laa;

void loop() {
  if (Dunkel && NachtlichtEIN != false) {
    laa.set(seonds2ticks(300)); //5min 
    sysclock.add(laa);
  }
    ...
  }

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: HM-SEC-MDIR anpassen zum Nachtlicht

Beitrag von papa » 23.03.2020, 08:40

Es gab bisher keine Möglichkeit, den aktuellen Motion-Status am Channel abzufragen. Habe ich gerade in die Lib eingebaut. Bitte mal pullen.
Der Code für das Nachtlicht könnte dann so aussehen - wie immer nicht getestet - nur durch den Compiler geschickt.

Code: Alles auswählen

#define LIGHTPIN 6
class LightAlarm : public Alarm {
  public:
  LightAlarm() : Alarm(0) {
    pinMode(LIGHTPIN,OUTPUT);
    digitalWrite(LIGHTPIN,LOW);
  }
  virtual ~LightAlarm() {}

  void setOn () {
    digitalWrite(LIGHTPIN,HIGH);
    set(seconds2ticks(300));
    sysclock.add(*this);
  }

  virtual void trigger (__attribute__ ((unused)) AlarmClock& clock) {
    digitalWrite(LIGHTPIN,LOW);
  }
} nightlight;

void loop() {
  bool worked = hal.runready();
  bool poll = sdev.pollRadio();
  if( sdev.channel(1).isMotion() && sdev.channel(1).status() < 50 && nightlight.active()==false ) {
    nightlight.setOn();
  }
  if( worked == false && poll == false ) {
    .....
Anfragen zur AskSin++ werden nur im Forum beantwortet

Antworten

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