отправить SMS за 1 раз с arduino GPRS SIM900, если Iput ВЫСОКИЙ

Я столкнулся с проблемой отправки 1 SMS, если вход ВЫСОКИЙ, а если он НИЗКИЙ ==> не отправлять SMS, если от НИЗКОГО до ВЫСОКОГО ==> отправить 1 SMS. этот код не работает, просто отправил смс, когда я включаю GPRS, и после этого ничего не произошло.

mclopez помог мне, спасибо, но не работает :(, это новый код, который я написал с задержкой (), но та же проблема.

Спасибо за помощь заранее.

   #include <SoftwareSerial.h>
   #include "TimerOne.h"

   const int DI = 2;
   const int DT = 3;
   const int DGP1 = 4;
   const int DGP2 = 5;
   const long interval = 100000; // in microseconds

   int value1 = 0;
   int value2 = 0;
   int value3 = 0;
   int value4 = 0;

   int value1_old = 0;
   int value2_old = 0;
   int value3_old = 0;
   int value4_old = 0;

   boolean changed1 = false;
   boolean changed2 = false;
   boolean changed3 = false;
   boolean changed4 = false;

   SoftwareSerial SIM900 (7, 8);

   void SIM900power(){
     digitalWrite(9, HIGH);
     delay(1000);
     digitalWrite(9, LOW);
     delay(5000);
   }

  void initia(){
  SIM900.print("AT+CMGF=1\r");
  delay(100);
  SIM900.println("AT + CMGS = \"xxxxxxxxxx\"");
  delay(100);
  }

  void Send_SMS(){
  SIM900.println((char)26);
  delay(100);
  SIM900.println();
  delay(5000);

 }

  void isr_timer(){
    if (changed2) {
    initia();
    SIM900.println("Station 85: Defaut electrique");
    delay(100);
    Send_SMS();
    value2_old = value2;
    changed2 = false;
  }  

  if (changed3) {
    initia();
    SIM900.println("Station 85: DefautGP1");
    delay(100);
    Send_SMS();
    value3_old = value3;
    changed3 = false;
   }

   if (changed4) {
     initia();
     SIM900.println("Station 85:DD>1000");
     delay(100);
     Send_SMS();
     value4_old = value4;
     changed4 = false;
    }
 }

  void setup() {
   pinMode(DI, INPUT);
   pinMode(DT, INPUT);
   pinMode(DGP1, INPUT);
   pinMode(DGP2, INPUT);

   SIM900.begin(19200);
   Timer1.initialize(interval);
   Timer1.attachInterrupt(isr_timer);
  }

 void loop() {
   value1 = digitalRead (DI);
   value2 = digitalRead (DT);
   value3 = digitalRead (DGP1);
   value4 = digitalRead (DGP2);

   if (value1 != value1_old && value1 == HIGH) changed1 = true;
   if (value2 != value2_old && value2 == HIGH) changed2 = true;
   if (value3 != value3_old && value3 == HIGH) changed3 = true;
   if (value4 != value4_old && value4 == HIGH) changed4 = true;

   value1_old = value1;
   value2_old = value2;
   value3_old = value3;
   value4_old = value4;

 }

person Tariq Talbi    schedule 23.04.2015    source источник
comment
Привет! Вы пытались опубликовать этот вопрос в: http://arduino.stackexchange.com/   -  person insilenzio    schedule 23.04.2015
comment
Нет, не делал, выложу, спасибо   -  person Tariq Talbi    schedule 23.04.2015


Ответы (1)


Попробуйте уменьшить интервал прерывания. Возможно, из-за нескольких операторов if, запущенных под isr_timer(), основной цикл может заблокироваться. У меня есть подозрение, что вы пытаетесь сделать слишком много!

Будьте осторожны, пытаясь выполнить слишком сложное прерывание на слишком высокой частоте, иначе ЦП может никогда не войти в основной цикл, и ваша программа «заблокируется». Справочник

Сказав это и чтобы проверить, что ваш основной цикл действительно работает, почему бы не добавить простую отладку в нижней части основного loop(), чтобы мигать светодиодом на плате.

int onBoardLED = 13;

void setup()
 {
    pinMode(onBoardLED, OUTPUT);

    // And all the rest
 } 

void loop()
 {
    // Doing stuff

    if (onBoardLED == LOW) digitalWrite(ledPin, HIGH);
    else digitalWrite(ledPin, LOW);
 }

По крайней мере, тогда вы будете знать, действительно ли выполняется основной loop(). Очевидно, он запускается один раз, когда вы получаете одно SMS-сообщение, но на самом деле после этого нет другого способа сказать свое предположение ...

Если все выглядит хорошо, попробуйте добавить еще несколько флагов, просто чтобы увидеть, что выполняется, а что нет. Кроме этого предложения, я не могу найти что-то еще, но интересно узнать! Удачи

Обновить
Только что выкопал эту ссылку из моих закладок. Вы можете найти это полезным.
 — Ник Гэммон — Прерывания

person RussDunn    schedule 23.04.2015