jp112sdl / Beispiel_AskSinPP

88 stars 36 forks source link

Anpassung des Handsenders #6

Closed JoeWiseman closed 6 years ago

JoeWiseman commented 6 years ago

Hallo, mittlerweile bin ich schon ein bisschen angefixt von der Idee "eigene HM-Komponenten" zu bauen.... Ich würde gerne einen Klatschschalter realisieren.Hierfür ist folgendes Szenario vorgesehen: Ein HM-Unterputz-Schalter schaltet Lampe. Mittels eines Sound-Moduls soll über eine Fernbedienung der Wand-Schalter ferngesteuert werden.

Dazu hätte ich noch ein paar Fragen: -1- kann ich die Beispielsoftware auch auf einen 5V-Arduino-Nano-Board installieren? Ich würde lieber ein USB-Netzteil als Batterien verwenden ... -2- ist eine direkte Verknüpfung von dem Eigenbau-Handsender mit dem HM-Wand-Schalter möglich? Über die CCU dauert mir das zu lange. Da ist man dann auch beim Schalter und kann sich das Klatschen sparen. -3- könnte ich den Code von der folgenden Website einfach mit in die void_loop() Routine einbauen, damit der Handsender nicht beim Taster, sondern beim Klatschen auslöst? Wenn ja, wo finde ich die void_loop() und welcher Ausgang muss dann geschaltet werden? Code von hier: https://code-bude.net/2014/07/17/lampe-per-klatschen-an-und-ausschalten-mit-dem-arduino/

Viele Grüße Joe

jp112sdl commented 6 years ago

Hallo. Da hast du dir ja was vorgenommen. :) 1.) Die Timings sind für einen 328P mit 8MHz ausgelegt. Wenn du einen 5V Arduino Nano mit 8MHz hast, kannst du den verwenden. Aber unabhängig davon: Der 3.3V / 8MHz Pro Mini hat einen RAW-Eingang, an dem man das Board mit 5V betreiben kann. Es ist ein LDO verbaut, der für die 3.3V sorgt.

2.) Wenn du mit "Eigenbau-Handsender" den 1-Kanal-Paniksender (HM-RC-P1) meinst: Ja, der lässt sich wie gewohnt direktverknüpfen. 👍

3.) Nein, das geht so ohne Weiteres nicht. Der HM-RC-P1-Sketch (und auch alle anderen Fernbedienungs-Sketche) gehen von einem externen Interrupt aus.

Wenn du das aus einem Methodenaufruf heraus machen willst, müsstest du den Handler intern bedienen. Schau dir dazu mal die Remote.h an.

jp112sdl commented 6 years ago

P.S.: Der Code aus deinem Beispiel ist echt mies programmiert. Das macht man so nicht, dass man in einer Schleife permanent einen Pin liest. Für sowas gibts Interrupts: http://diwo.bq.com/de/interrupts-mit-arduino-benutzen/

JoeWiseman commented 6 years ago

Danke für Deine Rückmeldung ... auch wenn es natürlich nicht das war, was ich hören wollte .... Ich dachte, dass ich mit meinem halbierten Halbwissen vielleicht mein Vorhaben auf die Schnelle umsetzen könnte. Aber so wie Du das schreibst scheint da doch ein bisschen mehr dran zu hängen.....

.... ich habe mal in die Remote.h geschaut .... und NIX verstanden. Vermutlich werde ich mein enthusiastisches Vorhaben wohl einfach begraben müssen ....

jp112sdl commented 6 years ago

Ja, mit Codeschnipsel von A nach B kopieren ist es nicht getan ;)

Ich hab hier fix mal was zusammengezimmert. Ein Klatschen löst jeweils einen kurzen Tastendruck aus.

//- -----------------------------------------------------------------------------------------------------------------------
// AskSin++
// 2017-07-26 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
//- -----------------------------------------------------------------------------------------------------------------------

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

#include <MultiChannelDevice.h>
#include <Remote.h>

//           Anlerntaster an Pin
#define CONFIG_BUTTON_PIN        8
//Klatschschalter Ausgang an Pin
#define KS_PIN                   5

#define PEERS_PER_CHANNEL 10

volatile uint8_t _kscounter = 0;
using namespace as;

// define all device properties
const struct DeviceInfo PROGMEM devinfo = {
  {0x20, 0x1a, 0x00},     // Device ID
  "HMKS201A00",           // Device Serial
  {0x00, 0x1a},           // Device Model
  0x11,                   // Firmware Version
  as::DeviceType::Remote, // Device Type
  {0x00, 0x00}            // Info Bytes
};

typedef AvrSPI<10, 11, 12, 13> SPIType;
typedef AskSin<DualStatusLed<3, 4>, NoBattery, Radio<SPIType, 2>> Hal;
Hal hal;

typedef RemoteChannel<Hal, PEERS_PER_CHANNEL, List0> ChannelType;
typedef MultiChannelDevice<Hal, ChannelType, 1> RemoteType;

RemoteType sdev(devinfo, 0x20);
ConfigButton<RemoteType> cfgBtn(sdev);

void setup () {
  DINIT(57600, ASKSIN_PLUS_PLUS_IDENTIFIER);
  sdev.init(hal);
  pinMode(KS_PIN, INPUT_PULLUP);
  if (digitalPinToInterrupt(KS_PIN) == NOT_AN_INTERRUPT) enableInterrupt(KS_PIN, ksISR, FALLING); else attachInterrupt(digitalPinToInterrupt(KS_PIN), ksISR, FALLING);
  buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
  sdev.initDone();
}

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

  if (_kscounter > 0) {
    sdev.channel(1).state(Button::released);
    _kscounter = 0;
  }

  if ( worked == false && poll == false ) {
    hal.activity.savePower<Idle<>>(hal);
  }
}

void ksISR() {
  _kscounter++;
}

Probier es mal aus. Und vergiss nicht, nach dem Anlernen den Übertragungsmodus in den Geräteeinstellungen von "gesichert" auf "Standard" umzustellen. 😃

jp112sdl commented 6 years ago

Eigentlich auch völlig unnötig... Nimm den originalen Sketch wie er ist und klemm statt des Tasters den OUT von dem Akustiksensor dran. Fertig.

JoeWiseman commented 6 years ago

Hallo Jerome, vielen Dank für Deine Arbeit!!! Ich werde mich - sobald Ali geliefert hat - mal dran setzen. Zu Deinem letzten Hinweis mit dem Ersetzen des Tasters durch den Akkustiksensor .... Der würde dann aber auch auslösen, wenn ich den Staubsauger anstelle, oder wird der HM-Sensor mur bei einem kurzen Impuls ausgelöst?

Zu den Interrupts ... die kenne ich noch vom C64 :-D ... Wenn ich ja nur - so wie ich das verstanden habe - auf den Boards ein oder zwei Pins darüf habe und die Programmierung darüber wesentlich effektiver ist, dann werden vermutlich der Config-Button und der Not-Schalter an diesen Pins angeschlossen sein, sodass für den Akkustik-Sensor kein I-Pin mehr da ist, oder?!

Viele Grüße Joe

jp112sdl commented 6 years ago

Zu Deinem letzten Hinweis mit dem Ersetzen des Tasters durch den Akkustiksensor .... Der würde dann aber auch auslösen, wenn ich den Staubsauger anstelle, oder wird der HM-Sensor mur bei einem kurzen Impuls ausgelöst?

Der Akustiksensor hat ja nur einen digitalen Ausgang. Ob der auch schaltet, wenn du deinen Staubsauger bedienst, ist abhängig von der Schaltschwelle. Da ist ja so ein Poti auf der Platine... Und ich gehe davon aus, dass immer nur ein kurzer Impuls getastet wird.

Ich hatte früher mal eine diskrete Klatschschalter-Platine im Einsatz. War immer lustig... wenn mal was umfällt, oder die Musik lauter wird. Witzige Sache, aber nicht wirklich praxistauglich.

Wenn ich ja nur - so wie ich das verstanden habe - auf den Boards ein oder zwei Pins darüf habe und die Programmierung darüber wesentlich effektiver ist, dann werden vermutlich der Config-Button und der Not-Schalter an diesen Pins angeschlossen sein, sodass für den Akkustik-Sensor kein I-Pin mehr da ist, oder?!

Auf welchen Boards hast du nur ein oder zwei Pins? Ich kann dir in diesem Absatz leider nicht folgen. Wie viele Pins ein Arduino Pro Mini (bzw. der 328P) hat, lässt sich ja schnell googeln... Klemm doch den Ausgang vom Akustiksensor parallel zum Taster. Dann kannst du entweder per Taster oder per Akustik senden...

JoeWiseman commented 6 years ago

Hi, auch wenn ich mit meinem Halbwissen vermutlich Deine Geduld auf eine harte Probe stelle ...

Für den Klatsch-Erkenner hatte sich der Programmierer in dem Blog schon einige Gedanken gemacht. Daher mein Ansatz den Code einfach in den HM-Schalter einzubauen.

Wegen der Interrupts habe ich bei https://playground.arduino.cc/Code/Interrupts gefunden, dass es nur zwei externe Interrupt-Pins gäbe und das so verstanden, dass über die Interrupt-Abfrage dann nur diese beiden Pins abgefragt werden könnten. Kann aber auch sein, dass ich das Konzept nicht durchdrungen habe. Dass es natürlich wesentlich mehr Pins für Ein- und Ausgänge gibt habe sogar ich an den beiden langen Pinreihen erkannt :-)

Wenn die Hardware kommt werde ich mich mal mit Hilfe Deines neuen Codes dransetzen und schauen, ob ich das nicht doch irgenwie hinbekomme ....

Nochmals 1000 Dank für Deinen Support!

Viele Grüße Joe

jp112sdl commented 6 years ago

Für den Klatsch-Erkenner hatte sich der Programmierer in dem Blog schon einige Gedanken gemacht.

Nur eine Erkennung, ob 2x innerhalb einer vorgegebenen Zeit geklatscht wurde

Daher mein Ansatz den Code einfach in den HM-Schalter einzubauen.

Versuch macht klug - vielleicht klappt es sogar und der "Aktiv"-Pegel steht so lange an, dass er zuverlässig in der loop() erfasst wird.

Mit den Interrupts wirds zu komplex, wenn es um die Erkennung von 2 aufeinander folgenden Geräuschen geht. In der Interrupt Service Routine kannst du die millis() nicht abfragen, so dass du auch nicht so einfach die Zeit zwischen 2 Ereignissen feststellen kannst.

Also 1x Klatschen -> Schalten = absolut kein Problem, dazu müsste man nicht mal den Code anpassen.

2x Klatschen -> Schalten = Versuch macht klug. Probier es aus - kaputt gehen kann nix 😄