433mhz ontvanger vraag

Hallo Allemaal,

Ik heb even een duw in de juiste richting nodig…

Ik heb een 433mhz sensor die deze 2 (aan en uit) codes vertsuurd:

Addr 18600926 unit 9 on, dim level: 14, period: 259us.
Addr 18600926 unit 9 off, dim level: 0, period: 259us.

Ik zou graag wanneer de eerste binnen komt dus:

Addr 18600926 unit 9 on, dim level: 14, period: 259us.

een Output High willen maken om bv een LED te laten branden.

Nu kom ik er echt niet uit hoe ik dit moet gaan vertalen, zou iemand mij een tip kunnen geven?

Zover heb ik de code bedacht:

#include <NewRemoteReceiver.h>
int groeneLed = 22;  //Deur dicht
int rodeLed   = 23;  //Deur open

#define deurDicht 18600926 unit 9 off, dim level: 0, period: 259us
#define deurOpen  18600926 unit 9 on, dim level: 14, period: 259us

void setup() {

  pinMode(groeneLed, OUTPUT);
  pinMode(rodeLed, OUTPUT);

}

void loop() {



}

in de trant van if mesasage== deurDicht ){ledje aan. }

Kun jij hier zo'n message laten zien zoals die eruit ziet? Of is het letterlijk zoals het hierboven staat?

if mesasage== deurDicht ){groeneLed, High }

Moet ik in deze richting gaan denken?

Geen idee. Wat je in ieder geval daar hebt staan klopt niet. Maar laat nu eens een message zien zoals je hem binnen krijgt.

Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 off, dim level: 0, period: 259us.

Dit is wat ik binnen krijg als ik mijn amst-606 sniffer..

Dan zou ik eerst verifieren of jij dat ook in jouw sketch binnen krijgt. Dus zodra er een message binnen is dan testen met Serial of dit daad werkelijk binnen is gekomen. Maw. deel jouw programma in een aantal stappen: a) zorg dat je de communicatie goed opgezet krijgt b) dus als er een message binnen is gewoon op de serial uitprinten. Dan kun je later uitsluiten dat je daar een probleem hebt. c) Ik zou zelf een parser maken die relevante informatie uit die message haalt en in een struct zet bijvoorbeeld een functie:

//
// alle info uit de message als werkbare parameters
//
struct MSG_PARAMS {
   uint32_t addr;
   uint8_t uint;
   uint8_t level;
   uint16_t period;
};
MSG_PARMS msgParams;

bool parseMsg (MSG_PARMS *params, char * msg) {
bool returnCode = false;
   //
   // msg is de message die je hebt ontvangen
   // params is de structure die je moet vullen met de feitelijke info uit de msg
   //
   ...... 
   // als alles is goed gegaan
   returnCode = true;

   return returnCode;
}

In de loop() {
//
// lees die message binnen
//
if (parse(msgParams, message)){
   //
   // message is goed ge decodeerd en kun je je uitleven
   //
   // bijv analog write
   //
   analogWrite(pwmPoort, msgParams.level);
}

Ik heb nu de sniffer erbij gezet, de code die ik bovenin als #define heb geplaatst krijg ik te zien in de serial.

#include <NewRemoteReceiver.h>

int groeneLed = 22;  //Deur dicht
int rodeLed   = 23;  //Deur open

#define deurDicht 18600926 unit 9 off, dim level: 0, period: 259us;
#define deurOpen  18600926 unit 9 on, dim level: 14, period: 259us;

void setup() {
  Serial.begin(115200);
  NewRemoteReceiver::init(0, 2, showCode);
  pinMode(groeneLed, OUTPUT);
  pinMode(rodeLed, OUTPUT);
}

void loop() {
}
// Callback function is called only when a valid code is received.
void showCode(NewRemoteCode receivedCode) {
  // Note: interrupts are disabled. You can re-enable them if needed.

  // Print the received code.
  Serial.print("Addr ");
  Serial.print(receivedCode.address);

  if (receivedCode.groupBit) {
    Serial.print(" group");
  }
  else {
    Serial.print(" unit ");
    Serial.print(receivedCode.unit);
  }

  switch (receivedCode.switchType) {
    case NewRemoteCode::off:
      Serial.print(" off");
      break;
    case NewRemoteCode::on:
      Serial.print(" on");
      break;
    case NewRemoteCode::dim:
      Serial.print(" dim");
      break;
  }

  if (receivedCode.dimLevelPresent) {
    Serial.print(", dim level: ");
    Serial.print(receivedCode.dimLevel);
  }

  Serial.print(", period: ");
  Serial.print(receivedCode.period);
  Serial.println("us.");


}

Dat is nog mooier. Die parser is er al. Nou dan ben je er toch? En zelf gevonden :)

Zou het dan zoiets moeten zijn?

#include <NewRemoteReceiver.h>

int groeneLed = 22;  //Deur dicht
int rodeLed   = 23;  //Deur open

#define deurDicht 18600926 unit 9 off, dim level: 0, period: 259us;
#define deurOpen  18600926 unit 9 on, dim level: 14, period: 259us;

//
// alle info uit de message als werkbare parameters
//
struct MSG_PARAMS {
  uint32_t addr; 
  uint8_t uint; 
  uint8_t level;
  uint16_t period; 
};
MSG_PARAMS msgParams;

bool parseMsg (MSG_PARAMS *params, char * msg) {
  bool returnCode = false;
  //
  // msg is de message die je hebt ontvangen
  // params is de structure die je moet vullen met de feitelijke info uit de msg
  //
  //   ......
  // als alles is goed gegaan
  returnCode = true;

  return returnCode;
}

void setup() {
  Serial.begin(115200);
  NewRemoteReceiver::init(0, 2, showCode);
  pinMode(groeneLed, OUTPUT);
  pinMode(rodeLed, OUTPUT);
}

void loop() {
}
// Callback function is called only when a valid code is received.
void showCode(NewRemoteCode receivedCode) {
  // Note: interrupts are disabled. You can re-enable them if needed.

  // Print the received code.
  Serial.print("Addr ");
  Serial.print(receivedCode.address);

  if (receivedCode.groupBit) {
    Serial.print(" group");
  }
  else {
    Serial.print(" unit ");
    Serial.print(receivedCode.unit);
  }

  switch (receivedCode.switchType) {
    case NewRemoteCode::off:
      Serial.print(" off");
      break;
    case NewRemoteCode::on:
      Serial.print(" on");
      break;
    case NewRemoteCode::dim:
      Serial.print(" dim");
      break;
  }

  if (receivedCode.dimLevelPresent) {
    Serial.print(", dim level: ");
    Serial.print(receivedCode.dimLevel);
  }

  Serial.print(", period: ");
  Serial.print(receivedCode.period);
  Serial.println("us.");


//
// lees die message binnen
//
if (parse(msgParams, message )){
   //
   // message is goed ge decodeerd en kun je je uitleven
   //
   digitalWrite(groenLed, HIGH);
}

}

Dat is toch allemaal niet meer nodig. Je hebt de sniffer code aangepast met die call back. Je hebt al alle individuele velden. Waarom ga je nu weer verder met mijn verhaal? Maar om jou nog ff bezig te houden.. Want anders valt het kwartje ook niet.... Wil jij: een SMS door sturen die je nu gebruikt en dan ALLE output uit dat sniffer programma van post 19 hier ff laten zien. Dus alles vanaf de start..... Niet stukken weglaten. Want als jij zegt dat het werkt, wil ik dat zien. Want volgens mij heb je de oplossing al.

nicoverduin: Dat is toch allemaal niet meer nodig. Je hebt de sniffer code aangepast met die call back. Je hebt al alle individuele velden. Waarom ga je nu weer verder met mijn verhaal?

De Sniffer werkt, ik wil voor nu een output uitsturen op het moment dat de eerste code : 18600926 unit 9 off, dim level: 0, period: 259us; binnen komt

nicoverduin: Wil jij: een SMS door sturen die je nu gebruikt en dan ALLE output uit dat sniffer programma van post 19 hier ff laten zien. Dus alles vanaf de start..... Niet stukken weglaten. Want als jij zegt dat het werkt, wil ik dat zien. Want volgens mij heb je de oplossing al.

Ik wil geen SMS uitsturen, en dit zijn alle gegevens die ik uit mijn sniffer krijg als ik mijn AMST-606 schakel: Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 on, dim level: 14, period: 259us. Addr 18600926 unit 9 off, dim level: 0, period: 258us. Addr 18600926 unit 9 off, dim level: 0, period: 259us. Addr 18600926 unit 9 off, dim level: 0, period: 259us. Addr 18600926 unit 9 off, dim level: 0, period: 259us. Addr 18600926 unit 9 off, dim level: 0, period: 259us. Addr 18600926 unit 9 off, dim level: 0, period: 258us. Addr 18600926 unit 9 off, dim level: 0, period: 259us. Addr 18600926 unit 9 off, dim level: 0, period: 259us. Addr 18600926 unit 9 off, dim level: 0, period: 258us. Addr 18600926 unit 9 off, dim level: 0, period: 259us.

Foutje van mij over die sms.
Maar dit zou dan bijvoorbeeld moeten werken:

    case NewRemoteCode::on:
            Serial.print(" on");
            digitalWrite(groeneLed, HIGH);
            break;
    case NewRemoteCode::off:
            Serial.print(" off");
            digitalWrite(groeneLed, LOW);
           break;
enz.

Dit werkt inderdaad alleen wil ik meerdere amst-606 gaan toepassen.
Deze onderstaande define’s zijn de codes van 1 amst-606 zender.

#define deurDicht 18600926 unit 9 off, dim level: 0, period: 259us;
#define deurOpen  18600926 unit 9 on, dim level: 14, period: 259us;

Die groenLed wordt straks een alarm en ik wil wel kunnen zien welke amst-606 aangesproken is.
Dus die led zal moeten gaan branden als alleen deze amst-606 aangesproken wordt. Het akoestische signaal zal altijd aangesproken moeten worden maar er gaat wel een apart ledje branden zodat ik kan zien welke deur open gegaan is, dus ik krijg bijvoorbeeld 5 ledjes met elke een amst-606 zender.

#include <NewRemoteReceiver.h>

int groeneLed = 32;  //Deur dicht
int rodeLed   = 23;  //Deur open

#define deurDicht 18600926 unit 9 off, dim level: 0, period: 259us;
#define deurOpen  18600926 unit 9 on, dim level: 14, period: 259us;

void setup() {
  Serial.begin(115200);
  NewRemoteReceiver::init(0, 2, showCode);
  pinMode(groeneLed, OUTPUT);
  pinMode(rodeLed, OUTPUT);
}

void loop() {
}
// Callback function is called only when a valid code is received.
void showCode(NewRemoteCode receivedCode) {
  // Note: interrupts are disabled. You can re-enable them if needed.

  // Print the received code.
  Serial.print("Addr ");
  Serial.print(receivedCode.address);

  if (receivedCode.groupBit) {
    Serial.print(" group");
  }
  else {
    Serial.print(" unit ");
    Serial.print(receivedCode.unit);
  }

  switch (receivedCode.switchType) {
    case NewRemoteCode::off:
      Serial.print(" off");
      digitalWrite(groeneLed, LOW);
      break;
    case NewRemoteCode::on:
      Serial.print(" on");
      digitalWrite(groeneLed, HIGH);
      break;
    case NewRemoteCode::dim:
      Serial.print(" dim");
      break;
  }

  if (receivedCode.dimLevelPresent) {
    Serial.print(", dim level: ");
    Serial.print(receivedCode.dimLevel);
  }

  Serial.print(", period: ");
  Serial.print(receivedCode.period);
  Serial.println("us.");

}

Nou je hebt toch allerlei parameters? Je hebt een adres, unit enz. Dus als jij wilt dat hij alleen maar voor een bepaalde unit iets moet doen of adres (geen diee hoe dat spul verder werkt) moet je uiteraard een extra test doen. Dus leef je uit....

Ik heb het volgende voor elkaar gekregen,

alleen wil ik dus als case NewRemoteCode::on is 2 dingen doen. Ik wil een Kaku ontvanger aansturen middels mySwitch.send(A_aan, 24); en ik wil mijn groeneLed HIGH hebben.

Zoals ik het nu gedaan heb gaat het te traag door mijn delay die erin zit. Hoe krijg ik dit omgezet naar bv een && functie? dus en myswitchsend & digitalwrite high??

void loop() {
}
// Callback function is called only when a valid code is received.
void showCode(NewRemoteCode receivedCode) {
  // Note: interrupts are disabled. You can re-enable them if needed.

  switch (receivedCode.switchType) {

    case NewRemoteCode::on:
      mySwitch.send(A_aan, 24);
      delay(10);
      digitalWrite(groeneLed, HIGH);
      break;
    case NewRemoteCode::off:
      mySwitch.send(A_uit, 24);
      delay(10);
      digitalWrite(groeneLed, LOW);
      break;
  }
}

die delays eruit slopen. Zinloze statements.....Snap al niet waarom je ze gebruikt in deze situatie. Eerst wacht je tot remote zijn bericht heeft weggestuurd en dan ga je nog eens 10mSec wachten. En als het dan nog te lang duurt, zit het in die remote library. Dus zet je dan eerst die groene led aan en pas daarna stuur je het bericht uit naar de remote. Is het dan nog niet goed, dan moet je gaan sleutelen in de library.... Maar dan moet je nog wel een tijdje studeren..... Anders had je deze vragen niet gesteld.

Ja die heb ik erin gezet omdat anders beide actie's niet goed uitgevoerd werden..(overgeslagen lijkt het wel)

Ik had eerst myswitch.send en digitalwrite onder elkaar staan maar ik denk dat dat anders moet?!

Je moet wel duidelijk maken waarom je iets doet (of denkt te moeten doen) als je een vraag gaat stellen. Nu kom je daar pas achteraf mee, en laat helpers dus tot dat moment gokken naar de redenen.

Je probleem, dat je twee dingen wil doen en dat je denkt dat ze niet gebeuren, is niet zo heel moeilijk op te lossen hoor. Geen idee of je dat geprobeerd hebt, maar wat als je die beide acties nou eens zou omdraaien ? Dus eerst de LED aanzetten en dan die myswitch actie uitvoeren ? Als die myswitch actie op een of andere manier voor timing problemen of weet ik wat voor problemen zorgt, dan staat die LED alvast aan. Een delay op die plaats is alleen voor debug doeleinden acceptabel, een van de weinige momenten dat een delay sowieso een goed idee zou kunnen zijn. Door een delay zou je eventueel een LED die heel kort oplicht toch nog kunnen zien. Maar 10 milliseconden is dan nog wel wat te kort om het echt te registreren hoor.

Dus voor test doeleinden zou ik kijken of er aan de voorwaarden word voldaan, dan de LED aanzetten, dan een kwart seconde wachten en dan de myswitch magic doen. Een kwart seconde moet je echt wel kunnen zien. Je ziet dan dus ook of de LED aan gaat en meteen daarna weer word uitgezet (om wat voor reden dat ook moge gebeuren). Dan gebruik je de LED dus als debug tool.