Всем привет! В общем, в связи с отъездом появилась необходимость быть в курсе о наличии напряжения в частном доме (котел и прочее). Нашел на просторах форума простой датчик из зарядника и оптрона, спаял из конструктора модуль Neoway M590E, "слепил" из гуляющего в сети примера работы с этим модулем скетч. Он реагирует на пропажу/появления напряжения, но шлет мне эти уведомления без остановки. Пытался разобраться, и самостоятельно это исправить, но время уже поджимает, поэтому прошу у вас помощи. Вот часть скетча: Код (C++): if (optron == HIGH) { sms(String("HET TOKA!"), String("+71234567890")); digitalWrite(LEDGREEN, ON); digitalWrite(LEDRED, OFF); } else { sms(String("TOK ECTb"), String("+71234567890")); digitalWrite(LEDRED, ON); digitalWrite(LEDGREEN, OFF); }
1) это не скетч а кусок неизвестно откуда выдранного кода 2) последний хрустальный шар разбился и в осколках мелькнула надпись " в розетке ток переменный... 100 раз в секунду он проходит через 0....(то есть исчезает) ---------- хотите более внятного ответа - выкладывайте ПОЛНЫЙ код и схему устройства!
ТС, самое простое, чем городить оптроны с опрашиванием, поставить реле на 220, а его контакты подключить к ардуино с подтяжкой, с замыканием на землю при пропадании напряжения. Пришел ноль - 220 ищезло, нада выполнять действия.
Код (C++): #include <SoftwareSerial.h> SoftwareSerial mySerial(D2, D3); // RX, TX #define LEDGREEN D7 #define LEDRED D6 #define OPTRON D5 #define ON LOW #define OFF HIGH int ch = 0; String val = ""; void setup() { delay(2000); //время на инициализацию модуля Serial.begin(9600); //скорость порта Serial.println("GSM tester v1.0"); mySerial.begin(9600); mySerial.println("AT+CLIP=1"); //включаем АОН delay(100); mySerial.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.) delay(100); mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); pinMode(OPTRON, INPUT); pinMode(LEDRED, OUTPUT); pinMode(LEDGREEN, OUTPUT); digitalWrite(LEDRED, OFF); digitalWrite(LEDGREEN, OFF); } void loop() { if (mySerial.available()) { //если GSM модуль что-то послал нам, то while (mySerial.available()) { //сохраняем входную строку в переменную val ch = mySerial.read(); val += char(ch); delay(10); } if (val.indexOf("RING") > -1) { //если звонок обнаружен, то проверяем номер if (val.indexOf("71234567890") > -1) { //если номер звонящего наш. Укажите свой номер без "+" Serial.println("--- MASTER RING DETECTED ---"); mySerial.println("ATH0"); //разрываем связь } } else Serial.println(val); //печатаем в монитор порта пришедшую строку val = ""; } if (Serial.available()) { //если в мониторе порта ввели что-то while (Serial.available()) { //сохраняем строку в переменную val ch = Serial.read(); val += char(ch); delay(10); } mySerial.println(val); //передача всех команд, набранных в мониторе порта в GSM модуль val = ""; //очищаем } //условие для отправки смс if (OPTRON == HIGH) { sms(String("HET TOKA!"), String("+71234567890")); //отправляем СМС на номер +71234567890 digitalWrite(LEDGREEN, ON); //включаем светодиод digitalWrite(LEDRED, OFF); delay(2000); } else { sms(String("TOK ECTb"), String("+71234567890")); digitalWrite(LEDRED, ON); digitalWrite(LEDGREEN, OFF); delay(1000); } } void sms(String text, String phone) //процедура отправки СМС { Serial.println("SMS send started"); mySerial.println("AT+CMGS=\"" + phone + "\""); delay(500); mySerial.print(text); delay(500); mySerial.print((char)26); delay(500); Serial.println("SMS send complete"); delay(2000); }
Недели две назад был подобный вопрос я отвечал.Поищи.Заведи флаг bool flag = TRUE это в начале.Отправка если flag == TRUE.Потом сразу после отправки переведи его в FALSE.Это если один раз.Если нужно изчо то через заданное время снова переводи флаг в TRUE
Если я ничего не путаю (а я не путаю) у вас чтение оптрона идет на 5 пине, а на схеме 8. Так на какой пин все таки подключен?
Да там пипец код.Я еще удивляюсь что он что то шлет.У вас отправка СМС безо всяких условий вот она и лупит постоянно.Сделайте или по звонку или по изменению состояния оптотрона.И да он у Вас не туда подключен или подключите куда надо D5 или код поменяйте.И почему к плюсу подтянут?
оптрон на 5-м пине я делал по схеме, выложеной то ли тут, то ли на ардуино.ру спасибо, сейчас просмотрю форум.
Нужно ждать ответа от модуля и анализировать его, а не тупо пропускать 2 секунды. А потом удивляться что он то работает не так, то вообще никак.
Поправил Говнокод проверил в железе-работает но можно ещё лучше сделать сработка по изменению напряжения на оптотроне или по пришедшему звонку.Используется аппаратный Serial. Код (C++): int LEDGREEN=7; int LEDRED=6; int OPTRON=5; boolean stat = false; //флаг отправки СМС int ch = 0; String val = ""; void setup() { delay(5000); //время на инициализацию модуля Serial.begin(9600); //скорость порта Serial.println("AT+CLIP=1"); //включаем АОН delay(100); Serial.println("AT+CMGF=1"); //режим кодировки СМС PDU delay(100); pinMode(OPTRON, INPUT); pinMode(LEDRED, OUTPUT); pinMode(LEDGREEN, OUTPUT); digitalWrite(LEDRED, LOW); digitalWrite(LEDGREEN, LOW); stat = true;//контрольная отправка СМС } void loop() { if (Serial.available()) { //если GSM модуль что-то послал нам, то while (Serial.available()) { //сохраняем входную строку в переменную val ch = Serial.read(); val += char(ch); delay(10); } if (val.indexOf("RING") > -1) { //если звонок обнаружен, то проверяем номер if (val.indexOf("71234567890") > -1) { //если номер звонящего наш. Укажите свой номер без "+" Serial.println("ATH0"); //разрываем связь stat = true;//установим флаг отправки } } else Serial.println(val); //печатаем в монитор порта пришедшую строку val = ""; } //условие для отправки смс if (stat) { if (digitalRead(OPTRON)==HIGH){ sms(String("HET TOKA!"), String("+71234567890")); //отправляем СМС digitalWrite(LEDGREEN, HIGH); //включаем светодиод digitalWrite(LEDRED, LOW); //выключаем светодиод delay(500); } else { sms(String("TOK ECTb"), String("+71234567890")); //отправляем СМС digitalWrite(LEDRED, HIGH); //включаем светодиод digitalWrite(LEDGREEN, LOW); //выключаем светодиод delay(500); } } } void sms(String text, String phone) //процедура отправки СМС { Serial.println("AT+CMGS=\"" + phone + "\""); delay(100); Serial.print(text); delay(100); Serial.print((char)26); delay(100); stat = false;//сбросим флаг delay(2000); //ждём }