Помогите нубу выйти из цикла отправки СМС

Тема в разделе "Arduino & Shields", создана пользователем Morandi, 29 дек 2018.

  1. Morandi

    Morandi Нуб

    Всем привет!
    В общем, в связи с отъездом появилась необходимость быть в курсе о наличии напряжения в частном доме (котел и прочее).
    Нашел на просторах форума простой датчик из зарядника и оптрона, спаял из конструктора модуль 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);
     
        }
     
  2. ELITE

    ELITE Гик

    1) это не скетч а кусок неизвестно откуда выдранного кода
    2) последний хрустальный шар разбился и в осколках мелькнула надпись " в розетке ток переменный... 100 раз в секунду он проходит через 0....(то есть исчезает)
    ----------
    хотите более внятного ответа - выкладывайте ПОЛНЫЙ код и схему устройства!
     
  3. DetSimen

    DetSimen Guest

    ТС, самое простое, чем городить оптроны с опрашиванием, поставить реле на 220, а его контакты подключить к ардуино с подтяжкой, с замыканием на землю при пропадании напряжения. Пришел ноль - 220 ищезло, нада выполнять действия.
     
  4. Morandi

    Morandi Нуб

    Код (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);
    }
    optron-ardiuino.gif
     
  5. Airbus

    Airbus Радиохулиган Модератор

    Недели две назад был подобный вопрос я отвечал.Поищи.Заведи флаг bool flag = TRUE это в начале.Отправка если flag == TRUE.Потом сразу после отправки переведи его в FALSE.Это если один раз.Если нужно изчо то через заданное время снова переводи флаг в TRUE
     
  6. Kamikadze

    Kamikadze Гик

    Если я ничего не путаю (а я не путаю) у вас чтение оптрона идет на 5 пине, а на схеме 8. Так на какой пин все таки подключен?
     
    Airbus нравится это.
  7. parovoZZ

    parovoZZ Гуру

    А если нет нагрузки, то и тока не будет при наличии напряжения.
     
  8. Airbus

    Airbus Радиохулиган Модератор

    Да там пипец код.Я еще удивляюсь что он что то шлет.У вас отправка СМС безо всяких условий вот она и лупит постоянно.Сделайте или по звонку или по изменению состояния оптотрона.И да он у Вас не туда подключен или подключите куда надо D5 или код поменяйте.И почему к плюсу подтянут?
     
    Последнее редактирование: 29 дек 2018
  9. Morandi

    Morandi Нуб

    оптрон на 5-м пине
    я делал по схеме, выложеной то ли тут, то ли на ардуино.ру
    спасибо, сейчас просмотрю форум.
     
  10. ostrov

    ostrov Гуру

    Нужно ждать ответа от модуля и анализировать его, а не тупо пропускать 2 секунды. А потом удивляться что он то работает не так, то вообще никак.
     
  11. Airbus

    Airbus Радиохулиган Модератор

    Поправил Говнокод проверил в железе-работает но можно ещё лучше сделать сработка по изменению напряжения на оптотроне или по пришедшему звонку.Используется аппаратный 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); //ждём
        }
     
     
    DetSimen нравится это.