Hallo Allemaal,
Ik zat eergisteren te googlen naar 'domotica' in het algemeen en kwam daarbij de RFXCOM unit tegen, een apparaat dat net zoals de nodo ook RF signalen kan ontvangen. Ik zag ook support voor Oregon Scientific (weerstations) en ik dacht als zij dat kunnen maken, dan moet de Nodo dat toch ook kunnen.
Dus gisteren maar even bij de Mediamarkt de goedkoopste Oregon temperatuurmeter met remote sensor gekocht (19 euro, acceptabel risico als het toch niet gaat werken...). Protocol documentatie gegoogled en gevonden en dus maar een routine in elkaar geknutseld.
En jawel, het werkt! Software is in 'alpha' stage, maar ik ontvang nu netjes elke 35 seconden de buitentemperatuur via 'rawsignal' event. Hoef ik geen gaten te boren om een directe sensor van de Nodo naar buiten te krijgen...
Hieronder de software routine, is zeker nog veel op aan te merken, maar het is dan ook mijn eerste poging tot uitbreiden van de Nodo. Ik weet overigens niet of uitbreiden van de code snel tot instabiliteit gaat leiden, ik begreep dat het geheugen van deze versie van de chip eigenlijk bijna vol zit.
/*********************************************************************************************\
* Analyseert een RF signaal van Oregon Scientific remote temperatuur sensoren.
* Routine is in 'alpha' stage, gebruik op eigen risico, neveneffecten op de Nodo Software niet bekend.
* Routine bevat (nog) geen foutdetectie en CRC check
* Minwaarde nog niet geimplementeerd.
* Alleen getest met Oregon Scientific THN132 remote sensor.
* Send na ontvangst een 'rawsignal' via de serial bus met structuur "ID, Channel, Measured Value"
* Alleen V2 protocol messages worden ondersteund, message format:
* AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCDDDDEEEEFFFFFFFFGGGGGGGGGGGG, A = startbits/preamble, B = sync bits, C = ID
* D = Channel, E = flags, F = RC, G = Meetwaarde, 3 digits BCD encoded
\*********************************************************************************************/
void Oregon_Decode(void)
{
int y = 1;
int c = 1;
unsigned long rfbit = 1;
unsigned long id = 0;
unsigned long channel = 0;
unsigned long data = 0;
byte digit1, digit2, digit3;
if (RawSignal[0] < 196) return;
for(byte x=1;x<=RawSignal[0];x++)
{
if(RawSignal[x] < 500)
{
rfbit = rfbit ^ 1;
x++;
}
if (y%2 == 1)
{
if ((c>21) && (c<37)) id = (id >> 1) | (rfbit << 15);
if ((c>36) && (c<41)) channel = (channel >> 1) | (rfbit << 3);
if ((c>52) && (c<65)) data = (data >> 1) | (rfbit << 11);
c++;
}
y++;
}
PrintText(Text_07);
PrintValue(id);
PrintChar(',');
PrintValue(channel);
PrintChar(',');
digit3 = data & 0xf;
digit2 = (data >> 4) & 0xf;
digit1 = (data >> 8) & 0xf;
PrintValue(digit1);
PrintValue(digit2);
PrintChar('.');
PrintValue(digit3);
PrintTerm();
}