Мониторинг загородного дома
- Войдите на сайт для отправки комментариев
Ср, 06/12/2017 - 13:58
Всем привет.
Подскажите из чего будет оптимально сделать мониторинг загородного дома.
Следим за температурой с двух датчиков, автономное питание на случай отключения основного, и оповещение о отключении питания.
Основной канал связи СМС. На будущее GPRS/
если есть то покажите подобный проект.
Спасибо.
вот тут как я сделал, код ниже
http://www.yaplakal.com/forum46/topic1551776.html?hl=
#include <SoftwareSerial.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 //ds18b20 на пине D10 #define TEMPERATURE_PRECISION 9 int V220 = 12; //пин для проверки 220 вольт D12 SoftwareSerial mySerial(2, 3); // RX, TX на пинах D2,D3 int ch = 0; String val = ""; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress sensor_1, sensor_2; // Используем 2 температурных датчика String textMessage; char s[32]; unsigned long interval = 60000; // Интервал проверки состояния GPRS соединения; 60 секунд unsigned long currentMillis; unsigned long previousMillis; boolean alarm = false; unsigned long previousMillisTemp = 0; unsigned long intervalTemp = 10000; // Интервал опроса датчиков; 10 секунд int maxValue1 = 90; //t тревоги высокой температуры датчика 1 int minValue1 = 15; //t тревоги низкой температуры датчика 1 int maxValue2 = 45; //t тревоги высокой температуры датчика 1 int minValue2 = 5; //t тревоги низкой температуры датчика 2 String V220Good; String Phone = "79000000000"; //свой телефон, без + String Phones = "+79000000000"; //свой телефон c +7 void setup() { pinMode(V220, INPUT); previousMillis=millis(); sensors.begin(); if (!sensors.getAddress(sensor_1, 0)) {}; if (!sensors.getAddress(sensor_2, 1)) {}; delay(10000); //время на инициализацию модуля Serial.begin(9600); //скорость порта mySerial.begin(115200); delay(100); mySerial.println("AT+IPR=9600"); //меняем скорость delay(100); mySerial.begin(9600); delay(100); mySerial.println("AT+CLIP=1"); //включаем АОН delay(100); mySerial.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.) delay(100); mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); } void loop() { currentMillis = millis(); // Начало отсчёта 60 сек. if (mySerial.available()) { //если GSM модуль что-то послал нам, то while (mySerial.available()) { //сохраняем входную строку в переменную val ch = mySerial.read(); val += char(ch); delay(10); } if (val.indexOf("RING") > -1) { //если звонок обнаружен, то проверяем номер if (val.indexOf(Phone) > -1) //если наш телефон то: { mySerial.println("ATH0"); //разрываем связь sensors.requestTemperatures(); //проверяем температуру float t0 = sensors.getTempC(sensor_1); float t1 = sensors.getTempC(sensor_2); if (digitalRead(V220) == HIGH) { //проверяем есть ли 220В V220Good="220 - OK"; alarm=false; }else { V220Good="220 - OFF"; alarm=true; } sms(0, V220Good, t0, t1, Phones,false); //отправляем СМС val = ""; } else //Если телефон не наш - просто рвем связь { mySerial.println("ATH0"); //разрываем связь val = ""; } } else val = ""; } // Считываем показания датчиков температуры if(currentMillis - previousMillisTemp > intervalTemp) { previousMillisTemp = currentMillis; if (digitalRead(V220) == HIGH) { V220Good="220 - OK"; }else { V220Good="220 - OFF"; } sensors.requestTemperatures(); float t0 = sensors.getTempC(sensor_1); float t1 = sensors.getTempC(sensor_2); if(((t0 > maxValue1)||(t1 > maxValue2)||(t0 < minValue1)||(t1 < minValue2)||((digitalRead(V220) == LOW)))&& !alarm) { sms(1,V220Good,t0,t1, Phones,true); } if(((t0 < maxValue1)&&(t1 < maxValue2)&&(t0 > minValue1)&&(t1 > minValue2)&&(digitalRead(V220) == HIGH)) && alarm) { sms(2,V220Good,t0,t1, Phones,false); } } } void sms(int flag, String V220X, float temp1, float temp2, String phone, boolean param) //процедура отправки СМС { if(flag == 0) { textMessage = "Temperature: "; alarm = false; } if(flag == 1) { textMessage = "Alarm! "; alarm = true; } if(flag == 2) { textMessage = "Vse OK: "; alarm = false; } textMessage += ((char)13); textMessage += "Otoplenie = "; textMessage += dtostrf(temp1, 2, 2, s); textMessage += "; "; textMessage += ((char)13); textMessage += "Pomeshenie = "; textMessage += dtostrf(temp2, 2, 2, s); textMessage += ((char)13); textMessage +=V220X; alarm = param; mySerial.println("AT+CMGS=\"" + phone + "\""); delay(1000); mySerial.print(textMessage); delay(1000); mySerial.print((char)26); delay(1000); Serial.print("sendsms"); mySerial.println("T+CMGD=4"); delay(1000); }У меня уже были в наличии: Китайский клон Arduino nano, пара датчиков температуры DS18B20, и DC-DC преобразователи на 1,5 ампера
(все куплено на алиэкспресс)
Заказал у китайцев еще sim-модуль (Sim-800) - как на фото,
нашел старый СКАТ (это ИБП на 12 вольт, используется в видеонаблюдении или охранно-пожарных сигнализациях).
Что имеем в результате: Получаем СМС в случае если температура в доме пала ниже 5 градусов
или температура батарей упала ниже 20 градусов или если пропало напряжение в сети.
Если все нормализовалось - тоже приходят СМС.
Ну и можно просто сделать дозвон на это чудо техники, оно збросит вызов и вышлет СМС с текущими показаниями температуры.
Все звонки с чужих номеров он тоже сбрасывает (вот куда девать симки по которым звонят коллекторы можно:=) ).
Премного благодарен)
Спасибо. Ты настоящий друг.
Злой Вы сегодня.
На амперке есть подобный проект. Мониторинг, управление отоплением и охрана.
http://forum.amperka.ru/threads/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%...
Моё устройство при входящем звонке с чужого номера поднимает трубку. Пусть спаммер послушает тишину несколько минут. И заплатит за это.