Ви не увійшли.
Доброе время! Решил сделать кормушку, чтоб при отправке СМС срабатывал серво, который сыпал корм.
Взял Wemos Di mini (NodeMCU) и SIM800l (все самое дешевое, естественно). Вставил симку, срабатывает при отправке - но только 1 раз, второй раз не срабатывает. Если контроллер перезагрузить нажатием кнопки - то можно опять активировать один раз. Хотя, даже иногда срабатывает два раза (но редко). В чем может быть ошибка? Питание модулей и сервы отдельное, думаю что хорошее. Может есть ошибка в скетче?
#include <SoftwareSerial.h>
#include <Servo.h>
#define DEBUG 1
#define SIM800_TX_PIN D6 // TX pin of SIM800L
#define SIM800_RX_PIN D5 // RX pin of SIM800L
SoftwareSerial serialSIM800(SIM800_TX_PIN,SIM800_RX_PIN);
char responseBuffer[256];
Servo servo;
char *checkPhone = {
(char *)"79", // Phone number to check
};
char *checkSms[] = {
(char *)"CMT:", // Sms string
};
char *initSim[] = {
(char *)"AT", // Ping module
};
char *initTextMode[] = {
(char *)"AT+CMGF=1\r\n", // Mobile network status
};
char *initSmsMode[] = {
(char *)"AT+CNMI=1,2,0,0,0\r\n", // Mobile network status
};
void setup() {
Serial.begin(115200);
while(!Serial);
servo.attach(2); //D4
servo.write(0);
if(DEBUG) Serial.println("Connecting GSM module");
if (!connectModule()) {
delay(1000);
reboot();
}
writeToSim(initTextMode, sizeof(initTextMode)/sizeof(*initTextMode));
readSim(responseBuffer, 2000);
Serial.println(responseBuffer);
delay(1000);
writeToSim(initSmsMode, sizeof(initSmsMode)/sizeof(*initSmsMode));
readSim(responseBuffer, 2000);
Serial.println(responseBuffer);
delay(1000);
}
void loop() {
readSim(responseBuffer, 2000);
Serial.println(responseBuffer);
if(strstr(responseBuffer, (char *)"CMT:")) {
if(strstr(responseBuffer, checkPhone)) {
Serial.println("SMS detected!");
servo.write(145);
delay(1000);
servo.write(0);
delay(1000);
}
}
}
bool connectModule() {
serialSIM800.begin(57600);
Serial.print("Trying 57600 ...");
writeToSim(initSim, sizeof(initSim)/sizeof(*initSim));
readSim(responseBuffer, 2000);
if (isResponseOk(responseBuffer)) {
Serial.println("Connected to mobile");
return true;
}
Serial.println("Bad");
return false;
}
void writeToSim(char *commands[], int size) {
for(int i = 0; i < size; i++) {
serialSIM800.println(commands);
if(DEBUG) { Serial.print("Writing: "); Serial.println(commands); }
delay(1000);
}
}
// Read Sim response until timeout
char* readSim(char* buffer, int timeout) {
unsigned long timeStart = millis();
int charCount = 0;
while(charCount < 256) {
if(serialSIM800.available()) {
buffer[charCount++] = serialSIM800.read();
}
if(millis() - timeStart > timeout) break;
delay(10);
}
buffer[charCount++] = 0;
return buffer;
}
bool isResponseOk(char* buffer) {
// 1. Get buflen
int buflen = 0;
for(int i = 0; i < 256; i++) {
if(int(buffer) == 0) {
buflen = i;
break;
}
}
if(DEBUG) { Serial.print("Buflen: " ); Serial.println(buflen, DEC); }
// 2. Is last ok? buffer[buflen] == 0
while (buflen > 0) {
buflen--;
if (int(buffer[buflen]) == 10) {
continue;
}
if (int(buffer[buflen]) == 13) {
continue;
}
if (int(buffer[buflen]) == 75 && int(buffer[buflen-1]) == 79) {
if(DEBUG) { Serial.println("Response is OK"); }
return true;
}
if(DEBUG) { Serial.println("Response is BAD"); }
return false;
}
return false;
}
void reboot() {
wdt_disable();
wdt_enable(WDTO_15MS);
while (1) {}
}
Заранее благодарен за ответ!
Остання редакція dmb (2019-11-11 19:49:55)
Неактивний
А без Sim800 никак не обойтись? У птиц wi-fi нет?
Индеек откармливать на день благодарения ?
Смотрите как бы эти птички не выставили вас на бабки https://www.bbc.com/russian/news-50175080
А как у вас серва подключена?
и что за сервопривод?
В дополнение к тому что вам уже на двух форумах сказали о кривизне кода - серва довольно таки мощная, а у еспэшки уровень выхода всего 3.3 В. Вполне возможно что серве этого не хватает и при срабатывании она просто вешает контроллер. Попробуйте вместо сервопривода подключить, например, светодиод и понаблюдайте за работой устройства
В дополнение к тому что вам уже на двух форумах сказали о кривизне кода - серва довольно таки мощная, а у еспэшки уровень выхода всего 3.3 В. Вполне возможно что серве этого не хватает и при срабатывании она просто вешает контроллер. Попробуйте вместо сервопривода подключить, например, светодиод и понаблюдайте за работой устройства
Именно кривизна кода и послужила причиной обращения на форумы. По поводу сервы - она питается отдельным адаптером, от контроллера идет только логика.. Но, возможно Вы правы - посмотрю на это.
Неактивний
г0сть пише:А без Sim800 никак не обойтись? У птиц wi-fi нет?
Надо, чтобы управляли кормушкой массовые пользователи)
Только SMS !!! причем платные!
Птичкам зёрнышко, а в карман копеечка.
Неактивний
dmb пише:г0сть пише:А без Sim800 никак не обойтись? У птиц wi-fi нет?
Надо, чтобы управляли кормушкой массовые пользователи)
Только SMS !!! причем платные!
Птичкам зёрнышко, а в карман копеечка.
таки да! Почему бы и нет?
Остання редакція dmb (2019-11-12 11:43:45)
Неактивний
попробуйте параллельно емкости на плате SIM800 прицепить еще порядка 1000мкф.
Как то так:
https://i.ibb.co/FBV0Sk6/20191112-093807.jpg
На самом деле вопрос решился, был он исключительно из за кривого скетча, мне на Амперке человек помог набросать весьма простой скетч, который встал на ардуино нано и серва заработала вполне бодро, подряд отправлял штук 10 смс - и все отработали без сбоя. Сейчас немного поэкспериментирую с "белым списком" (чтоб принимало только от нужного номера или с нужным текстом) - и запускать. Если тему не закроют - сброшу ссылку на трансляцию! А так - всем спасибо!
Неактивний
char *checkPhone = {
(char *)"79", // Phone number to check
};
char *checkSms[] = {
(char *)"CMT:", // Sms string
};
char *initSim[] = {
(char *)"AT", // Ping module
};
char *initTextMode[] = {
(char *)"AT+CMGF=1\r\n", // Mobile network status
};
Что это за шняга? Почитайте про массивы и строки.
enum Cmd{ phone,sms, initSim, cmdCount };
const String cmds[cmdCount]=
{
"79",
"CMT:",
"AT"
};
// Использование:
Serial.println( cmds[sms] );
Остання редакція Avazart (2019-11-12 15:52:00)
Неактивний
Можно и сюда скетч закинуть. Мало ли кому пригодится.
Ок, вот рабочий скетч на ардуино-нано:
#include <SoftwareSerial.h>
#include <Servo.h> // подключаем библиотеку для работы с сервоприводом
Servo servo1; // объявляем переменную servo типа "servo1"
SoftwareSerial mySerial(5, 3); // Выводы SIM800L Tx & Rx подключены к выводам 5 и 3
char incomingByte;
String inputString;
void setup()
{
mySerial.begin(9600);
servo1.attach(8); // привязываем сервопривод к цтфровому выходу 8
servo1.write(0); // начальное положение сервы 0
while(!mySerial.available()){ // Зацикливаем и ждем инициализацию SIM800L
mySerial.println("AT"); // Отправка команды AT
delay(1000); // Пауза
Serial.println("Connecting…"); // Печатаем текст
}
Serial.println("Connected!"); // Печатаем текст
mySerial.println("AT+CMGF=1"); // Отправка команды AT+CMGF=1
delay(1000); // Пауза
mySerial.println("AT+CNMI=1,2,0,0,0"); // Отправка команды AT+CNMI=1,2,0,0,0
delay(1000); // Пауза
mySerial.println("AT+CMGL=\"REC UNREAD\"");
}
void loop()
{
if(mySerial.available()){ // Проверяем, если есть доступные данные
delay(100); // Пауза
while(mySerial.available()){ // Проверяем, есть ли еще данные.
incomingByte = mySerial.read(); // Считываем байт и записываем в переменную incomingByte
inputString += incomingByte; // Записываем считанный байт в массив inputString
}
delay(10); // Пауза
Serial.println(inputString); // Отправка в "Мониторинг порта" считанные данные
if (inputString.indexOf("korm") > -1){ // Проверяем полученные данные, если korm - включаем серву
servo1.write(145); // ставим угол поворота под 145
delay(2000); // ждем 2 секунды
servo1.write(0); // ставим угол поворота под 00
delay(2000); // ждем 2 секунды
}
delay(50);
if (inputString.indexOf("OK") == -1){
mySerial.println("AT+CMGDA=\"DEL ALL\""); // стираем смс-ку
delay(1000);}
inputString = "";}
}
Изначальный скетч был взят здесь: https://robotchip.ru/upravlenie-nagruzkoy-cherez-sms-gsm-i-arduino/ , после чего был любезно доработан для моих целей человеком, с ником Airbus на форуме http://forum.amperka.ru/ - за что ему выражается искренняя признательность.
Остання редакція dmb (2019-11-12 17:24:40)
Неактивний