Доброго времени суток! Занялся сигнализацией в гараж. Рфид работает исправно и модуль sim800l, но с герконом беда... А именно с кодом. 2 день шарюсь по интернету не могу понять как мне сделать так, чтобы после того как пройдет 20 сек после открытия двери и нужную карточку к рфид не приложили(любую из тех что есть в скетче), то ардуино отправляет смс на телефон с тревожным сообщением. Заранее спасибо за помощь! Код (C++): #include <SoftwareSerial.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 #define gerkon 5 int val = 0; int a = 2622968907,b = 3423428171, c = 3424607307, d = 1442582152, e = 2777746824; MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; SoftwareSerial gprsSerial(8, 6); String _response = ""; void setup() { SPI.begin(); mfrc522.PCD_Init(); pinMode(gerkon, INPUT); SIM800.begin(9600); sendATCommand("AT", true); _response = sendATCommand("AT+CMGF=1;&W", true); } String sendATCommand(String cmd, bool waiting) { String _resp = ""; // Переменная для хранения результата // Дублируем команду в монитор порта SIM800.println(cmd); // Отправляем команду модулю if (waiting) { // Если необходимо дождаться ответа... _resp = waitResponse(); // ... ждем, когда будет передан ответ // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2); } // Дублируем ответ в монитор порта } return _resp; // Возвращаем результат. Пусто, если проблема } String waitResponse() { // Функция ожидания ответа и возврата полученного результата String _resp = ""; // Переменная для хранения результата long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд) while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то... if (SIM800.available()) { // Если есть, что считывать... _resp = SIM800.readString(); // ... считываем и запоминаем } return _resp; // ... возвращаем результат. Пусто, если проблема } void loop() { val = digitalRead(gerkon); if (val == LOW){ if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } if (SIM800.available()) { // Если модем, что-то отправил... _response = waitResponse(); // Получаем ответ от модема для анализа _response.trim(); // Убираем лишние пробелы в начале и конце // Если нужно выводим в монитор порта //.... if (_response.startsWith("+CMGS:")) { // Пришло сообщение об отправке SMS int index = _response.lastIndexOf("\r\n");// Находим последний перенос строки, перед статусом String result = _response.substring(index + 2, _response.length()); // Получаем статус result.trim(); // Убираем пробельные символы в начале/конце } } if (uidDec == 2622968907){ sendSMS("+795", "Key1 join"); delay(5000); goto stop; } if (uidDec == 3423428171){ sendSMS("+795", "Key2 join"); delay(5000); goto stop;} if (uidDec == 3424607307){ sendSMS("+795", "Key3 join"); delay(5000); goto stop;} if (uidDec == 1442582152){ sendSMS("+795", "Key4 join"); delay(5000); goto stop;} if (uidDec == 2777746824){ sendSMS("+795", "Key5 join"); delay(5000); goto stop;} if (uidDec == a || b || c || d || e){ sendSMS("+795", "Lose key"); delay(5000); } stop: delay(10); if (Serial.available()) { // Ожидаем команды по Serial... SIM800.write(Serial.read()); // ...и отправляем полученную команду модему }; } } void sendSMS(String phone, String message) { sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z }
Сильно не вникал в ваш "кот". Но имхо Код (C++): val = digitalRead(gerkon); if (val == LOW) по моему здесь и нужно засекать время , когда геркон разомкнулся. Можно ещё создать флаг собственно открытия двери и что метка не поднесена и сбросить этот флаг при поднесении "родной" метки . Если прошло 20 сек и флаг не сброшен, тогда развлекаться с gsm модулем на тему отправки сообщения. Я так предполагаю.
goto не рекомендуется здесь использовать. Можно switch-case. А каим образом вы 20 сек отмеряете? У вас этого в коде не видно
Это назыаается индийский код. А если бы меток было 100, так же писали бы каждую своим if? Ну и про геркон правильно спросили, если метку не поднести в течении нескольких мс, то считай попался. И конструкции с определением излишни, в одну строку можно упихать ваши три.