Ви не увійшли.
Доброе время! Решил сделать кормушку, чтоб при отправке СМС срабатывал серво, который сыпал корм.
Взял 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)
Неактивний