Arduino i bezprzewodowy czujnik temperatury i wilgotności

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Awatar użytkownika
jacek
Młodszy majsterkowicz
Posty: 47
Rejestracja: 28 mar 2013, 22:17
Kontakt:

Arduino i bezprzewodowy czujnik temperatury i wilgotności

Post autor: jacek » 28 mar 2013, 22:22

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

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


shymon
Majsterkowicz
Posty: 139
Rejestracja: 6 paź 2012, 20:27

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: shymon » 30 mar 2013, 12:19

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.
Awatar użytkownika
jacek
Młodszy majsterkowicz
Posty: 47
Rejestracja: 28 mar 2013, 22:17
Kontakt:

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: jacek » 30 mar 2013, 13:40

Hmmm, może jest tak jak piszesz, że producent zadbał, ale:
  • 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
pozdrawiam
Jacek
Awatar użytkownika
jacek
Młodszy majsterkowicz
Posty: 47
Rejestracja: 28 mar 2013, 22:17
Kontakt:

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: jacek » 30 kwie 2013, 14:21

shymon pisze:... Do pracy z Arduino tego raczej nie zmusisz, producent na pewno zadbał o odpowiednie kodowanie sygnału.
Wczoraj w nocy to "rozkodowałem" wstępnie. Sonda wysyła 37 bitów:
  • 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
Te 37 bitów jest wysyłanych 6 razy w czasie niecałej sekundy.

Jak skończę to się pochwalę projektem :)
pozdrawiam
Jacek
Goblin
Młodszy majsterkowicz
Posty: 7
Rejestracja: 29 mar 2013, 18:35

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: Goblin » 30 kwie 2013, 18:04

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ą.
Awatar użytkownika
Maxik
Starszy majsterkowicz
Posty: 405
Rejestracja: 6 lip 2012, 18:27
Lokalizacja: Gdańsk
Kontakt:

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: Maxik » 1 maja 2013, 00:18

Sprawdź czy ten ostatni bit to nie jest bit parzystości: http://pl.wikipedia.org/wiki/Kontrola_parzysto%C5%9Bci
Awatar użytkownika
jacek
Młodszy majsterkowicz
Posty: 47
Rejestracja: 28 mar 2013, 22:17
Kontakt:

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: jacek » 1 maja 2013, 00:41

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ą.
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.
pozdrawiam
Jacek
Awatar użytkownika
jacek
Młodszy majsterkowicz
Posty: 47
Rejestracja: 28 mar 2013, 22:17
Kontakt:

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: jacek » 1 maja 2013, 00:42

Maxik pisze:Sprawdź czy ten ostatni bit to nie jest bit parzystości: http://pl.wikipedia.org/wiki/Kontrola_parzysto%C5%9Bci
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.
pozdrawiam
Jacek
bigkoma
Młodszy majsterkowicz
Posty: 2
Rejestracja: 30 gru 2014, 23:31

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: bigkoma » 30 gru 2014, 23:39

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ą).
Awatar użytkownika
jacek
Młodszy majsterkowicz
Posty: 47
Rejestracja: 28 mar 2013, 22:17
Kontakt:

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: jacek » 30 gru 2014, 23:45

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
pozdrawiam
Jacek
Tysz
Młodszy majsterkowicz
Posty: 10
Rejestracja: 13 gru 2014, 11:53

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: Tysz » 4 sty 2015, 16:49

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

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("---------------------------------");
  }  
}
bigkoma
Młodszy majsterkowicz
Posty: 2
Rejestracja: 30 gru 2014, 23:31

Re: Arduino i bezprzewodowy czujnik temperatury i wilgotnośc

Post autor: bigkoma » 4 sty 2015, 22:17

@jacek i @tysz dzięki wielkie, kawał świetnej roboty.
Teraz dzięki wam to i mój projekt ożyje :)

Jeszcze raz dziękuję.
ODPOWIEDZ

Strony partnerskie: