Skocz do zawartości

Arduino Uno WH5029 stacja pogodowa, szukam rozpiski funkcji poszczególnych przesłanych bajtów.


99teki

Pomocna odpowiedź

		Boot

		t: 				t: 						t: 				|
0	01010101  01010101      01010101	|	01010101	0x55		naglowek
8	01011010  01011010      01011010  |  01011010	0x5A    
16	01100111  01100111      01100111  |  01100111	0x67    16,8 validace	
24	11110110  11110110      11110110  |  11110110	0xE6    24,8 --> id ?
32	11111111  11111111      11111111  |  11111111	0xFF    32,1 battery 36,4 two complement, 
                                      |
40	00001110  00001100      00001111  |  00001011	0x0B    36,12 temp ?
48	11010111  11011000      11011000  |  11010110	0xD6    48,8 humidit
56	11110110  11110010      11110010  |  11110110	0xF6    56,12  rain
                                      |
64	01111111  00111111      00111111  |  11111111	0xFF    68,8 wind		
72	11111111  11111111      11111111  |  11111111	0xFF    76,4 wind direction
80	11010001  10001000      10001011  |  01011100	0x5C    // crc 0xA
88	01111111  01111111      01111111  |  01111111	0x7F    
96                                    | 

- zakupiłem okazyjnie stację pogodową WH 5029.

- na tej bazie chciałbym zrobić zestaw odbiorczy z odbiornikiem RF podłączonym do arduino Uno. 

- w internecie są przykładowe programy na te stację ale po wgraniu ich do Uno , te programy pokazują bzdury.

- podłączyłem analizator logiczny do nadajnika i widzę że nadajnik wysyła pakiet 6 ramek po 12 bajtów.

- w tych programach z internetu odbiornik odbiera tylko 10 bajtów w ramce.

- zainstalowałem sniffer RF i mam odebrane surowe dane.

- może ktoś bawił się ta stacją i ma procedury jak wyliczyć poszczególne parametry - temperatura, wiatr, kierunek wiatru, ilość deszczu, wilgotność.

- czy tylko pozostała możliwość testów grzania termistora i obserwowania przesyłanych bajtów.

 

 

Edytowano przez 99teki
Link do komentarza
Share on other sites

Poszukaj mojego wątku o dekodowaniu danych ze stacji pogodowej, tam zdaje się podałem linki do strony gdzie była rozpiska tego co przylatuje. Stacja którą ja "nasluchiwałem" to był jakiś hiundai czy coś. 

  • Lubię! 1
Link do komentarza
Share on other sites

- u mnie na analizatorze wysyła preamble jako 8 "1".

- w dokumentacji Rf 433 piszą, że ma być te 8 sygnałów.

start 0xff.jpg

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

- dzięki za linki, zrobiłem błąd w deszyfracji bitów.

- pobawiłem sie czujnikami i mam chyba już rozpiskę funkcji transmisji.

- teraz jeszcze trochę testów i przesiadamy się na espxxYY.

 

00	10101010	0xAA		naglowek
08	10100101	0xA5
16	01100111	0x98		16,8 id
24	11000110	0x3C		24,8 ?     
32	00000000	0x00		32,4 battery 36,12 temp 
40	11111010	0xFA		cd. temp
48	00100100	0x24		48,8 humidity 
56	00000000	0x00		56,12  rain
64	00010000	0x10		cd. rain 68,8 wind		
72	00110010	0x32		cd. wind 76,4 wind dir "S"
80	01011100	0x5C		80,8 crc 
88	10000000	0x80		88,8 postamble 

 

Link do komentarza
Share on other sites

Coś nie mogę znaleźć tego programu co dekodował te ramki już do właściwych wartości. Gdzieś to leży w backupach

Link do komentarza
Share on other sites

(edytowany)

- problem chyba rozwiązany, przynajmniej dla WH5029.

- teraz dopiero zauważyłem wind-dir == 2, brzydko 

Wh5029.jpg

Edytowano przez 99teki
Link do komentarza
Share on other sites

Dobra coś chyba mam ale nie gwarantuję że ta wersja działała poprawnie. To były testy na atmege32. Później przepisałem to na esp8266 ale nie dokopię się teraz do tego archiwum 😕

/*
 * main.c

 */
//atmega32 16Mhz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "MK_MULTI_UART/mk_multi_uart.h"


volatile uint8_t idx;
volatile uint8_t frameEnd;
volatile uint8_t shiftBit = 8;

volatile uint8_t bitBuf[11];

const char * const dir[] = {
"N","NNE","NE","ENE","E","ESE","SE","SSE","S",
"SSW","SW","WSW","W","WNW","NW","NNW"
};

uint8_t LsbMsb( uint8_t data)
{
   uint8_t mask =1,buffer =0;
	for(uint8_t i=0;i<8;i++)
	{

            buffer = (buffer << 1) ;
		if(data&mask)
		buffer++;
           mask = mask << 1;
	}
	return( buffer );
}



int main(void){
	uart_init();
	PORTB|=(1<<PB0);
	DDRB|=(1<<PB1);
	PORTD|=(1<<PD6); // icp
	TCCR1B|=(1<<CS11); // f/8 = 2Mhz = 1imp = 500nS
	DDRC |= (1<<PC2);
	TCCR1B|=(1<<ICES1); // capture to rising
	TIMSK|=(1<<TICIE1);
	//TIMSK|=(1<<TOIE1);// overflow
	sei();
uart_puts(0, "Start");
uart_puts(0,"\r\n");

	for(;;)
	{
    if(frameEnd){
	for(uint8_t i = 0; i<11;i++){
		for(uint8_t j = 0; j<8; j++){
			if(bitBuf[i] & (1<<j))uart_puts(0,"1");else uart_puts(0,"0");
		}
	}
	uart_puts(0,"\r\n");
	uint32_t tw = 0;



tw = bitBuf[3]|(bitBuf[2]<<8);
tw&=0x0fff;
tw-=400;
uart_puts(0,"        T=");
uart_putint(0, tw/10, 10);
uart_puts(0,".");
uart_putint(0, tw % 10, 10);
uart_puts(0,"C ");
uart_puts(0,"H=");
uart_putint(0, bitBuf[4], 10);
uart_puts(0,"%");
uart_puts(0," Kierunek:");
uart_puts(0,(char*)dir[bitBuf[9] & 0x0f]);

uart_puts(0," Wiatr:");
//tw = bitBuf[5]|(bitBuf[6] << 8);
tw = bitBuf[5] * 340; // m/s
uart_putint(0,tw/1000,10);
uart_puts(0,".");
uart_putint(0,(tw%1000)/10,10);
uart_puts(0,"m/s|");
tw = bitBuf[5]*1224;
uart_putint(0,tw/1000,10);
uart_puts(0,".");
uart_putint(0,(tw%1000)/100,10);
uart_puts(0,"km/h");
uart_puts(0," Opad:");
tw = bitBuf[8] * 3;
uart_putint(0,tw/10,10);
uart_puts(0,".");
uart_putint(0,tw%10,10);
uart_puts(0,"mm       ");
uart_puts(0,"|");
uart_putint(0,bitBuf[5],10);
uart_puts(0,"|");
uart_putint(0,bitBuf[6],10);
uart_puts(0,"|");
uart_putint(0,bitBuf[8],10); // deszcz
uart_puts(0,"\r\n");
uart_puts(0,"\r\n");
shiftBit = 8;
frameEnd = 0;
}
}
}


ISR(TIMER1_CAPT_vect){ // przechwyt

 if(TCCR1B & (1<<ICES1)){
	 TCNT1 = 0;
 TCCR1B &=~(1<<ICES1);
 }else{
	TCCR1B|=(1<<ICES1);

	if(ICR1 > 900 &&  ICR1 < 1000) bitBuf[idx]|= (1<<(shiftBit - 1));                 // 1
	if(ICR1 > 2500 && ICR1 < 3500) bitBuf[idx]&=~(1<<(shiftBit - 1));	              // 0


	//if(++shiftBit > 7){
	if(!--shiftBit){
	shiftBit = 8;
		if(++idx > 10){
			idx = 0;
			frameEnd = 1;
		}
	}
  }
}

ISR(TIMER1_OVF_vect){ // przepelnienie
	frameEnd = 1;
idx = 0;

}

 

  • Lubię! 1
Link do komentarza
Share on other sites

- przeportowanie kodu pod esp8266 poszedł bez problemu.

- miałem tylko wątpliwości z ta linią, przykłady z sieci powodowały błąd jeśli void był na początku linii.

- szukałem jak powinno być ale nie znalazłem (słabo szukałem)

ICACHE_RAM_ATTR void handleInterrupt() {

- w końcu znalazłem że należy wpisać #define ICACHE_RAM_ATTR a makro zrobi resztę .

- poniżej funkcje opisujące poszczególne, odebrane bajty.

00	10101010	0xAA		naglowek
08	10100101	0xA5		poczatek ramki do crc	
16	01100111	0x98		16,8 validate  
24	00011000	0x18		24,8 id     
32	00000000	0x00		32,4 battery 36,12 temp 
40	11111010	0xFA		cd. temp
48	00100100	0x24		48,8 humidity 
56	00000000	0x00		56,12  rain
64	00010000	0x10		cd. rain 68,8 wind		
72	00110010	0x32		cd. wind 76,4 wind dir "S"
80	01011100	0x5C		80,8 crc 
88	10000000	0x80		88,8 postamble 	

Procedury obliczeniowe

32,4 bat 
36,12 temp 0x0FA --> 250 == 25.0 stC
48,8 humidity dec 0xb 11 %
56,12 rain 200 * 0.3 == 20 mm.
68,8 wind  0x04 4 * 0.34 = 1.4  m/sec
76,4 win-dir N-0xF,NNE-0xE NE-0xD ENE-0xC E-0xB SE-0x9 S-0x7 SW-0x5 W-0x3 NW-0x1 
80,8 crc

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.