Witam !
Jakiś czas temu chcąc zabezpieczyć dom przed pożarem (oprócz czujek dymu) wykonałem 8 szt nadajników 433 z DS18B20 rozmieszczonych w różnych punktach (4 na strychu i 4 w domu) oraz odbiornik, który alarmuje, kiedy przekroczone są ustawione temperatury (tem9 - strych, tem10 - dom). W związku z tym, że w domu mam drugą instalację na 12V to nadajniki zasilam z tego napięcia. Odbiornik powiadamia mnie również poprzez dodatkowy moduł na telefon (Pushover). Program w nadajnikach działa tak, że po wysłaniu wartości temperatury "zasypia" (czas można ustawić). Można się pobawić i spróbować zasilania z aku lub baterii. Nadajniki i odbiornik jest na arduino nano. Nadajniki zamknąłem w małych obudowach (fotka) a odbiornik mam w "szafie sterowniczej". Dołączam kody : nadajnika-1 oraz odbiornika.
Code: Select all
//NADAJNIK
//DS18B20 - pin 2
//TX433 - pin 12
#include <VirtualWire.h>
float temp;
char dataString [7];
const int led_pin = 13;
// Sleep
#include <avr/sleep.h>
#include <avr/power.h>
// Watchdog timer
#include <avr/wdt.h>
// Thermometer
#include <OneWire.h>
#include <DallasTemperature.h>
// -- Global variables --
volatile int f_wdt = 1;
int counter = 0;
int packetCounter = 0;
OneWire oneWire(2);
DallasTemperature sensors(&oneWire);
// -- Functions --
void counterHandler()
{
// Increment the sleep counter
counter++;
// Should be 75 for 10 minutes (75 * 8 = 600 seconds = 10 minutes)
// Use 1 for debugging purposes
if(counter == 1) {
// Reset the counter to 0
counter = 0;
// Power up components
power_all_enable();
} else {
// Sleep time isn't over yet, sleep some more
enterSleep();
}
}
void enterSleep()
{
// Start the watchdog timer
f_wdt = 0;
// Enter sleep
sleep_enable();
sleep_mode();
// Wake from sleep
sleep_disable();
// Increment the interrupt counter
counterHandler();
}
ISR(WDT_vect)
{
// Stop the watchdog timer
f_wdt = 1;
}
void setupWDT()
{
// Setup the Watchdog timer for an interruption every 8 seconds
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 1<<WDP0 | 1<<WDP3;
WDTCSR |= _BV(WDIE);
}
void setupThermometer()
{
// Initiate the sensor interface
sensors.begin();
// Set the bit resolution to 10 for fast conversion times (9 - 12)
sensors.setResolution(9);
}
void setup()
{
// Disable Brown out detection (uses power)
sleep_bod_disable();
// Sleep mode setup
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// Watchdog timer setup
setupWDT();
// Thermometer setup
setupThermometer();
vw_set_tx_pin(12); // Ustawia pin D12 jako pin TX
vw_setup(2000); // Ustawia ile ma być bitów na sekundę
pinMode(led_pin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
// Request the sensors temperatures
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
int temp1 = (temp-(int)temp)*100;
sprintf(dataString, "1%2d.%1d",int(temp),temp1);
//kolejne nadajniki - zmienic pierwszy znak ciagu na 2...3 itd
digitalWrite(led_pin, HIGH);
vw_send((uint8_t *)dataString, strlen(dataString));
vw_wait_tx();
vw_send((uint8_t *)dataString, strlen(dataString));
vw_wait_tx();
delay(200);
digitalWrite(led_pin, LOW);
// Sleep time
enterSleep();
}
I odbiornik
Code: Select all
//odbiornik - 8 x nadajnik
//RX433 - D 2
//buzzer - D 12
//powiadomienie Pushover D 10
#include <VirtualWire.h>
//#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
const int led_pin = 13;
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);
byte newChar[8] = {B11100, B10100, B11100, B00000, B00000, B00000, B00000, B00000};
// definiujemy znak stopnia w celu wyświetlenia na lcd
int i;
String tem0;
float tem1;
float tem2;
float tem3;
float tem4;
float tem5;
float tem6;
float tem7;
float tem8;
float tem9 = 53;
float tem10 = 40;
int a=0;
void setup()
{
Serial.begin(9600);
pinMode(10, OUTPUT);//Pushover
digitalWrite(10, LOW);
pinMode(12, OUTPUT);//sygnal dzwiekowy
digitalWrite(12, LOW);
lcd.begin (20,4);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
lcd.createChar(1, newChar); // przypisanie wcześniej zdefiniowanego znaku do 0
lcd.home ();
pinMode(led_pin, OUTPUT);
vw_setup(2000);
vw_set_rx_pin(2);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
//---------------- nadajnik 1 --------------------------
if ((char) buf[0]=='1'){
tem0 = "";
for (i = 1; i < 5; i++)
{ tem0 +=char(buf[i]); }
tem1=0;
tem1 = (tem0.toFloat());
lcd.setCursor(1, 0);
lcd.print (" ");
digitalWrite(led_pin, HIGH);
delay(500);
lcd.setCursor(0, 0);
lcd.print("1:");
lcd.setCursor(2, 0);
lcd.print (tem1);
lcd.write(1); //znak stopnia
digitalWrite(led_pin, LOW);
}
//---------------- nadajnik 2 --------------------------
if ((char) buf[0]=='2'){
tem0 = "";
for (i = 1; i < 5; i++)
{ tem0 +=char(buf[i]); }
tem2=0;
tem2 = (tem0.toFloat());
lcd.setCursor(1, 1);
lcd.print (" ");
digitalWrite(led_pin, HIGH);
delay(500);
lcd.setCursor(0, 1);
lcd.print("2:");
lcd.setCursor(2, 1);
lcd.print (tem2);
lcd.write(1); //znak stopnia
digitalWrite(led_pin, LOW);
}
//---------------- nadajnik 3 --------------------------
if ((char) buf[0]=='3'){
tem0 = "";
for (i = 1; i < 5; i++)
{ tem0 +=char(buf[i]); }
tem3=0;
tem3 = (tem0.toFloat());
lcd.setCursor(1, 2);
lcd.print (" ");
digitalWrite(led_pin, HIGH);
delay(500);
lcd.setCursor(0, 2);
lcd.print("3:");
lcd.setCursor(2, 2);
lcd.print (tem3);
lcd.write(1); //znak stopnia
digitalWrite(led_pin, LOW);
}
//---------------- nadajnik 4 --------------------------
if ((char) buf[0]=='4'){
tem0 = "";
for (i = 1; i < 5; i++)
{ tem0 +=char(buf[i]); }
tem4=0;
tem4 = (tem0.toFloat());
lcd.setCursor(1, 3);
lcd.print (" ");
digitalWrite(led_pin, HIGH);
delay(500);
lcd.setCursor(0, 3);
lcd.print("4:");
lcd.setCursor(2, 3);
lcd.print (tem4);
lcd.write(1); //znak stopnia
digitalWrite(led_pin, LOW);
}
//---------------- nadajnik 5 --------------------------
if ((char) buf[0]=='5'){
tem0 = "";
for (i = 1; i < 5; i++)
{ tem0 +=char(buf[i]); }
tem5=0;
tem5 = (tem0.toFloat());
lcd.setCursor(10, 0);
lcd.print (" ");
digitalWrite(led_pin, HIGH);
delay(500);
lcd.setCursor(9, 0);
lcd.print("5:");
lcd.setCursor(11, 0);
lcd.print (tem5);
lcd.write(1); //znak stopnia
digitalWrite(led_pin, LOW);
}
//---------------- nadajnik 6 --------------------------
if ((char) buf[0]=='6'){
tem0 = "";
for (i = 1; i < 5; i++)
{ tem0 +=char(buf[i]); }
tem6=0;
tem6 = (tem0.toFloat());
lcd.setCursor(10, 1);
lcd.print (" ");
digitalWrite(led_pin, HIGH);
delay(500);
lcd.setCursor(9, 1);
lcd.print("6:");
lcd.setCursor(11, 1);
lcd.print (tem6);
lcd.write(1); //znak stopnia
digitalWrite(led_pin, LOW);
}
//---------------- nadajnik 7 --------------------------
if ((char) buf[0]=='7'){
tem0 = "";
for (i = 1; i < 5; i++)
{ tem0 +=char(buf[i]); }
tem7=0;
tem7 = (tem0.toFloat());
lcd.setCursor(10, 2);
lcd.print (" ");
digitalWrite(led_pin, HIGH);
delay(500);
lcd.setCursor(9, 2);
lcd.print("7:");
lcd.setCursor(11, 2);
lcd.print (tem7);
lcd.write(1); //znak stopnia
digitalWrite(led_pin, LOW);
}
//---------------- nadajnik 8 --------------------------
if ((char) buf[0]=='8'){
tem0 = "";
for (i = 1; i < 5; i++)
{ tem0 +=char(buf[i]); }
tem8=0;
tem8 = (tem0.toFloat());
lcd.setCursor(10, 3);
lcd.print (" ");
digitalWrite(led_pin, HIGH);
delay(500);
lcd.setCursor(9, 3);
lcd.print("8:");
lcd.setCursor(11, 3);
lcd.print (tem8);
lcd.write(1); //znak stopnia
digitalWrite(led_pin, LOW);
}
//---------------------------------------------
if (tem1 > tem9 | tem2 > tem9 | tem3 > tem9 | tem4 > tem9)
{
digitalWrite(10, HIGH);
for(byte i=0; i<10; i++){
digitalWrite(12, HIGH);
delay (100);
digitalWrite(12, LOW);
delay (100);
}
digitalWrite(10, LOW);
}
if (tem5 > tem10 | tem6 > tem10 | tem7 > tem10 | tem8 > tem10)
{
digitalWrite(10, HIGH);
for(byte i=0; i<10; i++){
digitalWrite(12, HIGH);
delay (100);
digitalWrite(12, LOW);
delay (100);
}
digitalWrite(10, LOW);
}
a=a+1;
if (a==40){
a=0;
lcd.clear();
}
}
}
Może się komuś przyda...
Pozdrawiam