Помогите пожалуйста разобраться в скетче контроля отопления. Команду получает через смс в серийном порту всё отображается . Но задачу не выполняет на полученную команду. Код (C++): [code] #include "SoftwareSerial.h" #include "SimpleDHT.h" int p8 = 11, t_1 = 0, pinDHT11 = 15, temperature = 0, humidity = 0, msgphone = 0; SimpleDHT11 dht11(pinDHT11); SoftwareSerial SIM800(2, 3); //программные RX, TX для связи с модулем SIM800L unsigned long timing1, timing2, timing3, timing4, timing5, timing6, timing7, timing8, timing9; // Перемен. для хранения точки отсчета для таймеров int j = 0, k = 0, a = 0, x = 9, x2 = 20, v = 0; String _response = ""; // Переменная для хранения ответа модуля long lastUpdate = millis(); // Время последнего обновления long updatePeriod = 60000; // Проверять каждую минуту String phones = "+7925, +xxxxxxxxxxxx"; //Список разрешенных номеров //номера вписываются в международном формате начиная с + 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; //возвращаем результат. Пусто, если проблема } 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); // Дублируем ответ в Serial } return _resp; // Возвращаем результат. Пусто, если проблема } void parseSMS(String msg) { // Парсим SMS String msgheader = ""; String msgbody = ""; String msgphone = ""; msg = msg.substring(msg.indexOf("+CMGR: ")); msgheader = msg.substring(0, msg.indexOf("\r")); // Выдергиваем телефон msgbody = msg.substring(msgheader.length() + 2); msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK"));// Выдергиваем текст SMS msgbody.trim(); int firstIndex = msgheader.indexOf("\",\"") + 3; int secondIndex = msgheader.indexOf("\",\"", firstIndex); msgphone = msgheader.substring(firstIndex, secondIndex); Serial.println("Phone: " + msgphone); // Выводим номер телефона Serial.println("Message: " + msgbody); // Выводим текст SMS if (msgphone.length() > 6 && phones.indexOf(msgphone) > -1) { // Если телефон в белом списке, то if (msgbody == "Pr0") { j = 0; digitalWrite(13, LOW); } if (msgbody == "Pr1") { j = 1; digitalWrite(13, LOW); } if (msgbody == "Pr2") { j = 2; digitalWrite(13, LOW); } if (msgbody == "Pr3") { j = 3; } if (msgbody == "Pr20") { j = 4; digitalWrite(13, LOW); } if (msgbody == "Ktr") { k = 1; } if (msgbody == "Klx2+") { x2 = x2 + 3; } if (msgbody == "Klx2-") { x2 = x2 - 3; } } else { Serial.println("Unknown phonenumber"); } } [/code]
Код (C++): void setup() { pinMode(13, OUTPUT); pinMode(p8, OUTPUT); digitalWrite(13, LOW); digitalWrite(p8, LOW); pinMode(7, INPUT); Serial.begin(9600); // Скорость обмена данными с компьютером SIM800.begin(9600); // Скорость обмена данными с модемом Serial.println("Start!"); analogReference(INTERNAL); sendATCommand("AT", true); // Отправили AT для настройки скорости обмена данными sendATCommand("AT+CMGDA=\"DEL ALL\"", true); // Удаляем все SMS, чтобы не забивать память sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)! lastUpdate = millis(); // Обнуляем таймер } bool hasmsg = false; // Флаг наличия сообщений к удалению void loop() { int sensorVal = digitalRead(7); if (sensorVal == HIGH) { v = 220; } else { v = 0; } if (millis() - timing9 > 3000) { timing9 = millis(); byte temperature = 0; byte humidity = 0; dht11.read(&temperature, &humidity, NULL); t_1 = analogRead(A0) / x; // Serial.print("T1 = "); Serial.print(t_1); Serial.print("*C, "); // Serial.print("T2 = "); Serial.print((int)temperature); Serial.print("*C, "); //Serial.print((int)humidity); Serial.println("%"); } if (lastUpdate + updatePeriod < millis() ) { // Пора проверить наличие новых сообщений do { _response = sendATCommand("AT+CMGL=\"REC UNREAD\",1", true); // Отправляем запрос чтения непрочитанных сообщений if (_response.indexOf("+CMGL: ") > -1) { // Если есть хоть одно, получаем его индекс int msgIndex = _response.substring( _response.indexOf ("+CMGL: ") + 7, _response.indexOf("\"REC UNREAD\"", _response.indexOf("+CMGL: ")) - 1).toInt(); char i = 0; // Объявляем счетчик попыток do { i++; // Увеличиваем счетчик _response = sendATCommand("AT+CMGR=" + (String)msgIndex + ",1", true); // Пробуем получить текст SMS по индексу _response.trim(); // Убираем пробелы в начале/конце if (_response.endsWith("OK")) { // Если ответ заканчивается на "ОК" if (!hasmsg) hasmsg = true; // Ставим флаг наличия сообщений для удаления sendATCommand("AT+CMGR=" + (String)msgIndex, true); // Делаем сообщение прочитанным sendATCommand("\n", true); // Перестраховка - вывод новой строки parseSMS(_response); // Отправляем текст сообщения на обработку break; // Выход из do } else { // Если сообщение не заканчивается на OK Serial.println ("Error"); //ошибка sendATCommand("\n", true); // Отправляем новую строку и повторяем попытку } } while (i < 10); break; } else { lastUpdate = millis(); // Обнуляем таймер if (hasmsg) { sendATCommand("AT+CMGDA=\"DEL READ\"", true); // Удаляем все прочитанные сообщения hasmsg = false; } break; } } while (1); } if (SIM800.available()) { // Если модем, что-то отправил _response = waitResponse(); // Получаем ответ от модема для анализа _response.trim(); // Убираем лишние пробелы в начале и конце Serial.println(_response); // Если нужно выводим в монитор порта if (_response.indexOf("+CMTI:") > -1) { // Пришло сообщение об отправке SMS lastUpdate = millis() - updatePeriod; // Теперь нет необходимости обрабатывать SMS здесь, достаточно просто сбросить счетчик авто проверки, и в следующем цикле все будет обработано } } if (Serial.available()) { // Ожидаем команды по Serial SIM800.write(Serial.read()); //и отправляем полученную команду модему }; if (j == 0) { //Программа 0 digitalWrite(p8, HIGH); } else { digitalWrite(p8, LOW); } if (j == 1) { //Программа 1 if (millis() - timing1 > 12600000) { //3 часа 30 минут = 12600000 мс timing1 = millis(); timing2 = millis(); digitalWrite(13, HIGH); } if (millis() - timing2 > 1800000) { // 30 минут = 1800000 мс digitalWrite(13, LOW); } if (millis() - timing6 > 3000) { timing6 = millis(); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); } } if (j == 2) { //Программа 2 if (millis() - timing3 > 23400000) { // 6 часа 30 минут = 23400000 мс timing3 = millis(); timing4 = millis(); digitalWrite(13, HIGH); } if (millis() - timing4 > 1800000) { // 30 минут = 1800000 мс digitalWrite(13, LOW); } if (millis() - timing7 > 3000) { timing7 = millis(); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); delay(300); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); } } if (j == 3) { digitalWrite(13, HIGH); //Программа 3 if (millis() - timing8 > 3000) { timing8 = millis(); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); delay(300); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); delay(300); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); } } a = j; if (j == 4) { a = 20; //Программа 4 if (millis() - timing5 > 3000) { timing5 = millis(); byte temperature = 0; byte humidity = 0; dht11.read(&temperature, &humidity, NULL); if ((int)temperature <= x2) { digitalWrite(13, HIGH); } if ((int)temperature > x2) { digitalWrite(13, LOW); } } if (millis() - timing8 > 3000) { timing8 = millis(); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); delay(300); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); delay(300); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); delay(300); digitalWrite(p8, HIGH); delay(100); digitalWrite(p8, LOW); } } else { a = j; } if (k == 1) { delay(300); byte temperature = 0; byte humidity = 0; dht11.read(&temperature, &humidity, NULL); delay(300); SIM800.println( "AT+CMGS=\"+xxxxxxxxxx\""); //номер на который будет приходить SMS отчет delay(3000); //номер вписывается в международном формате начиная с + SIM800.print("T1="); delay(300); SIM800.print(t_1); delay(300); SIM800.print("*C, T2="); delay(300); SIM800.print((int)temperature); delay(300); SIM800.print("*C, T2-VL="); delay(300); SIM800.print((int)humidity); delay(300); SIM800.print("% Pr="); delay(300); SIM800.print(a); delay(300); SIM800.print(" t="); delay(300); SIM800.print(x2); delay(300); SIM800.print(" Set="); delay(300); SIM800.print(v); delay(300); SIM800.print("volt"); delay(300); SIM800.print((char)26);//команда для отправки SMS delay(300); Serial.println("SMS send finish"); } k = 0; }
Код (Text): Start! AT OK AT+CMGDA="DEL ALL" OK AT+CMGF=1;&W OK +CMT: "+7925","","22/12/01,22:22:06+12" Pr3 AT+CMGL="REC UNREAD",1 OK