Ви не увійшли.
Сторінки 1
delay() в циклах как бы плохая идея лучше читать через Serial.readStringUnti('\n') а еще наверное лучше сначала попробовать использовать библиотеку для GSM.
Возможно, Вы правы, но как это сделать? Сейчас попробовал удалить из кода проверочное слово "korm" и серва отрабатывает два или три цикла... Как с этим справиться?
delay() в циклах как бы плохая идея лучше читать через Serial.readStringUnti('\n') а еще наверное лучше сначала попробовать использовать библиотеку для GSM.
Я в этом не спец - мне главно, чтоб работало) Если работает плохо - я обращаюсь к вам)
Можно и сюда скетч закинуть. Мало ли кому пригодится.
Ок, вот рабочий скетч на ардуино-нано:
#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/ - за что ему выражается искренняя признательность.
попробуйте параллельно емкости на плате SIM800 прицепить еще порядка 1000мкф.
Как то так:
https://i.ibb.co/FBV0Sk6/20191112-093807.jpg
На самом деле вопрос решился, был он исключительно из за кривого скетча, мне на Амперке человек помог набросать весьма простой скетч, который встал на ардуино нано и серва заработала вполне бодро, подряд отправлял штук 10 смс - и все отработали без сбоя. Сейчас немного поэкспериментирую с "белым списком" (чтоб принимало только от нужного номера или с нужным текстом) - и запускать. Если тему не закроют - сброшу ссылку на трансляцию! А так - всем спасибо!
dmb пише:г0сть пише:А без Sim800 никак не обойтись? У птиц wi-fi нет?
Надо, чтобы управляли кормушкой массовые пользователи)
Только SMS !!! причем платные!
Птичкам зёрнышко, а в карман копеечка.![]()
![]()
таки да! Почему бы и нет?
В дополнение к тому что вам уже на двух форумах сказали о кривизне кода - серва довольно таки мощная, а у еспэшки уровень выхода всего 3.3 В. Вполне возможно что серве этого не хватает и при срабатывании она просто вешает контроллер. Попробуйте вместо сервопривода подключить, например, светодиод и понаблюдайте за работой устройства
Именно кривизна кода и послужила причиной обращения на форумы. По поводу сервы - она питается отдельным адаптером, от контроллера идет только логика.. Но, возможно Вы правы - посмотрю на это.
А как у вас серва подключена?
MG 996 R питается от адаптера 5В 2А, масса общая с контроллером и sim800. Логика подключена к пину D4
Смотрите как бы эти птички не выставили вас на бабки https://www.bbc.com/russian/news-50175080
Не, я не буду ничего прицеплять к птицам, им будет только сыпаться еда)
Индеек откармливать на день благодарения ?
Нет, кормушка для диких птиц, трансляция по ютюб.
А без Sim800 никак не обойтись? У птиц wi-fi нет?
Надо, чтобы управляли кормушкой массовые пользователи)
Нет, конечно. Не надо делать глупостей.
Просто вставь код полностью.
Блин, sory, оказывается не весь код вставился. Вот сейчас поправил топик.
То есть, после седьмой строчки char responseBuffer[256];
вставить такую строчку readSim(responseBuffer, 2000);
Спасибо, сейчас попробую.
Доброе время! Решил сделать кормушку, чтоб при отправке СМС срабатывал серво, который сыпал корм.
Взял 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) {}
}
Заранее благодарен за ответ!
Сторінки 1