HM-LC-Dim1PWM-CV

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

Moderator: Co-Administratoren

Benutzeravatar
Psi
Beiträge: 106
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg

Re: HM-LC-Dim1PWM-CV

Beitrag von Psi » 31.10.2018, 00:33

So nun bin ich etwas weiter.

PIN 3, 5 und 6 lassen sich sauber manuell Dimmen sobald man
hal.activity.savePower<Idle<true> >(hal);
raus nimmt.

Der nächste Schritt wäre jetzt das Verhalten vom HM-LC-DW-WM entsprechend umzusetzen.

Entgegen dem HM-DW-WM.ino für den STM32 habe ich nun versucht den Sketch für den ATMega zu übernehmen aber dies klappt so nur so lala:

* In der CCU wird der HM-DW-WM erkannt aber mir werden 6 Channels angezeigt?
Warum sind das 6 Chans?
* Mit rumspielen konnte ich mal den einen mal den anderen PIN über die CCU Dimmen.

Lange Rede kurzer Sinn, wie verwendet man die Dimmer.h für zwei Channels?
Ggf. hat es auch was damit zu tun, dass man bei der ELV-Version zwischen 2-Ch und CW+WW umschalten kann?

Code: Alles auswählen

#define EI_NOTEXTERNAL
#include <EnableInterrupt.h>
#include <AskSinPP.h>
#include <LowPower.h>
#include <Dimmer.h>

// we use a Pro Mini
#define LED_PIN 4
#define CONFIG_BUTTON_PIN 8
#define DIMMER_PIN 5
#define DIMMER_PIN_2 6
#define PEERS_PER_CHANNEL 4

using namespace as;

const struct DeviceInfo PROGMEM devinfo = {
    {0x11,0x12,0xaa},       // Device ID
    "PsiDim2a01",           // Device Serial
    {0x01,0x09},            // Device Model
    0x2C,                   // Firmware Version
    as::DeviceType::Dimmer, // Device Type
    {0x01,0x00}             // Info Bytes
};

typedef AvrSPI<10,11,12,13> SPIType;
typedef Radio<SPIType,2> RadioType;
typedef StatusLed<LED_PIN> LedType;
typedef AskSin<LedType,NoBattery,RadioType> HalType;
typedef DimmerChannel<HalType,PEERS_PER_CHANNEL> ChannelType;
typedef DimmerDevice<HalType,ChannelType,6,3,PWM8<> > DimmerType;

HalType hal;
DimmerType sdev(devinfo,0x20);
ConfigToggleButton<DimmerType> cfgBtn(sdev);

void setup () {
  DINIT(57600,ASKSIN_PLUS_PLUS_IDENTIFIER);
  if( sdev.init(hal, DIMMER_PIN, DIMMER_PIN_2 ) ) { // HM-LC-Dim1PWM
    sdev.channel(1).peer(cfgBtn.peer());
  }
  buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
  sdev.initDone();
}

void loop() {
  bool worked = hal.runready();
  bool poll = sdev.pollRadio();
}

papa
Beiträge: 293
Registriert: 22.05.2018, 10:23

Re: HM-LC-Dim1PWM-CV

Beitrag von papa » 31.10.2018, 11:35

Ach ja die Idle-Klasse. Diese lasst nur den Timer2 (für Pin 3) aktiv. Alles andere wird zum Stromsparen abgeschalten. Ohne Idle ist aber sich für nen Dimmer auch ok.

Der 2 Kanal-Dimmer hat 6 Känle. Das stimmt so. Das sind 2 physikalische, die um 2 weitere virtuelle Kanäle ergänzt sind.
Für mehr Infos - siehe https://www.elv.de/elektronikwissen/vir ... logik.html
Anfragen zur AskSin++ werden nur im Forum beantwortet

Benutzeravatar
Psi
Beiträge: 106
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg

Re: HM-LC-Dim1PWM-CV

Beitrag von Psi » 31.10.2018, 18:06

Ahhh gibt Sinn :)

Hast du vllt noch nen kleinen Tipp wie ich den zweiten Dimmer-Pin initialisieren muss, damit Chan 4 damit verbunden ist?
Ein sdev.init(hal, DIMMER_PIN, DIMMER_PIN_2 ) ) scheint nicht zu reichen.

papa
Beiträge: 293
Registriert: 22.05.2018, 10:23

Re: HM-LC-Dim1PWM-CV

Beitrag von papa » 31.10.2018, 19:45

Channel 1 & 2 sind die physischen. 3 & 5 sowie 4 & 6 sind die virtuellen. Du kannst Dir im Prinzip beliebige Anzahl Kanäle/vurtuelle Kanäle konfigurieren.

Code: Alles auswählen

typedef DimmerDevice<HalType,ChannelType,6,3,PWM16<> > DimmerType;
Hier steht die 6 für insgesamt 6 Kanle und die 3 für jeweils 3 Kanäle zusammenfassen - macht 2 physische. Wenn Du 6 & 1 nimmst, dann hast Du 6 physische Kanäle. Entsprechend viele Pins müssen dann im init() angegeben werden. Das passt dann aber nicht mehr richtig mit den bekannten Devices.
Anfragen zur AskSin++ werden nur im Forum beantwortet

Benutzeravatar
Psi
Beiträge: 106
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg

Re: HM-LC-Dim1PWM-CV

Beitrag von Psi » 31.10.2018, 20:04

Das klappt!

Wenn auch noch in der CCU steht, dass ich 3,4,5 und 6 nicht konfigurieren kann.

Benutzeravatar
Psi
Beiträge: 106
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg

Re: HM-LC-Dim1PWM-CV

Beitrag von Psi » 07.11.2018, 00:59

Ich möchte das Thema Button noch mal aufgreifen.

Nachdem der Sketch nun sowohl für 1-Channel als auch 2-Channel und Dual-White funktioniert und über die CCU gesteuert werden kann (mal abgesehen von den virtuellen Kanälen) wären noch Buttons schön um zB Wandtaster direkt verdrahten zu können.
Dabei habe ich bereits versucht
* Den ConfigToggleButton in einen InternalButton zu ändern
* Einen separaten InternalButton zu definieren
Leider tut sich hier gar nichts.

Liegt es dran, dass die Implementierung hier noch unvollständig ist oder mache ich was falsch?


Zum Verständnis:

Instanz von InternalButton für DimmerType Channel 2 erzeugen:

Code: Alles auswählen

InternalButton<DimmerType> btn2(sdev, 2);
Was genau ist "peer"?

Code: Alles auswählen

sdev.channel(2).peer(btn2.peer());
Interrupt für btn2 anschalten:

Code: Alles auswählen

buttonISR(btn2, BUTTON1_PIN);

papa
Beiträge: 293
Registriert: 22.05.2018, 10:23

Re: HM-LC-Dim1PWM-CV

Beitrag von papa » 07.11.2018, 20:46

Sieht soweit erstmal alles gut aus.

Code: Alles auswählen

sdev.channel(2).peer(btn2.peer());
Hier wird die Direktverknüpfung angelegt.
Zeig mal bitte den kompletten Code. Es ist auch immer mal gut ein RESET - 6 Sekunden Configtaster drücken - zu probieren.
Kommen denn beim Drücken des Tatsers Ausgaben auf der Console ?
Anfragen zur AskSin++ werden nur im Forum beantwortet

Benutzeravatar
Psi
Beiträge: 106
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg

Re: HM-LC-Dim1PWM-CV

Beitrag von Psi » 07.11.2018, 21:16

Jerome hat mich (mal wieder) sehr unterstützt. Der Tipp mit dem RESET war Goldwert!

Wir sind jetzt vom LC-DW auf nen HM-LC-Dim1T gegangen damit wir keine virtuellen Kanäle haben. Zudem kann die CCU hier bis zu 7 Kanäle.

Es funktioniert auf den Breadboard jetzt die Steuerung über die CCU sowie über die 6 Taster.
Was (noch) nicht geht: Die Programmierung der internen Tasten über die CCU. Hier scheint lediglich Dimmer ein/heller und aus/dunkler zu greifen.

Code: Alles auswählen

//- -----------------------------------------------------------------------------------------------------------------------
// AskSin++
// 2016-10-31 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
//- -----------------------------------------------------------------------------------------------------------------------

// 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>
#include <Dimmer.h>

// We use a Pro Mini
#define LED_PIN 4
#define CONFIG_BUTTON_PIN 8

#define DIMMER1_PIN 3
#define DIMMER2_PIN 5
#define DIMMER3_PIN 6

#define BTN1       7
#define BTN2       9
#define BTN3       A0
#define BTN4       A1
#define BTN5       A2
#define BTN6       A3

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

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

// define all device properties
const struct DeviceInfo PROGMEM devinfo = {
    {0x11,0x21,0x01},       // Device ID
    "PsiDim3x01",           // Device Serial
    {0x00, 0x59},           // Device Model
    0x25,                   // Firmware Version
    as::DeviceType::Dimmer, // 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, NoBattery, RadioType> HalType;
typedef DimmerChannel<HalType, PEERS_PER_CHANNEL> ChannelType;
typedef DimmerDevice<HalType, ChannelType, 3, 1, PWM8<> > DimmerType;

HalType hal;
DimmerType sdev(devinfo, 0x20);
ConfigButton<DimmerType> cfgBtn(sdev);
InternalButton<DimmerType> btn1(sdev, 4);
InternalButton<DimmerType> btn2(sdev, 5);
InternalButton<DimmerType> btn3(sdev, 6);
InternalButton<DimmerType> btn4(sdev, 7);
InternalButton<DimmerType> btn5(sdev, 8);
InternalButton<DimmerType> btn6(sdev, 9);

void setup () {
  buttonISR(btn1, BTN1);
  buttonISR(btn2, BTN2);
  buttonISR(btn3, BTN3);
  buttonISR(btn4, BTN4);
  buttonISR(btn5, BTN5);
  buttonISR(btn6, BTN6);

  DINIT(57600, ASKSIN_PLUS_PLUS_IDENTIFIER);
  if ( sdev.init(hal, DIMMER1_PIN, DIMMER2_PIN, DIMMER3_PIN) ) {
    HMID devid;
    sdev.getDeviceID(devid);
    sdev.channel(1).peer(Peer(devid, 4), Peer(devid, 5));
    sdev.channel(2).peer(Peer(devid, 6), Peer(devid, 7));
    sdev.channel(3).peer(Peer(devid, 8), Peer(devid, 9));
  }
  buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
  sdev.initDone();
  sdev.led().invert(true);
  DDEVINFO(sdev);
}

void loop() {
  hal.runready();
  sdev.pollRadio();
}

papa
Beiträge: 293
Registriert: 22.05.2018, 10:23

Re: HM-LC-Dim1PWM-CV

Beitrag von papa » 07.11.2018, 21:28

Psi hat geschrieben:
07.11.2018, 21:16
Was (noch) nicht geht: Die Programmierung der internen Tasten über die CCU. Hier scheint lediglich Dimmer ein/heller und aus/dunkler zu greifen.
Das verstehe ich nicht.

Die Verknüpfung würde ich so machen - ist aber im Prinzip das selbe.

Code: Alles auswählen

  if ( sdev.init(hal, DIMMER1_PIN, DIMMER2_PIN, DIMMER3_PIN) ) {
    sdev.channel(1).peer(btn4.peer(),btn5.peer());
    sdev.channel(2).peer(btn6.peer(),btn7.peer()));
    sdev.channel(3).peer(btn8.peer(),btn9.peer()));
  }
 
Anfragen zur AskSin++ werden nur im Forum beantwortet

Benutzeravatar
Psi
Beiträge: 106
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg

Re: HM-LC-Dim1PWM-CV

Beitrag von Psi » 08.11.2018, 00:52

papa hat geschrieben:
07.11.2018, 21:28
Psi hat geschrieben:
07.11.2018, 21:16
Was (noch) nicht geht: Die Programmierung der internen Tasten über die CCU. Hier scheint lediglich Dimmer ein/heller und aus/dunkler zu greifen.
Das verstehe ich nicht.
Ich habe einen HM-LC-Dim1T-CV {0x00, 0x59} und an PIN 3 eine LED.
Auf PIN 7 und 9 jeweils einen Taster.
DimmerDevice<HalType, ChannelType, 2, 1, PWM8<>>
sdev.channel(1).peer(btn1.peer(), btn2.peer());

Drücke ich kurz auf Btn1 geht die LED an.
Drücke ich kurz auf Btn2 geht die LED aus.
Drücke ich lang auf Btn1 dimmt die LED hoch.
Drücke ich lang auf Btn2 dimmt die LED runter.

Änder ich in der CCU die Button Config jetzt zB auf
Btn1: Dimmer an; Pegel 50%
Btn2: Dimmer aus

Dann muss ich den Btn1 zweimal drücken damit die LED auf 50% geht.
Auch Btn2 schaltet die LED erst nach dem zweiten press aus.
Ich sehe jeweils beide "pressed" im Monitor.

Setzte ich jetzt erneut eine andere Config:
Btn1: Dimmer aus
Btn2: Dimmer an; Pegel 70%
Dann passiert bei pressed gar nichts mehr. Longpress Btn1 dimmt hoch; Longpress Btn2 dimmt runter.

Also iwie verhält sich das nicht wie erwartet :)

Antworten

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