Не корректно работает скетч после отключения питания
- Войдите на сайт для отправки комментариев
Начнем с того, что я новичек в этом деле. Но тут резко понадопилось СМС упровлени несколькими каналами. Полазил по инетам, нашел скетчи, подредактировал под свои нужды, как смог, работет. Имеется китайская UNO, NEOWAY M590. Вместе их подружил, общаются, понимают...
Но суитуация такая. Мне для своих нужд надо использовать вот этот скетч:
//По СМС от любого номера управляет двумя контактами^ включение, выключение, перезагрузка 1 минута #include <SoftwareSerial.h> SoftwareSerial gprsSerial(2, 3); int onePin = 4; //назначение пина 1 устройству int twoPin = 8; // назначение пина 2 устройству int ledPin = 13; // назначаем родной диод на плате void setup() { gprsSerial.begin(9600); // скорость GSM шилда pinMode(onePin, OUTPUT); // назначаем выходы pinMode(twoPin, OUTPUT); pinMode(ledPin, OUTPUT); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.print("AT+CMGF=1\r"); delay(300); gprsSerial.print("AT+IFC=1, 1\r"); delay(300); gprsSerial.print("AT+CPBS=\"SM\"\r"); delay(300); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); delay(300); digitalWrite(onePin, HIGH); //изначальное состояние 1 устройства на 4 ноге ВКЛЮЧЕНО digitalWrite(twoPin, HIGH); //изначальное состояние 2 устройства на 8 ноге ВКЛЮЧЕНО digitalWrite(ledPin, LOW); // изначально выключаем светодиод на плате, чтобы не горел } String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void loop() { if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("1 on")) { // включение 1 устройства digitalWrite(onePin, HIGH); } else if (!currStr.compareTo("1 off")) { // выключение 1 устройства digitalWrite(onePin, LOW); } else if (!currStr.compareTo("2 on")) { // включение 2 устройства digitalWrite(twoPin, HIGH); } else if (!currStr.compareTo("2 off")) { // выключение 2 устройства digitalWrite(twoPin, LOW); } else if (!currStr.compareTo("1 restart")) { // перезагрузка 1 устройства digitalWrite(onePin, LOW); delay(60000); digitalWrite(onePin, HIGH); } else if (!currStr.compareTo("2 restart")) { // перезагрузка 2 устройства digitalWrite(twoPin, LOW); delay(60000); digitalWrite(twoPin, HIGH); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }
Заливаем, пользуемся... все работает. Отключаем USB, включаем его через некоторое время, скетч запускается, включает оба моих устройства и не реагирут на СМС ни в какую. Заливаем этот же скетч по новой, реакции никакой. Питание GSM было от UNO, проблем никаких не было, все работало. Сделал от отдельногго БП 5V 2A, разницы никакой, как не работало, так и не работает.
Берем, заливаем другой скетч (так же найденный на просторах сети и доработанный под свои нужды)
//Скетч по звонку с указанного номера отключает реле на 8 выходе на 1 минуту и включает его вновь. #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); // RX, TX int ch = 0; int led = 13; //светодиод на 13 выходе int rel = 8; //добавлено мной 8 выход на реле String val = ""; void setup() { delay(2000); //время на инициализацию модуля pinMode(led, OUTPUT); pinMode(rel,OUTPUT); digitalWrite(led, LOW); digitalWrite(rel,HIGH); Serial.begin(9600); //скорость порта Serial.println("GSM tester v1.0"); mySerial.begin(9600); mySerial.println("AT+CLIP=1"); //включаем АОН delay(100); mySerial.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.) delay(100); mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); } void loop() { if (mySerial.available()) { //если GSM модуль что-то послал нам, то while (mySerial.available()) { //сохраняем входную строку в переменную val ch = mySerial.read(); val += char(ch); delay(10); } if (val.indexOf("RING") > -1) { //если звонок обнаружен, то проверяем номер if (val.indexOf("7906397XXXX") > -1) { //если номер звонящего наш. Укажите свой номер без "+" Serial.println("--- MASTER RING DETECTED ---"); mySerial.println("ATH0"); //разрываем связь digitalWrite(led, HIGH); //включаем светодиод delay(3000); //пауза 3 секунды digitalWrite(rel,LOW); //выключаем реле на 8 выходе delay(60000); //ждем 1 минуту digitalWrite(rel,HIGH); //включаем реле на 8 выходе digitalWrite(led,LOW); //выключаем диод } } else Serial.println(val); //печатаем в монитор порта пришедшую строку val = ""; } if (Serial.available()) { //если в мониторе порта ввели что-то while (Serial.available()) { //сохраняем строку в переменную val ch = Serial.read(); val += char(ch); delay(10); } //mySerial.println(val); //передача всех команд, набранных в мониторе порта в GSM модуль if (val.indexOf("sendsms") > -1) { //если увидели команду отправки СМС sms(String("hello world"), String("+7906397XXXX")); //отправляем СМС на номер +7906397XXXX } val = ""; //очищаем } } void sms(String text, String phone) //процедура отправки СМС { Serial.println("SMS send started"); mySerial.println("AT+CMGS=\"" + phone + "\""); delay(500); mySerial.print(text); delay(500); mySerial.print((char)26); delay(500); Serial.println("SMS send complete"); delay(2000); }
После него заливаем первый, и опять все работает до тех пор, пока не передернешь USB.
Куда копать, не догадываюсь. Подскажите пожалуйста верный путь
померь напряжение 5 вольт, вероятно у тебя где-то 3.5 на перефирийке и по этому не работат
померь напряжение 5 вольт, вероятно у тебя где-то 3.5 на перефирийке и по этому не работат
На переферийке - это где?
Спасибо огромное всем, кто направил в нужном направлении.
Вот рабочий скетч, для таких же двоечников как и я...
Вот если честно, не совсем понял как решилась проблема. У меня аналогичная ситуация. Если подключен USB, то всё работает. А при отключеном кабеле ничего не работает