Arduino i bezprzewodowy czujnik temperatury i wilgotności
Arduino i bezprzewodowy czujnik temperatury i wilgotności
Witam,
Szukam jakiegoś punktu zaczepienia jak odczytać dane z tego typu bezprzewodowych czujników jak www[dot]biowin[dot]pl/bioterm/elektroniczne-stacje-pogody/dodatkowe-bezprzewodowe-sondy
Dowiedziałem się, że pracują one na 433 MHz, ale to wszystko póki co, jak to dalej ugyźć?
pozdrawiam
Jacek
Szukam jakiegoś punktu zaczepienia jak odczytać dane z tego typu bezprzewodowych czujników jak www[dot]biowin[dot]pl/bioterm/elektroniczne-stacje-pogody/dodatkowe-bezprzewodowe-sondy
Dowiedziałem się, że pracują one na 433 MHz, ale to wszystko póki co, jak to dalej ugyźć?
pozdrawiam
Jacek
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
W opisie jest napisane z jaką stacją to współpracuje. Do pracy z Arduino tego raczej nie zmusisz, producent na pewno zadbał o odpowiednie kodowanie sygnału.
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
Hmmm, może jest tak jak piszesz, że producent zadbał, ale:
Jacek
- kodowanie jest na pewno prymitywne bo to proste układy są z niewielką pamięcią
- po cóż producent miałby ukrywać takie dane, raczej nic na tym nie traci
Jacek
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
Wczoraj w nocy to "rozkodowałem" wstępnie. Sonda wysyła 37 bitów:shymon pisze:... Do pracy z Arduino tego raczej nie zmusisz, producent na pewno zadbał o odpowiednie kodowanie sygnału.
- 12 bity nie wiadomo czego, zawsze póki co takie same
- 8 bitów w których jest kanał i część temperatury
- 8 bitów z drugą częścią temperatury (zwykły bajt)
- 8 bitów z wilgotnością (zwykły bajt)
- 1 bit z nie wiadomo czym
Jak skończę to się pochwalę projektem :)
pozdrawiam
Jacek
Jacek
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
Te 12 bitów to może być jakiś numer identyfikacyjny, który jest potrzebny gdy stacja współpracuje z kilkoma czujnikami na raz i jest wykorzystywany przy parowaniu czujnika ze stacją.
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
Sprawdź czy ten ostatni bit to nie jest bit parzystości: http://pl.wikipedia.org/wiki/Kontrola_parzysto%C5%9Bci
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
Pierwsze cztery bity się w ogóle nie zmieniają, kolejne 8 zmieniło się po wyjęciu i włożeniu ponownie baterii, ale potem już nie. Jedna stacja może współpracować z trzema czujnikami, nr "kanału" zmienia się przełącznikiem. Jak już pisałem nr tego kanału jest wysyłany na kolejnych 8 bitach. Wyczaiłem już nawet dokładnie których, ale nie pamiętam teraz.Goblin pisze:Te 12 bitów to może być jakiś numer identyfikacyjny, który jest potrzebny gdy stacja współpracuje z kilkoma czujnikami na raz i jest wykorzystywany przy parowaniu czujnika ze stacją.
pozdrawiam
Jacek
Jacek
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
No właśnie nie, póki co ten bit się ani razu nie zmienił. Jak tylko uda mi się podłączyć do tego przy pomocy arduino to lepiej to pobadam, bo badanie analizatorem stanów logicznych nieco uciążliwe jest.Maxik pisze:Sprawdź czy ten ostatni bit to nie jest bit parzystości: http://pl.wikipedia.org/wiki/Kontrola_parzysto%C5%9Bci
pozdrawiam
Jacek
Jacek
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
Witam,
również jestem w poszukiwaniu bezprzewodowego czujnika temperatury i wilgotności do Arduino (tak trafiłem na ten wątek).
@jacek przejrzałem ofertę tej firmy, i mają rozsądne ceny. Jeżeli udało się Tobie rozpracować je, to byłbym wdzięczny (pewnie nie tylko ja) gdybyś się podzielił co i jak (jaka antena, jak skonfigurować, a może nawet kodem) ( byłby z tego super artykuł na główną).
również jestem w poszukiwaniu bezprzewodowego czujnika temperatury i wilgotności do Arduino (tak trafiłem na ten wątek).
@jacek przejrzałem ofertę tej firmy, i mają rozsądne ceny. Jeżeli udało się Tobie rozpracować je, to byłbym wdzięczny (pewnie nie tylko ja) gdybyś się podzielił co i jak (jaka antena, jak skonfigurować, a może nawet kodem) ( byłby z tego super artykuł na główną).
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
Ależ napisałem artykuł na główną z rozpracowanym czujnikiem :) nie pamiętam teraz adresu, ale łatwo znaleźć.
Jest też na http://arduinoj.blogspot.com cykl wpisów na ten temat gdzie nieco dokładniej jest to opisane jak do tego dochodziłem.
pozdrawiam
Jest też na http://arduinoj.blogspot.com cykl wpisów na ten temat gdzie nieco dokładniej jest to opisane jak do tego dochodziłem.
pozdrawiam
pozdrawiam
Jacek
Jacek
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
Czwarty czujnik od lewej z tego sklepu działa na tym kodzie.
Nie mogę doszukać się strony ale program został mi na twardym a chętnie bym przylinkował bo gościu kawał dobrej roboty zrobił.
Bez anteny w moim odbiorniku stabilnie działał do 6m
Nie mogę doszukać się strony ale program został mi na twardym a chętnie bym przylinkował bo gościu kawał dobrej roboty zrobił.
Bez anteny w moim odbiorniku stabilnie działał do 6m
Kod: Zaznacz cały
// wyjśącie odbiornika RDF
#define RF_DATA_PIN 11
// wyjście z diodą świecącą
#define LED_PIN 12
// czasy stanu wyokiego i przerw
#define UP_TIME 560
#define SEPARATOR_TIME 8640
#define ZERO_TIME 1900
#define ONE_TIME 3800
// makra sprawdzające czy czas mieści się w buforze
#define CHK_T(CT,T) ((CT >= (T - 250)) && (CT <= (T + 250)))
#define CHK_T2(CT,T) ((CT >= (T - 800)) && (CT <= (T + 800)))
// liczba bitów jednej wiadomości i liczba
// paczek, które są nadawane
#define NUM_OF_BITS 37
#define NUM_OF_SERIES 6
// specjalna wartość oznaczająca, że odczyt był błędny
#define BAD_VALUE 0b1000000000000000
// bufor na bity
int8_t bits [NUM_OF_BITS];
// za każdym z 6 pomiarów na określonej pozycji mogę zmierzyć
// 0 lub 1 (na skutek błędów transmisji)
// jeżeli zmierzę 1 to zwiększam tę wartość,
// a jeśli 0 to zmniejszam
int8_t bit_adds [NUM_OF_BITS];
// za każdym poprawnym pomiarem zwiększam tę wartość o 1
uint8_t bit_measures [NUM_OF_BITS];
// licznik pomiarów całej paczki
uint8_t measure_number;
uint32_t last_report_time = 0;
uint32_t last_pulse_time;
#ifdef DEBUG9
uint16_t arr_bit_times [NUM_OF_SERIES][NUM_OF_BITS][3];
#define PRE_DEBUG_BUF_SIZE 10
uint16_t arr_pre_buf_times [PRE_DEBUG_BUF_SIZE][3];
int pre_buf_counter;
#endif
#ifdef DEBUG_SALAE1
#define DEBUG_SALAE1_PIN 6
#endif
uint32_t getvalue(int bitStart, int bitNum)
{
uint32_t ret = 0;
for (int i = 0; i < bitNum; i++)
{
if (bits [bitStart + i] > 1)
return BAD_VALUE;
ret *= 2;
ret += bits [bitStart + i];
}
return ret;
}
void setup() {
Serial.begin(115200);
pinMode(RF_DATA_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
#ifdef DEBUG_SALAE1
pinMode(DEBUG_SALAE1_PIN, OUTPUT);
#endif
}
void loop()
{
// czyszczę wszystkie zmienne na początku
for (int i = 0; i < NUM_OF_BITS; i++)
{
bit_adds [i] = 0;
bit_measures [i] = 0;
#ifdef DEBUG9
for (int j = 0; j < NUM_OF_SERIES; j++)
{
arr_bit_times [j][i][0] = 0;
arr_bit_times [j][i][1] = 0;
arr_bit_times [j][i][2] = 0;
}
#endif
}
measure_number = 0;
#ifdef DEBUG9
for (int i = 0; i < PRE_DEBUG_BUF_SIZE; i++)
{
arr_pre_buf_times [i][0] = 0;
arr_pre_buf_times [i][1] = 0;
arr_pre_buf_times [i][2] = 0;
}
pre_buf_counter = 0;
#endif
uint32_t highTime, time, lowTime;
// czekam na prawidłowy pierwszy pulse high
last_pulse_time = micros();
while (true)
{
highTime = pulseIn(RF_DATA_PIN, HIGH);
time = micros();
lowTime = time - last_pulse_time - highTime;
last_pulse_time = time;
#ifdef DEBUG9
arr_pre_buf_times [pre_buf_counter][0] = lowTime;
arr_pre_buf_times [pre_buf_counter][1] = highTime;
arr_pre_buf_times [pre_buf_counter][2] = millis();
pre_buf_counter = (pre_buf_counter + 1) % PRE_DEBUG_BUF_SIZE;
#endif
if (CHK_T (highTime, UP_TIME) && CHK_T2 (lowTime, SEPARATOR_TIME))
{
break;
}
}
int bit_number = 0;
// wykonuję sześć pomiarów
while (measure_number < NUM_OF_SERIES)
{
// odczytuję pulse
highTime = pulseIn(RF_DATA_PIN, HIGH);
// ignoruję takie krótkie pulsy tak jakby ich nie było
if (highTime < 300)
{
continue;
}
time = micros();
// zbyt długie traktuję jako krótki który się zlał z normalnym
if (highTime > 750)
{
highTime = UP_TIME;
}
lowTime = time - last_pulse_time - highTime;
last_pulse_time = time;
#ifdef DEBUG9
if (bit_number < NUM_OF_BITS)
{
arr_bit_times [measure_number][bit_number][0] = lowTime;
arr_bit_times [measure_number][bit_number][1] = highTime;
arr_bit_times [measure_number][bit_number][2] = millis();
}
#endif
// sprawdzam czy pulse ma dobry czas
if (!CHK_T (highTime, UP_TIME))
{
// i jeśli nie to koniec
//Serial.println("1");
break;
}
// sprawdzam czy to znacznik końca serii
if (CHK_T2 (lowTime, SEPARATOR_TIME))
{
// sprawdzam czy została odpowiednia liczba bitów odczytana
if (bit_number <= NUM_OF_BITS)
{
measure_number++;
bit_number = 0;
}
else
{
// została odczytana zła liczba bitów
Serial.print("2 - ");
Serial.println(bit_number);
break;
}
}
// sprawdzam czy kolejny bit został odczytany
else if (CHK_T2 (lowTime, ZERO_TIME))
{
if (bit_number >= NUM_OF_BITS)
{
break;
}
bit_adds [bit_number]--;
bit_measures [bit_number]++;
bit_number++;
}
else if (CHK_T2 (lowTime, ONE_TIME))
{
if (bit_number >= NUM_OF_BITS)
{
break;
}
bit_adds [bit_number]++;
bit_measures [bit_number]++;
bit_number++;
}
else
{
// to nieprawidłowy bit
break;
}
}
// jeżeli choć jeden pomiar się udał wypisuję raport
if (measure_number > 0)
{
for (int i = 0; i < NUM_OF_BITS; i++)
{
if (bit_adds[i] > (bit_measures[i] / 2))
{
bits[i] = 1;
}
else if (bit_adds[i] < (-bit_measures[i] / 2))
{
bits[i] = 0;
}
else
{
bits[i] = 2;
}
}
uint32_t nChannel = getvalue (14, 2);
uint32_t nTemp = getvalue (16, 12);
uint32_t nHumidity = getvalue (28, 8);
#ifdef DEBUG_SALAE1
if (nChannel == 1)
{
digitalWrite(DEBUG_SALAE1_PIN, HIGH);
delay(10);
digitalWrite(DEBUG_SALAE1_PIN, LOW);
}
#endif
Serial.print("Kanal: ");
if (nChannel != BAD_VALUE)
Serial.print(nChannel + 1);
else
Serial.print("???");
Serial.print (", tem: ");
if (nTemp != BAD_VALUE)
Serial.print(nTemp / 10.0);
else
Serial.print("???");
Serial.print (" *C, Wilgotnosc: ");
if (nHumidity != BAD_VALUE)
Serial.print(nHumidity);
else
Serial.print("???");
Serial.print(" %, numer: ");
Serial.println(measure_number);
Serial.print( millis());
Serial.print(" millis");
Serial.println("---------------------------------");
}
}
Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc
@jacek i @tysz dzięki wielkie, kawał świetnej roboty.
Teraz dzięki wam to i mój projekt ożyje :)
Jeszcze raz dziękuję.
Teraz dzięki wam to i mój projekt ożyje :)
Jeszcze raz dziękuję.