Klikaanklikuit: (uiteindelijk) een zender/repeater bouwen

Hi allen,

Ik heb een Arduino Uno R3, een paar klikaanklikuit afstandsbedieningen en stekkers (ontvangers), en heb onlangs een 433Mhz setje (transmitter en receiver) gekocht bij TinyTronics:

https://www.tinytronics.nl/nl/communicatie-en-signalen/draadloos/rf/modules/433mhz-rf-transmitter-en-receiver-link-kit

Nu wil ik het geheel laten werken. Eerst maar eens kijken welke signalen ik kan ontvangen. Maar ik kan nergens echt vinden hoe dit moet - er is verouderde code te vinden, of code die niet met KAKU lijkt te werken.

Zou iemand me op weg willen helpen? Ik zal mijn voortgang hier documenteren voor toekomstige klussers.

Ik heb eventueel ook nog een ander setje transmitter/receiver. Hier de foto's:

Setje 1 van TinyTronics (alleen de receiver)::

De pins van boven naar beneden: VCC, 2x data, GND.

Setje 2 uit een Arduino bouwpakket uit 2021:

Heb een poging gewaagd om een kaku library van hackerstore te gebruiken, die lijkt fors verouderd te zijn, ik moest volgens een suggestie een #include "WProgram.h" bijvoorbeeld vervangen met #include "Arduino.h" in de RemoteReceiver.h en RemoteSwitch.h header files.

In die lib zit een Show_received_code.pde bestand, die zou een ontvangen input naar de serial output monitor moeten sturen. Ik heb voor de zekerheid in setup() een print naar de serial toegevoegd. Die doet het, maar ik krijg verder geen andere output op de monitor.

Ik heb een nieuwere versie van RemoteSwitch en RemoteReceiver gevonden:

edit: Ben weer een stapje verder: Ik heb bovenstaande versie geïnstalleerd volgens de README, en in de Examples → InterruptChain → ReceiveRemoteAndSensor geladen. Nu krijg ik op de seriële monitor te zien dat mijn KAKU afstandsbediening wordt herkend:

Addr <getal> unit 13 on, period: 244us.

Als ik op 'uit' druk wordt er unit 13 off getoond. Dus we zijn weer een stapje verder. En het mooie is: beide ontvangers werken.

Nu nog even nadenken over de volgende stap.

Ik heb vannacht de ontvanger aan laten staan - maar het lijkt erop dat ik alleen signalen van afstandsbedieningen ontvang en niet van lichtschakelaars (die je op de muur kan plakken) en signalen vanaf de ICS. Of de ontvanger is niet sterk genoeg? Vannacht heeft de ICS een aantal apparaten namelijk op bepaalde tijden wel uitgezet, en vanmorgen weer aan, maar ik heb geen signalen geregistreerd. En ook de lichtschakelaars worden niet geregistreerd.

edit Lijkt erop dat de ontvanger misschien niet sterk genoeg is? Als ik hem dichter bij de lichtschakelaar breng doet hij het wel. Ik zal eens zo'n koperen antenne'tje solderen.

Sterk is niet de juiste benaming voor een ontvanger.
Dat zou dan eerder gevoelig(heid) zijn.
Je kunt de prestaties van een ontvanger verbeteren door een andere en/of betere antenne te monteren.
Je kunt ook proberen het ontvangen signaal te versterken, maar dat kan maar in beperkte mate.
Wanneer je signaal niet sterk genoeg is en je dat wil verbeteren door het ontvangen signaal te versterken, dan kan het zo zijn dat je het werkelijke signaal niet meer kunt optillen (versterken), en dat het ruisniveau wel opgetild wordt.
Daarmee wordt dan het verschil tussen ruis en signaal kleiner, en bereik je het tegenovergestelde van wat je eigenlijk probeerde te doen.

Nu kun (mag) je de zender niet sterker maken, dus ben je aangewezen op het verbeteren van de ontvanger door inderdaad een betere antenne te monteren.
Een andere mogelijkheid is de zenders en de ontvanger dusdanig op te stellen dat er zo min mogelijk obstakels tussen deze delen zijn.
Obstakels zijn zaken als betonnen (stenen) muren, maar ook metalen objecten en objecten die vooral uit vocht bestaan (mensen bijvoorbeeld).
De metalen objecten kunnen niet alleen de signalen tegenhouden, maar ook reflecties van de radiosignalen veroorzaken, welke daarmee ook verstoord kunnen worden.

1 Like

Bedankt voor je uitleg en verbeteringen @MAS3 , ja je hebt gelijk, ik had het over gevoeligheid van de ontvanger moeten hebben.

Mijn eerste tests waren allemaal in mijn werkkamer van ongeveer 4 × 5m². Op zo'n anderhalve meter afstand gaf de ontvanger het signaal van de afstandsbediening al niet meer door op de serial port. Dus wel of geen antenne op deze module ga ik nog wel testen, maar ik heb toch ook maar nog wat andere ontvangertjes besteld, ook uit nieuwsgierigheid en ze komen later vast wel meer van pas in andere projecten.

De meest prijzige, een Aurel RX-4MM5-F 433MHz RF receiver twv €8,-, kwam vandaag binnen en ontving signalen direct na het aansluiten op de breadboard. Overduidelijk een stuk gevoeliger. Deze rapporteert ook de signalen die vanuit de woonkamer en uit de meterkast komen, alwaar ik mijn ICS-2000 heb hangen, gekoppeld aan de slimme meter zodat ik daarmee ook mijn energieverbruik kan aflezen. (Waarom ze deze niet meer maken is mij een raadsel, het is een erg handige feature).

Nu ik de signalen kan aflezen wordt het tijd om het verzenden te gaan uitvogelen en schema's te maken. Ik wil in elk geval met tijd gaan werken, dus ik zal een RTC (real time clock) nodig hebben. En ik wil met verschillende momenten rond de zonsopgang en zonsondergang gaan werken, dus ik moet gaan leren hoe ik verschillende tijdstippen, aan de hand van mijn geografische locatie, kan berekenen, het liefst uiteraard op de Arduino zelf.

De reden hiervoor is als volgt: ik heb een klein vijvertje in de tuin met een waterfilter, en een fonteintje. Het lijkt me leuk om die in- en uit te kunnen schakelen op basis van niet strict de zonsopgang, maar bijvoorbeeld aan het eind van het "gouden uur" in de ochtend en aan het begin van het gouden uur in de avond. Dit is iets na zonsopgang en iets voor zonsondergang en dit heb ik leren kennen met de Mobile Observatory Pro app op Android, screenshotje hieronder.

Daarnaast is de app van Klikaanklikuit wanneer je met tijden wil werken, niet handig in combinatie met standaardtijd vs zomertijd, je kan bijvoorbeeld niet zeggen "ga in de zomertijd om 21.00u uur aan en in de standaardtijd om 20.00u". Misschien is het mogelijk om de hele app de zomertijd te laten negeren, maar, misschien is het ook mogelijk om dit soort dingen allemaal met de Arduino te doen! Leuk projectje.

Wordt vervolgd!

Dit is de Twilight feature van Mobile Observatory Pro:

rtc tijd is mij niet goed bevallen. ik haal tegenwoordig de tijd van internet af, dus als je een wifi signaal beschikbaar hebt is dat ook een optie lijkt mij

1 Like

Je hebt het over geografisch locatie en over RTC.
Een RTC is een behoorlijk nauwkeurige klok die zelf weer geklokt wordt met een kristal van 32.768 KHz (dat getal is deelbaar door 8 en dat komt heel handig uit).
Een RTC heeft een onnauwkeurigheid van beter dan tienden per miljoen pulsen.
Maar met 32.768 KHz, zit je wel redelijk snel aan die onnauwkeurigheid (binnen een minuut begint dat al), al loopt die dan niet heel hard op.
De relatie tussen tijd en locatie is snel gelegd wanneer je weet hoe locatiebepaling werkt.
Want GPS (en aanverwante systemen) is gebaseerd op een atoomklok die in elke satelliet verwerkt is.
Dat soort klokken zijn heel veel nauwkeuriger dan de kristalklokken van een RTC.
Nu wil dat niet zeggen dat je geen RTC moet gaan gebruiken, maar je kunt wel met enige regelmaat (bijvoorbeeld 1 x per dag) de RTC synchroniseren met de tijd die je uit het GPS signaal kunt halen (de sencence $GPZDA bevat uitsluitend datum en tijd (GMT) plus de daarbij behorende checksum).
Dit alles geldt natuurlijk wanneer je ook locatiebepaling wil doen en daarvoor een GPS module gaat gebruiken (je noemde geolocatie, maar hebt het nog niet over locatiebepaling gehad).
Dus wanneer je locatiebepaling gaat doen, maak dan gebruik van alles wat dat biedt.

Dank je wel voor de tips. Dus even samenvattend, RTC heeft een 'drift' en die zou ik samen met GPS kunnen gebruiken om de tijd stabiel(ig) te houden. GPS kan ik dan ook gebruiken voor locatiebepaling. Ja dat laatste was niet direct belangrijk om te noemen omdat ik ook gewoon de coördinaten van mijn huis kan hardcoden, maar idd.

Ik ben met deze vraag, en jullie antwoorden (ook dank aan jou dus @Frits1956) even naar de electronicawinkel gegaan en de verkoper raadde me aan om eens met een ESP32 aan de slag te gaan. En hij wist mij soepeltjes een Wemos R1 D32 te verkopen. Die heeft namelijk wifi, een Arduino Uno form factor en zou misschien handiger kunnen zijn. Dus met de voornoemde Wamos rijker, en met toch ook nog maar een RTC voor de Arduino, en nog wat ander speelgoed, weer huiswaarts gegaan. Die verrekte verkopers en hun geweldige speeltjes. Ik had me nog zo voorgenomen om niet meer dan een tientje uit te geven.

Nu probeer ik eens om de 433Mhz receiver op de Wemos aan te sluiten. De Arduino IDE werkt, ik heb een blinker scriptje op de Wamos gezet om te testen. Maar nu de receiver aan de praat krijgen. Het is me nog niet duidelijk hoe ik, wat pin 2 op de Arduino is, moet aanpassen naar GPIO pin 26 op de Wemos. Pin 2 op de Wemos is de onboard LED.

Ik ben even aan het kijken of het voldoende is om de code van fuzillogic's ReceiveRemoteAndSensor ergens aan te passen, en dan weer dezelfde output op de serial monitor te krijgen. Dat is waar ik nu even gestrand ben.


Ja: met Blethooth :smile:

We zijn weer een stapje verder - ditmaal met een beetje hulp van ChatGPT, we zijn niet te beroerd om dat toe te geven, maar ik zal kort in mijn eigen woorden het gesprek samenvatten, niemand heeft immers zin om vraaggesprekken met robots terug lezen.

Mijn vraag was als volgt:

Is op de Arduino Uno R3 interrupt 0 altijd gelijk aan pin 2?

Het antwoord, in het kort, was 'ja.' Mijn volgende vraag was:

Wat is dan de interrupt die op de Wemos D1 R32 gekoppeld is aan GPIO 26?

Dit antwoord was iets uitgebreider: kennelijk heeft de Wemos, of specifieker gezegd, de ESP32, de interrupts niet standaard aan de pins vastgeplakt. We kunnen elke GPIO pin gebruiken voor interrupts. (ik moet nog maar eens goed leren hoe dit precies werkt, mijn begrip van interrupts is kennelijk toch nog wat mistig.)

ChatGPT legt uit dat ik op de volgende manier een interrupt kan koppelen aan een pin:

void setup() {
  // Stel GPIO 26 in als input
  pinMode(26, INPUT);

  // Voeg een interrupt toe op GPIO 26
  attachInterrupt(digitalPinToInterrupt(26), myISR, RISING);
}

De truc waar we in ons geval naar op zoek zijn is gevonden: digitalPinToInterrupt(26).

Mooi. Na diverse bestanden uit de eerder genoemde repo van fuzzillogic meermaals te zijn doorgespit zijn er een aantal dingen helder:

  • In InterruptChain.h staat het volgende:
    > Arduino Mega has 6 interrupts. For smaller Arduinos and / or to save a few bytes memory you can lower it to 2 or even 1. Don't go higher than 6 tho.
    Ik denk dat hij zegt dat we niet hoger dan 6 moeten gaan omdat hij in InterruptChain.h en InterruptChain.cpp slechts 6 interrupts heeft gehardcode. Voor ons is dat volgens mij niet relevant omdat we niet direct naar een pin refereren, maar naar wat dan ook de waarde is die digitalPinToInterrupt(26) teruggeeft. Dus we hoeven er geen 20 interrupts bij te programmeren.

  • De eerste parameter van bijvoorbeeld NewRemoteReceiver::init() is de parameter waarin we geĂŻnteresseerd zijn: het interrupt-nummer. Die mag 0-6 zijn, of -1, om dit beter te begrijpen kijken we even naar RemoteReceiver.h. In het kort: als de interrupt hoger is dan 0, registreert init pin <nummer> met deze library.

Samenvattend

De stappen zijn eigenlijk heel eenvoudig: we gebruiken geen -1 als eerste parameter voor NewRemoteReceiver::init(), dus als we even vanaf nul beginnen zijn dit de stappen:

  1. Open in de Arduino IDE: Examples → InterruptChain → ReceiveRemoteAndSensor
  2. Voeg aan setup() toe: pinMode(26, INPUT);
  3. Vervang NewRemoteReceiver::init(-1, 2, showNewCode); met:
    NewRemoteReceiver::init(digitalPinToInterrupt(26), 2, showNewCode);
  4. Comment (zet // voor) de regels InterruptChain die gebruik maken van pin 0 - zoals uitgelegd is dit alleen nodig als de eerste parameter van RemoteReceiver en/of NewRemoteReceiver en/of SensorReceiver, -1 is.
  5. Compile en upload.

Verder

Ik krijg nu inderdaad een output die precies hetzelfde is als op de Arduino Uno R3:

Addr <getal> unit 13 on, period: 246us

Dus we zijn op de goede richting. Er is nu echter wel een nieuw probleem bijgekomen:

Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1).
Gevolgd door een register dump, backtrace, en een reboot. Dus hij crasht. Wat nu? Daar kom ik op terug. Ik vermoed dat de interrupt teveel tijd in beslag neemt. Daar houden deze bordjes niet zo van, dan worden ze grillig, interrupts mogen niet teveel tijd in beslag nemen.

Overigens ook even niet het doel uit het oog verliezen: in dit stadium ben ik signalen aan het uitlezen zodat ik die kan reproduceren. We zitten dus nog steeds in de beginnersfase: kijken wat mijn zenders nu uitzenden zodat ik dat kan reproduceren. Uiteindelijk gaan we heel ergens anders naar toe: ontvangen signalen repeaten, en iets programmeren dat meer functionaliteit heeft dan de standaard Klikaanklikuit Android app.

Wordt vervolgd...

Dat gaat over Arduino Mega, niet over een Uno en al zeker niet over een ESP.

-1 als waarde betekent meestal dat de waarde ongeldig is, bijvoorbeeld wanneer er iets nog niet geconfigureerd is, of meer waarschijnlijk in dit geval "zoek het zelf maar uit".

wdt is een WatchDog Timer, inderdaad een mechanisme dat een reset veroorzaakt wanneer er te lang niet een bepaalde handeling geregistreerd wordt.
"Deze bordjes" is niet helemaal waar.
Een interrupt mag nooit te lang duren, het maakt niet uit voor welk board of toepassing dat is.
Wanneer de interrupt te lang duurt, kan bijvoorbeeld de volgende interrupt alweer optreden waardoor je nooit meer uit de interrupt (een zeer tijdelijke onderbreking van je reguliere programma, zodat je iets zeer dringends kunt doen) komt.
Daarom moet je interrupt alleen signaleren dat het event heeft plaatsgevonden, en kun je buiten de interrupt dan de handelingen gaan doen die dat interrupt-event moeten veroorzaken.
Wees je er van bewust dat een ESP veel harder loopt dan een Uno en het ding dus veel sneller klaar is met de taken die je voor 'm bedenkt.

Zeker. Die tekst in de broncode is geschreven voor een Mega, ik neem aan omdat het 't grootste Arduino bordje is. Maar je kan zien dat hij 6 interrupts hard coded heeft. In de code staat ook dat je het aantal interrupts naar beneden kan bijstellen, 'maar niet naar boven' omdat hij maar 6 interrupts in de code heeft gezet.

Ahh ja, true! Ik zei het verkeerd idd - interrupts mogen nooit te lang duren.

Goeie. Die kunnen we dus weer oppakken vanuit je main loop.

Ik zal mij daar nog eens in verdiepen. Bedankt, daar had ik idd nog even niet over nagedacht.

Soms komt het echte leven er even tussendoor en voor je het weet zijn we weer heel wat dagen verder.

Voor Twilight kreeg ik ken ingeving in de KISS filosofie: "keep it simple, stupid". En die is als volgt: ik zou in eerste instantie eens een dedicated Arduino Twilight zender kunnen bouwen, en de acties die daaraan moeten worden gekoppeld kunnen dan gewoon met behulp van de gewone Kaku-appi.c.m de ICS-2000 worden uitgevoerd! En zo maken we iets niet moeilijker dan noodzakelijk.

Ik ben daarom van plan om een nieuw instap-setje met twee lichtschakelaars en een afstandsbediening te gaan kopen, die heeft namelijk 16 kanalen, en die signalen kan ik als volgt repliceren, we nemen als voorbeeld 24 december 2024 op mijn locatie, omdat in de winterperiode alle 'schemerpunten' een tijdstip hebben, in de zomer is dat niet zo, dan is er bijvoorbeeld geen astroschemer.

Kanaal 1: aan: astro-op (6:37u) - uit: astro-onder (18:29)
Kanaal 2: aan: nautisch-op (7:19u) - uit: nautisch-onder (17:47u)
Kanaal 3: aan: civiel-op (8:05u) - uit: civiel-onder (17:01u)
Kanaal 4: aan: zonsopgang (8:47u) - uit: zonsondergang (16:18u)

Kanaal 5: aan: transit (“midderdag”) (12:33u) - uit: anti-transit (middernacht) (0:33u)

Kanaal 6: aan: begin blauwe ochtend (7:49u) - uit: eind blauwe ochtend (8:37u)
Kanaal 7: aan: begin blauwe avond (16:28u) - uit: eind blauwe avond (17:17u)

Kanaal 8: aan: begin gouden ochtend (8:55u) - uit: eind gouden ochtend (10:48u)
Kanaal 9: aan: begin gouden avond (14:18u) - uit: eind gouden avond (16:11u)

9 kanalen, 18 interessante tijdstippen per dag voor wat betreft de zon. We kunnen dit nog verder uitbreiden!

Kanaal 10: aan: maansopkomst (1:57u) - uit: maansondergang (12:38u)

Hoe gaan we dit aanpakken? Wordt vervolgd…