#1 2019-11-11 18:41:29

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Кормушка для птиц по СМС на 8266

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

Неактивний

#2 2019-11-11 18:46:31

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 384

Re: Кормушка для птиц по СМС на 8266

1. Не вижу функции readSim. Куда делась?

2. Если буфер объявить на 256 байтов, а читать в него 2000, то и не такое бывает
char responseBuffer[256];
readSim(responseBuffer, 2000);

Неактивний

#3 2019-11-11 18:51:57

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

То есть, после седьмой строчки char responseBuffer[256];
вставить такую строчку readSim(responseBuffer, 2000);
Спасибо, сейчас попробую.

Неактивний

#4 2019-11-11 19:45:29

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 384

Re: Кормушка для птиц по СМС на 8266

Нет, конечно. Не надо делать глупостей.

Просто вставь код полностью.

Неактивний

#5 2019-11-11 19:50:54

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

Kaka пише:

Нет, конечно. Не надо делать глупостей.

Просто вставь код полностью.

Блин, sory, оказывается не весь код вставился. Вот сейчас поправил топик.

Неактивний

#6 2019-11-11 20:05:01

г0сть
Гість

Re: Кормушка для птиц по СМС на 8266

А без Sim800 никак не обойтись? У птиц wi-fi нет?

#7 2019-11-11 20:07:18

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

г0сть пише:

А без Sim800 никак не обойтись? У птиц wi-fi нет?

Надо, чтобы управляли кормушкой массовые пользователи)

Неактивний

#8 2019-11-11 20:23:00

г0сть
Гість

Re: Кормушка для птиц по СМС на 8266

Индеек откармливать на день благодарения ?  smile

#9 2019-11-11 20:26:47

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

г0сть пише:

Индеек откармливать на день благодарения ?  smile

Нет, кормушка для диких птиц, трансляция по ютюб.

Неактивний

#10 2019-11-11 20:34:28

г0сть
Гість

Re: Кормушка для птиц по СМС на 8266

Смотрите как бы эти птички не выставили вас на бабки https://www.bbc.com/russian/news-50175080

#11 2019-11-11 20:36:47

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

г0сть пише:

Смотрите как бы эти птички не выставили вас на бабки https://www.bbc.com/russian/news-50175080

Не, я не буду ничего прицеплять к птицам, им будет только сыпаться еда)

Неактивний

#12 2019-11-11 22:05:24

г0сть
Гість

Re: Кормушка для птиц по СМС на 8266

А как у вас серва подключена?

#13 2019-11-11 22:07:36

г0сть
Гість

Re: Кормушка для птиц по СМС на 8266

и что за сервопривод?

#14 2019-11-11 22:09:50

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

г0сть пише:

А как у вас серва подключена?

MG 996 R питается от адаптера 5В 2А, масса общая с контроллером и sim800. Логика подключена к пину D4

Неактивний

#15 2019-11-11 22:17:48

г0сть
Гість

Re: Кормушка для птиц по СМС на 8266

В дополнение к тому что вам уже на двух форумах сказали о кривизне кода - серва довольно таки мощная, а у еспэшки уровень выхода всего 3.3 В. Вполне возможно что серве этого не хватает и при срабатывании она просто вешает контроллер. Попробуйте вместо сервопривода подключить, например, светодиод и понаблюдайте за работой устройства

#16 2019-11-11 22:56:46

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

г0сть пише:

В дополнение к тому что вам уже на двух форумах сказали о кривизне кода - серва довольно таки мощная, а у еспэшки уровень выхода всего 3.3 В. Вполне возможно что серве этого не хватает и при срабатывании она просто вешает контроллер. Попробуйте вместо сервопривода подключить, например, светодиод и понаблюдайте за работой устройства

Именно кривизна кода и послужила причиной обращения на форумы. По поводу сервы - она питается отдельным адаптером, от контроллера идет только логика.. Но, возможно Вы правы - посмотрю на это.

Неактивний

#17 2019-11-12 02:29:07

monser
Учасник
Зареєстрований: 2019-10-22
Повідомлень: 7

Re: Кормушка для птиц по СМС на 8266

dmb пише:
г0сть пише:

А без Sim800 никак не обойтись? У птиц wi-fi нет?

Надо, чтобы управляли кормушкой массовые пользователи)

Только SMS !!! причем платные!
Птичкам зёрнышко, а в карман копеечка. smile smile smile

Неактивний

#18 2019-11-12 02:48:16

monser
Учасник
Зареєстрований: 2019-10-22
Повідомлень: 7

Re: Кормушка для птиц по СМС на 8266

попробуйте параллельно емкости на плате SIM800 прицепить еще порядка 1000мкф.
Как то так:
20191112-093807.jpg

Неактивний

#19 2019-11-12 11:43:27

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

monser пише:
dmb пише:
г0сть пише:

А без Sim800 никак не обойтись? У птиц wi-fi нет?

Надо, чтобы управляли кормушкой массовые пользователи)

Только SMS !!! причем платные!
Птичкам зёрнышко, а в карман копеечка. smile smile smile

таки да! Почему бы и нет?  cool

Остання редакція dmb (2019-11-12 11:43:45)

Неактивний

#20 2019-11-12 11:50:22

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

monser пише:

попробуйте параллельно емкости на плате SIM800 прицепить еще порядка 1000мкф.
Как то так:
https://i.ibb.co/FBV0Sk6/20191112-093807.jpg

На самом деле вопрос решился, был он исключительно из за кривого скетча, мне на Амперке человек помог набросать весьма простой скетч, который встал на ардуино нано и серва заработала вполне бодро, подряд отправлял штук 10 смс - и все отработали без сбоя. Сейчас немного поэкспериментирую с "белым списком" (чтоб принимало только от нужного номера или с нужным текстом) - и запускать. Если тему не закроют - сброшу ссылку на трансляцию! А так - всем спасибо!

Неактивний

#21 2019-11-12 14:18:45

monser
Учасник
Зареєстрований: 2019-10-22
Повідомлень: 7

Re: Кормушка для птиц по СМС на 8266

Можно и сюда скетч закинуть. Мало ли кому пригодится.

Неактивний

#22 2019-11-12 15:46:52

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Кормушка для птиц по СМС на 8266

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)

Неактивний

#23 2019-11-12 15:59:34

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 384

Re: Кормушка для птиц по СМС на 8266

Если человеку нужны char *, нафига ему пихать String?

Неактивний

#24 2019-11-12 17:08:58

dmb
Учасник
Зареєстрований: 2019-11-11
Повідомлень: 13

Re: Кормушка для птиц по СМС на 8266

monser пише:

Можно и сюда скетч закинуть. Мало ли кому пригодится.

Ок, вот рабочий скетч на ардуино-нано:

#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)

Неактивний

#25 2019-11-12 22:08:41

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Кормушка для птиц по СМС на 8266

delay() в циклах как бы плохая идея лучше читать через Serial.readStringUnti('\n')  а еще наверное лучше сначала попробовать использовать библиотеку для GSM.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму