Pomiar temperatury / wysyłka danych RF433

Zrobiłeś coś fajnego z wykorzystaniem Arduino? Pochwal się tym!
ODPOWIEDZ
leszektg
Młodszy majsterkowicz
Posty: 15
Rejestracja: 19 sty 2013, 20:49

Pomiar temperatury / wysyłka danych RF433

Post autor: leszektg » 25 sty 2013, 16:00

Witam
To moj pierwszy projekt zrobiony na Arduino więc mile widziane komentarze i usprawnienia.
Niestety jestem nowy na tym forum wiec linków wrzucic nie mogę - później edytuje tego posta

Założenia projektu:
- w piwnicy piec CO + bojler (2 czujniki DS18B20)
- w kuchni na parterze odczyt temperatury pieca i bojlera na wyswietlaczu 2x16
- alarm powyżej temperatury 80*C
- bezprzewodowa transmisja na RF433

Nadajnik:
- Atmega328
- nadajnik RF433 podlaczony pod 18 nozka uC (arduino pin12)
- magistrala 1-wire podlaczona pod 16 nozka uC (arduino pin10)

Odbiornik: (tymczasowo do testów Arduino- pozniej Atmega328)
- lcd podlaczony pod piny 5, 6, 7, 9, 10, 11, 12
- buzzer podlaczony pod pin8

kod nadajnika:

Kod: Zaznacz cały

#include <OneWire.h>
#include <DallasTemperature.h>
#include <VirtualWire.h>

int temp0Data, temp1Data;
char temp0Msg[3], temp1Msg[3];
String temp0x, temp1y;


#define ONE_WIRE_BUS 10 //termometry pin10/16 nozka Atmega328
 
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
int numberOfSensors = 2; // liczba czujników DS18B20
 
void setup(void)
{
  vw_set_ptt_inverted(true); // ustawienia dla RF433
  vw_setup(2000);            // predkosc transmisji 2000 bps
  // nadajnik podlaczony pod pin 12/18 nozka Atmega328
  // jesli chcemy inny pin to: vw_set_tx_pin(transmit_pin)
  
  
  sensors.begin();          // ustawienia dla DS18B20
  delay(5000); 
}
 
void loop(void)
{

  sensors.requestTemperatures(); 
  temp0Data = ( sensors.getTempCByIndex(0) );
  temp1Data = ( sensors.getTempCByIndex(1) );
  //pobiera temperature z 2 czujników
  
  String temp0String(temp0Data, DEC); 
  String temp1String(temp1Data, DEC);
  // zamienia int na String
 
  String tempMessage = temp0String + temp1String;
  // lączy dwa pomiary temperatury w jeden String
  // tak zeby bylo można wysłać wszystko jedna wiadomością 
  
  tempMessage.toCharArray(temp0Msg,(tempMessage.length()+1));
  // zamiana String na CharArray
   
 vw_send((uint8_t *)temp0Msg, strlen(temp0Msg)); // wysyla CharArray przez RF433
 vw_wait_tx(); // czeka do konca transmisji
 delay(100);
  
}
 
kod odbiornika:

Kod: Zaznacz cały

#include <VirtualWire.h>
#include <LiquidCrystal.h>


int buzzer = 8;
float Time1, Time2;
LiquidCrystal lcd(5, 6, 7, 9, 10, 11, 12);
int buttonState = 0; 


// Sensors 
int Bojler;
int Piec;
int alarm = 80;  //alarm powyzej 80*C
int msg1 = 0;

// RF Transmission container
char Sensor1CharMsg[4]; 
char Sensor2CharMsg[4]; 
char BojlerX[2];
char PiecX[2];

//tablica znaków 
byte aa[8] = {
    B00000,
    B00100,
    B00100,
    B00100,
    B00100,
    B00100,
    B00100,
    B00000
  };
  
  byte bb[8] = {
    B00000,
    B00001,
    B00010,
    B00100,
    B01000,
    B10000,
    B00000,
    B00000
  };

  byte cc[8] = {
    B00000,
    B00000,
    B00000,
    B11111,
    B00000,
    B00000,
    B00000,
    B00000
  };

byte dd[8] = {
    B00000,
    B10000,
    B01000,
    B00100,
    B00010,
    B00001,
    B00000,
    B00000
  };
  

void setup() {
  
  pinMode(buzzer, OUTPUT);
    
  lcd.clear();
  lcd.begin(2, 16);
  lcd.createChar(0, aa);
  lcd.createChar(1, bb);
  lcd.createChar(2, cc);
  lcd.createChar(3, dd);

    // VirtualWire 
    vw_set_rx_pin(2);
    // Initialise the IO and ISR
    // Required for DR3100
    // vw_set_ptt_inverted(true); 
    // Bits per sec
    vw_setup(2000);	 
    
    // Start the receiver PLL running
    vw_rx_start();       

} // END void setup

void loop(){
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = 4; //VW_MAX_MESSAGE_LEN;
    vw_wait_rx();
    if (vw_get_message(buf, &buflen)) 
    {
	int i;
        for (i = 0; i < buflen; i++)
	{            
          Sensor1CharMsg[i] = char(buf[i]);
	}
        BojlerX[0] = char (Sensor1CharMsg[2]);
        BojlerX[1] = char (Sensor1CharMsg[3]);
        PiecX[0] = char (Sensor1CharMsg[0]);
        PiecX[1] = char (Sensor1CharMsg[1]);
        //zmiana CharArray na String
        
        Bojler = atoi(BojlerX);
        Piec = atoi(PiecX);
        //zmaiana String na int
               
    }
    
        lcd.setCursor(0,0);
        lcd.print("Bojler = ");
        lcd.print(Bojler);
        lcd.write(0xDF),lcd.write('C');
        
        lcd.setCursor(15,0);
        lcd.write(msg1);
         
        lcd.setCursor(0,1);
        lcd.print("Piec   = ");
        lcd.print(Piec);
        lcd.write(0xDF),lcd.write('C');
        
        lcd.setCursor(15,1);
        lcd.write(msg1);
        
        if (msg1 <= 2){
        msg1 == msg1++;
        }
        else {
          msg1 = 0;}
     
        if (Piec >= alarm)//właczenie alarmu wysokiej temperatury
        {
          digitalWrite(buzzer, 1);   
          delay(200);               
          digitalWrite(buzzer, 0);    
        }          
      
    int k;//czyszczenie tablicy znaków
    for (k = 0; k < 4; k++)
    {
      Sensor1CharMsg[k] = 0;
    }
    int l;
    for (l = 0; l < 2; l++)
    {
      BojlerX[l] = 0;
      PiecX[l] = 0;
    }
     
                
 }
    
Jesli ktoś ma jakieś pytania, komentarze lub pomysly usprawnienia - podzielcie sie ze mną

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


Artur
Młodszy majsterkowicz
Posty: 11
Rejestracja: 11 kwie 2013, 19:59
Lokalizacja: Opole

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: Artur » 16 paź 2013, 20:03

Super sprawa. Spróbuje to złożyć i wtedy dam znać co by można zmienić.
jack5
Młodszy majsterkowicz
Posty: 15
Rejestracja: 7 kwie 2014, 17:08

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: jack5 » 18 maja 2014, 17:08

sprawdzalem to i cos nie dziala mi nic sie nie wyswietla na wyswietlaczu, mozesz pokazac jak podlaczyles wszystko
pablo7890
Młodszy majsterkowicz
Posty: 12
Rejestracja: 5 cze 2014, 20:02

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: pablo7890 » 5 cze 2014, 20:10

Witam serdecznie.
Od pewnego czasu myślę nad podobnym systemem. Jednak chciałbym, by czujników było kilka - w różnych miejscach domu, za czym idzie, każdy by miał swoją atmegę i nadajnik. Czy odbiornik - powiedzmy oparty na arduino - jest w stanie odbierać dane od kilku nadajników? Jak to by miało działać? Jeśli nie, w jaki sposób mogę zrealizować coś takiego?
Dopiero zaczynam pracę z elektroniką, stąd te pytania. Z góry dziękuję za pomoc!! :)
Awatar użytkownika
menhiLs
Majsterkowicz
Posty: 71
Rejestracja: 25 lis 2013, 18:20
Lokalizacja: Lubliniec

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: menhiLs » 5 cze 2014, 23:58

Na tej stronie w kroku 4 jest jeden nadajnik i kilka odbiorników.
Może się przyda http://www.instructables.com/id/RF-3154 ... /?ALLSTEPS
stiven
Złota rączka
Posty: 1587
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: stiven » 6 cze 2014, 10:52

Chodzi o sytuację odwrotną, jeden odbiornik, kilka nadajników. Też poszukuje informacji jak to zrobić
Awatar użytkownika
macin
Majsterkowicz
Posty: 192
Rejestracja: 1 lip 2012, 11:24
Lokalizacja: Bydgoszcz

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: macin » 6 cze 2014, 14:36

Ciekawy jest tu projekt wykorzystania RF433.
jack5
Młodszy majsterkowicz
Posty: 15
Rejestracja: 7 kwie 2014, 17:08

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: jack5 » 19 cze 2014, 12:23

projekt autora u mnie dziala, ale chcialem tez zrobic wysylanie pomiaru z dwoch nadajnikow i wystarczy ze podlacze do zasilania drugi nadajnik a juz komunikacja miedzy 1 nadajnikiem zostaje przerwana
darrrrek
Młodszy majsterkowicz
Posty: 7
Rejestracja: 19 cze 2014, 22:10

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: darrrrek » 19 cze 2014, 22:31

Jaki zasięg udało się uzyskać pomiędzy odbiornikiem a nadajnikiem ?? testowałeś może ??
jack5
Młodszy majsterkowicz
Posty: 15
Rejestracja: 7 kwie 2014, 17:08

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: jack5 » 20 cze 2014, 10:59

NIe testowalem, ale tam gdzie chce zeby byl umieszczony nadajnik czyli w domu w piwnicy i odbiornik na gorze w kuchni to zasieg jest, oczywiscie z wlutowanymi kabelkami po 10cm
Rafik89
Młodszy majsterkowicz
Posty: 4
Rejestracja: 24 cze 2014, 00:49

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: Rafik89 » 24 cze 2014, 00:56

A czy kolega próbował może takiej transmisji na nRF24L01?

W planach mam właśnie wykonanie 3 nadajników, jeden mierzył by temperaturę na zewnątrz, wilgotność, jasność
a pozostałe 2 umiejscowione były by w domu i mierzyły jedynie temperaturę. Transmisja po nRF24L01, jako odbiornik również arduino a później sama Atmega wraz ENC28J60 i podłączenie pod sieć domową, jako serwer działa Terminal HP który pobierał by dane prosto z sieci w formie danych tekstowych, a serwer www wraz z PHP zajmował by się zbieraniem i obrabianiem informacji.
ttyr
Młodszy majsterkowicz
Posty: 4
Rejestracja: 8 lut 2015, 00:53

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: ttyr » 12 lut 2015, 23:43

Bardzo pomysłowe rozwiązanie!
Kolego Leszektg, czy mógłbyś wynik równolegle wyświetlić na LCD i na monitorze portu szeregowego?
W moim bliźniaczo podobnym projekcie nie działa taka konfiguracja. Proszę o info czy działa to w tej konfiguracji:)

ps. Arduino pro mini w Chinach - cena mniej niż 2$ - idealne do takich zastosowań.
edek83
Młodszy majsterkowicz
Posty: 1
Rejestracja: 2 kwie 2015, 22:03

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: edek83 » 2 kwie 2015, 22:15

Witam.
Fajny projekt, ale był by bardzo fajny gdyby działał jak należny :)
Jak jest ktoś mądry to fajnie by było poprawić. Ja spędziłem pół dnia i mi się nie udało.
Problem jest w tym że temp. pieca jest zdublowana i wyświetla się też przy temp. bojlera.
fotoraj
Młodszy majsterkowicz
Posty: 1
Rejestracja: 22 kwie 2016, 12:02
Lokalizacja: Borris, Dania

Re: Pomiar temperatury / wysyłka danych RF433

Post autor: fotoraj » 22 kwie 2016, 12:33

Też nad tym trochę siedziałem. Mi natomiast zależy na opomiarawaniu całego pieca tzn. ciepła woda, zimna woda, centralne ogrzewanie: powrót i zasilanie oraz czas grzania kotła gazowego.

Wpisz tylko prawidłowe piny:
vw_set_rx_pin(2);
LiquidCrystal lcd(5, 6, 7, 9, 10, 11, 12);
int buzzer = 2;

Błąd był w kodzie odbiornika.
Teraz kod działa poprawnie:

#include <VirtualWire.h>
#include <LiquidCrystal.h>

int buzzer = 2;
LiquidCrystal lcd(5, 6, 7, 9, 10, 11, 12);

// Sensors
int Bojler;
int Piec;
int alarm = 80; //alarm powyzej 80*C
int msg1 = 0;

// RF Transmission container
char Sensor1CharMsg[4];
char Sensor2CharMsg[4];
char BojlerX[4];
char PiecX[4];

//tablica znaków
byte aa[8] = {
B00000,
B00100,
B00100,
B00100,
B00100,
B00100,
B00100,
B00000
};

byte bb[8] = {
B00000,
B00001,
B00010,
B00100,
B01000,
B10000,
B00000,
B00000
};

byte cc[8] = {
B00000,
B00000,
B00000,
B11111,
B00000,
B00000,
B00000,
B00000
};

byte dd[8] = {
B00000,
B10000,
B01000,
B00100,
B00010,
B00001,
B00000,
B00000
};

byte stopien[8] =
{
B01100,
B10010,
B10010,
B01100,
B00000,
B00000,
B00000,
B00000
};


void setup() {

pinMode(buzzer, OUTPUT);

lcd.clear();
lcd.begin(2, 16);
lcd.createChar(0, aa);
lcd.createChar(1, bb);
lcd.createChar(2, cc);
lcd.createChar(3, dd);
lcd.createChar(4,stopien);

// VirtualWire
vw_set_rx_pin(2);

// Initialise the IO and ISR
// Required for DR3100
// vw_set_ptt_inverted(true);
// Bits per sec
vw_setup(2000);

// Start the receiver PLL running
vw_rx_start();

} // END void setup

void loop(){
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = 4; //VW_MAX_MESSAGE_LEN;
vw_wait_rx();
if (vw_get_message(buf, &buflen))
{
int i;
for (i = 0; i < buflen; i++)
{
Sensor1CharMsg = char(buf);
}
PiecX[0] = char (Sensor1CharMsg[0]);
PiecX[1] = char (Sensor1CharMsg[1]);
BojlerX[0] = char (Sensor1CharMsg[2]);
BojlerX[1] = char (Sensor1CharMsg[3]);

//zmiana CharArray na String

Bojler = atoi(BojlerX);
Piec = atoi(PiecX);
//zmaiana String na int

}

lcd.setCursor(0,0);
lcd.print("Bojler ");
lcd.print(Bojler);
lcd.write(4);

lcd.setCursor(15,0);
lcd.write(msg1);

lcd.setCursor(0,1);
lcd.print("Piec ");
lcd.print(Piec);
lcd.write(4);

lcd.setCursor(15,1);
lcd.write(msg1);

if (msg1 <= 2){
msg1 == msg1++;
}
else {
msg1 = 0;}

if (Piec >= alarm)//właczenie alarmu wysokiej temperatury
{
digitalWrite(buzzer, 1);
delay(200);
digitalWrite(buzzer, 0);
}

int k;//czyszczenie tablicy znaków
for (k = 0; k < 4; k++)
{
Sensor1CharMsg[k] = 0;
}
int l;
for (l = 0; l < 2; l++)
{
BojlerX[l] = 0;
PiecX[l] = 0;
}


}
ODPOWIEDZ

Strony partnerskie: