Цикл while и отправка смс

ARM
Offline
Зарегистрирован: 25.03.2016

Доброго времени суток. Столкнулся с проблемой при отправке смс с модулем Neoway.

написал код чтобы отправлялось смс по событию, но программа висит в цикле while и из за этого не грузится остальная часть прошивки. Подскажите пожалуйста как правильно выйти из цикла чтобы тело цикла всегда выполнялось 1 раз при заданном условии.



void setup() {
  delay(2000);
  Serial.begin(9600);
  pinMode(6, INPUT_PULLUP); 
  Serial.println("AT+CMGF=1");  
  delay(100);
  Serial.println("AT+CSCS=\"GSM\"");   
  delay(100);
 }

void loop() {
   boolean var = true;
   while(digitalRead(6) == LOW) var = true;
   delay(200);
   if (var) {
   while(1){
   Serial.println("AT+CPAS");
   if (Serial.find("0")) break;
   delay(100);}
   Serial.println("AT+CMGS=\"+700000000\""); 
   delay(100);
   Serial.print("Text");  // отправляем текст
   delay(100);
   Serial.print((char)26);  // символ завершающий передачу
   }
   while(digitalRead(6) == HIGH) var = true; 
   delay(200);
   if (var) {
   while(1){
   Serial.println("AT+CPAS");
   if (Serial.find("0")) break;
   delay(100);}
   Serial.println("AT+CMGS=\"+700000000\""); /
   delay(100);
   Serial.print("Text");  // отправляем текст
   delay(100);
   Serial.print((char)26);  // символ завершающий передачу
   
}   
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

http://arduino.ru/Reference/While

строка 16 и 29, выполнять пожизненно (как loop), а должно быть условие :)

Araris
Offline
Зарегистрирован: 09.11.2012

Здорово видеть код, написаный топикстартером самостоятельно, каким бы он ни был. 

Вынесите часть кода (17-24, она же 30-37), отправляющую СМС, в отдельную функцию. 

void loop() станет проще и короче и Вам будет легче понять, как всё должно быть на самом деле. 

ARM
Offline
Зарегистрирован: 25.03.2016

Valera19701 пишет:

http://arduino.ru/Reference/While

строка 16 и 29, выполнять пожизненно (как loop), а должно быть условие :)

"Это проверка готовости модема, если модем ответил что он готов (0), то break, а так да, будет бесконечно опрашивать модем пока он не будет готов

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

попробуйте цикл Do.. While без break а с условием

ARM
Offline
Зарегистрирован: 25.03.2016

Пробовал так,  как я знаю условие в do выполняется один раз, даже если значение в цикле ложно, но как можно сделать ложное значение ,если мне нужно обрабатывать и высокий и низкий уровень порта.

do
   {
   delay(100);
   Serial.println("AT+CMGS=\"+700000000\""); 
   delay(100);
   Serial.print("Text");  // отправляем текст
   delay(100);
   Serial.print((char)26);  // символ завершающий передачу
   delay(200);
   }
   while(digitalRead(6) == LOW);
   do
   {
   Serial.println("AT+CMGS=\"+700000000\""); 
   delay(100);
   Serial.print("Text");  // отправляем текст
   delay(100);
   Serial.print((char)26);  // символ завершающий передачу
   } 
   while(digitalRead(6) == HIGH);  

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

можно с помощью флага

ARM
Offline
Зарегистрирован: 25.03.2016

Valera19701 пишет:

можно с помощью флага

 

 Valera19701 и Araris Благодарю за подсказку.