Помощь с кнопкой в скетче

georgiy123
Offline
Зарегистрирован: 26.03.2021

Всем привет . 
Возникла маленькая проблема , собираю телефон с одной кнопкой , в программирование уровень копи-паста .
Проблема в том что у меня получилось звонить с кнопки , но я не могу сбросить вызов этой же кнопкой . 
Не знаю куда записать строку сброса sendATCommand("ATH;", true); .

Логика такова , нажал на кнопку пошел вызов , нажал еще раз на кнопку , вызов сброшен .

 Кнопку которую вставил сам находится в loop в самом начале .

Буду рад помощи .

 

#include <SoftwareSerial.h>                     // Библиотека програмной реализации обмена по UART-протоколу
SoftwareSerial SIM800(8, 9);// RX, TX

String _response = "";   // Переменная для хранения ответа модуля
const int buttonPin = 2;     // вывод для кнопки
const int ledPin =  13;      // вывод для светодиода
#include <SoftwareSerial.h>   
int buttonState = 0;  




  
void setup() {
  Serial.begin(9600);                           // Скорость обмена данными с компьютером
  SIM800.begin(9600);                           // Скорость обмена данными с модемом
  Serial.println("Start!");
  pinMode(ledPin, OUTPUT);
  // режим ввода для кнопки
  pinMode(buttonPin, INPUT);

  sendATCommand("AT", true);
  
//    / Отправили AT для настройки скорости обмена данными

  // Команды настройки модема при каждом запуске
  _response = sendATCommand("AT+CLIP=1", true);  // Включаем АОН
  _response = sendATCommand("AT+CRSL=100", true);
  //_response = sendATCommand("AT+DDET=1", true);  // Включаем DTMF
}


String sendATCommand(String cmd, bool waiting) {
  String _resp = "";                            // Переменная для хранения результата
  Serial.println(cmd);                          // Дублируем команду в монитор порта
  SIM800.println(cmd);                          // Отправляем команду модулю
  if (waiting) {                                // Если необходимо дождаться ответа...
    _resp = waitResponse();                     // ... ждем, когда будет передан ответ
    // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
    if (_resp.startsWith(cmd)) {                // Убираем из ответа дублирующуюся команду
      _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
    }
    Serial.println(_resp);                      // Дублируем ответ в монитор порта
  }
  return _resp;                                 // Возвращаем результат. Пусто, если проблема
}

String waitResponse() {
  
  // Функция ожидания ответа и возврата полученного результата
  String _resp = "";                            // Переменная для хранения результата
  long _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
  while (!SIM800.available() && millis() < _timeout)  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  if (SIM800.available()) {                     // Если есть, что считывать...
    _resp = SIM800.readString();                // ... считываем и запоминаем
  }
  else {                                        // Если пришел таймаут, то...
    Serial.println("Timeout...");               // ... оповещаем об этом и...
  }
  return _resp;                                 // ... возвращаем результат. Пусто, если проблема
}

void loop() {

//////////////////////////////////////////////////////////////////////////////////////вот это я добавил

  buttonState = digitalRead(buttonPin);  // считываем состояние кнопки

 
  if (buttonState == HIGH) {  // если кнопка нажата, то её состояние HIGH:
   
    digitalWrite(ledPin, HIGH);  // включаем светодиод
    Serial.println("Нажата");
    sendATCommand("ATD+сюда вписывается номер;", true);
  } else {
    
    digitalWrite(ledPin, LOW); // иначе выключаем светодиод  
  }
////////////////////////////////////////////////////////////////////////////////////////////
  
  
    
  
  if (SIM800.available())   {                   // Если модем, что-то отправил...
    _response = waitResponse();                 // Получаем ответ от модема для анализа
    _response.trim();                           // Убираем лишние пробелы в начале и конце
    Serial.println(_response); 
    
    // Если нужно выводим в монитор порта
    if (_response.startsWith("RING")) {         // Есть входящий вызов
      sendATCommand("ATA", true);               // Отвечаем на вызов
      // или
      sendATCommand("ATH", true);
    
      // Отклоняем вызов
      
  }
    }
    
    
  
  if (Serial.available())  {                    // Ожидаем команды по Serial...
      SIM800.write(Serial.read());                // ...и отправляем полученную команду модему
  };
}

 

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Логика такова , нажал на кнопку (1) пошел вызов (2), нажал еще раз на кнопку (3), вызов сброшен (4).
1) если flag==0
2) flag=1
3)  если flag==1
4) flag=0

Примерно так. И кнопку достаточно читать раз в 20-40 мс.

 

georgiy123
Offline
Зарегистрирован: 26.03.2021

А можете добавить это в коде ?  пожалуйста ..

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

georgiy123 пишет:

А можете добавить это в коде ?  пожалуйста ..

Нет

georgiy123
Offline
Зарегистрирован: 26.03.2021

Спасибо большое , разобрался , ваша подсказка помогла )))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Скоро похоже наконец то заработает система ЭРА-ГЛОНАСС :-)

nik182
Онлайн
Зарегистрирован: 04.05.2015

Неделю назад проходил тех осмотр. Проверщик ткнул в кнопочку. Тётенька ответила - проверщик сказал проверка техосмотр и всё погасло. На что проверщик сказал - О! Уже работает!