GSM сигнализация M590+Arduino

smesharik
Offline
Зарегистрирован: 31.01.2016

У меня вопрос, сейчас пытаюсь оптимизировать свой проект, поглядывая сюда

Так вот, как сильно будет и будет ли вообще влиять на работу если я строчку и их подобные String обьявлю не в начале

 String  AT[] = {"AT+CLIP=1", "AT+CMGF=1", "AT+CSCS=\"GSM\"", "AT+CNMI=2,2,0,0,0" }; // общие АТ команды

а в самой функции

void InitModem() { /// === инициализация модема === ///
   waitConnect();
  String  AT[] = {"AT+CLIP=1", "AT+CMGF=1", "AT+CSCS=\"GSM\"", "AT+CNMI=2,2,0,0,0" }; // общие АТ команды
   for (int i = 0; i < 4; i++) {
   sendATCommand(AT[i], true);         // включить АОН
    }

Экономия существенная

Первый вариант 
Скетч использует 21306 байт (69%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1204 байт (58%) динамической памяти, оставляя 844 байт для локальных переменных. Максимум: 2048 байт.

Второй вариант
Скетч использует 19832 байт (64%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1160 байт (56%) динамической памяти, оставляя 888 байт для локальных переменных. Максимум: 2048 байт.

 

pasha413
Offline
Зарегистрирован: 27.11.2016

smesharik, так выложите проект, поможем)

я не стал использовать ее:

void InitModem() { /// === инициализация модема === ///
  gsm.begin(9600);  //Скорость порта для связи Arduino с GSM модулем
  waitConnect();
   sendATCommand(F("ATI"), true);
   sendATCommand(F("ATE0"), true);              // вывключить эхо
   sendATCommand(F("AT+CLIP=1"), true);         // включить АОН
   sendATCommand(F("AT+CMGF=1"), true);         // включить текстовый формат смс
   sendATCommand(F("AT+CSCS=\"GSM\""), true);   // включить кодировка текста gsm
   sendATCommand(F("AT+CNMI=2,2,0,0,0"), true); // смс прямо в порт
   sendATCommand(F("AT+CREG?"), true);          // регистрация в сети
}

 

smesharik
Offline
Зарегистрирован: 31.01.2016

pasha413 пишет:

smesharik, так выложите проект, поможем)

я не стал использовать ее:

тоже вариант

#include <EEPROM.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <iarduino_RTC.h>
#include <LiquidCrystal_I2C.h>
iarduino_RTC time(RTC_DS1307);
LiquidCrystal_I2C lcd(0x27, 20, 4);
SoftwareSerial gprsSerial(7, 8);

//////////////////setup phone //////////////
String master_phone = "+7922XXXXXXX";
uint32_t msAT = 0;
String  AT[] = {"AT+CLIP=1", "AT+CMGF=1", "AT+CSCS=\"GSM\"", "AT+CNMI=2,2,0,0,0" }; // общие АТ команды
/*
 * String  AT[] = {"ATE0", "AT+CLIP=1", "AT+CMGF=1", "AT+CSCS=\"GSM\"", "AT+CNMI=2,2,0,0,0", "AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", 
"AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\"", "AT+SAPBR=3,1,\"USER\",\"mts\"", "AT+SAPBR=3,1,\"PWD\",\"mts\"" }; // общие АТ команды
*/
String gval;

#include "DHT.h"
#define DHTPINa 11
#define DHTPINb 12
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dhta(DHTPINa, DHTTYPE); // Создаем объект dhta датчик 1
DHT dhtb(DHTPINb, DHTTYPE); // Создаем объект dhtb датчик 2
int ha;
int hb;
int ta;
int tb;

#define outPin 4            // выход на реле клапана
#define outLedRelay 5        // выход на реле обогрева

boolean on_led = true; // разрешение включение экрана по времени
boolean flag = false; // разрешение режима Poliv 

/////////////////////Время /////////////////////////////
#define time_signal 120 //время для проверки уровня сигнала
#define time_led 20 //время на гашение экрана
int timer_on; //время в режиме POLIV сек


// Команды для отправки смс:
// timeron - включает таймер
// timeroff - выключает таймер
// info - состояние системы
// date0 - полив каждый день
// date1 - полив пон, ср, пят
// date2 - полив пон, пят
// date3 - полив в будни
// polivXX - включение клапана полива на ХХ минут
// teploon / teplooff - включение/выключение реле обогрева

String timer = "";
String poliv_relay = "";
String teplo_text = "";
String poliv_text = "";
byte signal;

int nedela[4][7] = {{0, 1, 2, 3, 4, 5, 6 }, {1, 1, 1, 1, 1, 3, 5}, {1, 1, 1, 1, 1, 1, 5}, {1, 1, 1, 2, 3, 4, 5}};
byte kapla[8] = {0b00100, 0b00100, 0b01110, 0b01110, 0b11111, 0b11111, 0b01110, 0b00100};
int i;
int p = 0;

byte setSecClockOn; //
byte setMinClockOn; //
byte setHorClockOn;
byte setSecClockOff;
byte setMinClockOff; //
byte setHorClockOff;
byte settimer;
byte setdate;

int valA; //переменная времени
long previousMillisA = 0;
byte valB; //переменная времени
long previousMillisB = 0;
byte valC; //переменная времени
long previousMillisC = 0;
byte val_led; //переменная времени
long previousMillis_led = 0;
byte val_signal; //переменная времени
long previousMillis_signal = 0;


const byte PIN_BUTTON_SELECT = 0;
const byte PIN_ANALOG_X = 6;
const byte PIN_ANALOG_Y = 7;
const int X_THRESHOLD_LOW = 500;
const int X_THRESHOLD_HIGH = 540;
const int Y_THRESHOLD_LOW = 500;
const int Y_THRESHOLD_HIGH = 540;
int x_position;
int y_position;
int x_direction;
int y_direction;

byte key() { //// для кнопок ЛСДшилда
  x_direction = 0;
  y_direction = 0;
  x_position = analogRead(PIN_ANALOG_X);
  y_position = analogRead(PIN_ANALOG_Y);
  if (digitalRead(PIN_BUTTON_SELECT) == LOW) return 1;

  if (x_position > X_THRESHOLD_HIGH) {
    x_direction = 1;
    return 5;
  }
  else if (x_position < X_THRESHOLD_LOW) {
    x_direction = -1;
    return 2;
  }
  if (y_position > Y_THRESHOLD_HIGH) {
    y_direction = 1;
    return 3;
  }
  else if (y_position < Y_THRESHOLD_LOW) {
    y_direction = -1;
    return 4;
  } else return 0;
}

/////////// часы ..
void setClock() { // установка часов

  byte pos = 1;
  lcd.clear();
  lcd.blink();
  while (key() != 1) { // крутим   цикл
    byte KEY = key(); // читаем состояние кнопок
    delay(200);
    lcd.setCursor(1, 1);
    lcd.print("set to save");
    lcd.setCursor(0, 0);     // выводим инфу
    if (time.Hours < 10) lcd.print("0");
    lcd.print(time.Hours);
    lcd.print(":");
    if (time.minutes < 10) lcd.print("0");
    lcd.print(time.minutes);
    lcd.print(" ");
    if (time.day < 10) lcd.print("0");
    lcd.print(time.day);
    lcd.print("/");
    if (time.month < 10) lcd.print("0");
    lcd.print(time.month);
    lcd.print("/");
    lcd.print(time.year);

    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    if (KEY == 5 && pos < 13) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 1) pos -= 3;

    else if (pos == 1 && KEY == 3) time.Hours++ ; // крутим значения
    else if (pos == 1 && KEY == 4) time.Hours--;
    else if (pos == 4 && KEY == 3) time.minutes++;
    else if (pos == 4 && KEY == 4) time.minutes--;
    else if (pos == 7 && KEY == 3) time.day++;
    else if (pos == 7 && KEY == 4) time.day--;
    else if (pos == 10 && KEY == 3) time.month++;
    else if (pos == 10 && KEY == 4) time.month--;
    else if (pos == 13 && KEY == 3) time.year++;
    else if (pos == 13 && KEY == 4) time.year--;

    if (time.Hours > 23) time.Hours = 0;
    else if (time.minutes > 59) time.minutes = 0;
    else if (time.day > 31) time.day = 0;
    else if (time.month > 12) time.month = 1;
    else if (time.year > 99) time.year = 0;
  }// конец цикла

  time.settime(-1, time.minutes, time.Hours, time.day, time.month, time.year, -1);
  lcd.noBlink();
  lcd.clear();
  lcd.print("     Saved");
  delay(1500);
}///

void setOnOff() {
  delay(200);
  byte pos = 6;
  lcd.clear();
  lcd.blink();

  while (key() != 1) { // крутим   цикл
    byte KEY = key(); // читаем состояние кнопок
    delay(200);
    lcd.setCursor(0, 0);     // выводим инфу
    lcd.print("On:  ");
    if (setHorClockOn < 10) lcd.print("0");
    lcd.print(setHorClockOn);
    lcd.print(":");
    if (setMinClockOn < 10) lcd.print("0");
    lcd.print(setMinClockOn);
    lcd.print(":");
    if (setSecClockOn < 10) lcd.print("0");
    lcd.print(setSecClockOn);

    // просто вторая строка начало
    lcd.setCursor(0, 1);
    lcd.print("Off: ");
    if (setHorClockOff < 10) lcd.print("0");
    lcd.print(setHorClockOff);
    lcd.print(":");
    if (setMinClockOff < 10) lcd.print("0");
    lcd.print(setMinClockOff);
    lcd.print(":");
    if (setSecClockOff < 10) lcd.print("0");
    lcd.print(setSecClockOff);
    // просто вторая строка конец

    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

    if (KEY == 5 && pos < 12) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 6) pos -= 3;

    else if (pos == 6 && KEY == 3) setHorClockOn++; // крутим значения
    else if (pos == 6 && KEY == 4) setHorClockOn--;
    else if (pos == 9 && KEY == 3) setMinClockOn++;
    else if (pos == 9 && KEY == 4) setMinClockOn--;
    else if (pos == 12 && KEY == 3) setSecClockOn++;
    else if (pos == 12 && KEY == 4) setSecClockOn--;
    if (setHorClockOn > 23) setHorClockOn = 0;

    else if (setMinClockOn > 59) setMinClockOn = 0;
    else if (setSecClockOn > 59) setSecClockOn = 0;

  }
  delay(700);
  on_sec();
}
void on_sec() { //цикл второй строки для выключения таймера
  byte pos = 6;
  while (key() != 1) { // крутим   цикл
    byte KEY = key(); // читаем состояние кнопок
    delay(200);
    lcd.setCursor(0, 1);     // выводим инфу
    lcd.print("Off: ");
    if (setHorClockOff < 10) lcd.print("0");
    lcd.print(setHorClockOff);
    lcd.print(":");
    if (setMinClockOff < 10) lcd.print("0");
    lcd.print(setMinClockOff);
    lcd.print(":");
    if (setSecClockOff < 10) lcd.print("0");
    lcd.print(setSecClockOff);

    lcd.setCursor(pos, 1); // устанавливаем курсор согласно позиции

    if (KEY == 5 && pos < 12) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 6) pos -= 3;

    else if (pos == 6 && KEY == 3) setHorClockOff++;
    else if (pos == 6 && KEY == 4) setHorClockOff--;
    else if (pos == 9 && KEY == 3) setMinClockOff++;
    else if (pos == 9 && KEY == 4) setMinClockOff--;
    else if (pos == 12 && KEY == 3) setSecClockOff++;
    else if (pos == 12 && KEY == 4) setSecClockOff--;


    if (setHorClockOff > 23) setHorClockOff = 0;
    else if (setMinClockOff > 59) setMinClockOff = 0;
    else if (setSecClockOff > 59) setSecClockOff = 0;

  }// конец цикла
  lcd.noBlink();
  lcd.clear();

  EEPROM.write(0, setMinClockOn);
  EEPROM.write(1, setHorClockOn);
  EEPROM.write(3, setMinClockOff);
  EEPROM.write(4, setHorClockOff);
  EEPROM.write(5, setSecClockOn);
  EEPROM.write(6, setSecClockOff);


  lcd.print("     Saved");
  delay(1500);
}///

void constant () {
  delay(200);
  byte pos = 7;
  lcd.clear();
  lcd.blink();
  while (key() != 1) { // крутим   цикл
    byte KEY = key(); // читаем состояние кнопок
    delay(200);
    lcd.setCursor(0, 0);
    lcd.print("timer= ");
    lcd.print(settimer);

    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    if (pos == 7 && KEY == 3) settimer++;
    else if (pos == 7 && KEY == 4) settimer--;
    if (settimer > 1) settimer = 1;
  }
  lcd.noBlink();
  lcd.clear();
  EEPROM.write(7, settimer);
  lcd.print("     Saved");
  delay(1500);
}

void menu() {
  delay(200);
  lcd.clear();
  char menuTxt[3][14] = {"set ON/OFF >>", "set clock  >>", "Constant >>"};
  byte pos = 0;

  while (key() != 1) {
    delay(200);
    byte KEY = key();


    lcd.setCursor(0, 0);
    lcd.print(pos + 1);
    lcd.print(".");
    lcd.print(menuTxt[pos]);

    if (KEY == 3 && pos != 0) pos--;
    else if (KEY == 4 && pos < 2) pos++;

    if (KEY == 5 && pos == 0) setOnOff();
    else if (KEY == 5 && pos == 1) setClock();
    else if (KEY == 5 && pos == 2) constant();
  }
  lcd.clear();
}

void poliv() {    //полив по времени polivXXX

  if (flag == true)
  {
    digitalWrite(outPin, LOW);
    if (millis() - previousMillisA > 1000)
    {
      previousMillisA = millis();
      valA++;
    }
    if ((valA / 60) >= timer_on) //в минутах
    {
      if (digitalRead(outPin) == LOW) digitalWrite(outPin, HIGH);
      valA = 0;
      flag = false;

    }
  }
}

void on_led_off()  //подсветка дисплея
{
  if (key() > 0) {
    on_led = true;
  }
  if (on_led == true)
  {
    lcd.backlight();// Включаем подсветку дисплея
    if (millis() - previousMillis_led > 1000)
    {
      previousMillis_led = millis();
      val_led++;
      if (key() > 0) {
        val_led = 0;
      }
    }
    if (val_led >= time_led)
    {
      val_led = 0;
      on_led = false;
      lcd.noBacklight();// Включаем подсветку дисплея
    }
  }
}

void cmtexo() {     
     if ( (p = gval.indexOf(F("poliv"))) > -1)    {
        flag = true;
        timer_on = gval.substring(p+5, p+8).toInt();
      }
     else if (gval.indexOf(F("timeron")) > -1)    { // включение таймера
        settimer = 1;
        EEPROM.update(7, settimer);
      }
     else if (gval.indexOf(F("timeroff")) > -1)   { // выключение таймера
        settimer = 0;
        EEPROM.update(7, settimer);
      }
     else if (gval.indexOf(F("date0")) > -1)    { // каждый день
        setdate = 0;
        EEPROM.write(8, setdate);
      }
     else if (gval.indexOf(F("date1")) > -1)    { // пон, ср, пятн
        setdate = 1;
        EEPROM.write(8, setdate);
      }
     else if (gval.indexOf(F("date2")) > -1)   { // пон, пят
        setdate = 2;
        EEPROM.write(8, setdate);
      }
     else if (gval.indexOf(F("date3")) > -1)     { // будни
        setdate = 3;
        EEPROM.write(8, setdate);
      }
     else if (gval.indexOf(F("teploon")) > -1)     { // будни
        digitalWrite(outLedRelay, LOW);
        sms(F("Obogrev: ON"));
      }
      else if (gval.indexOf(F("teplooff")) > -1)     { // будни
        digitalWrite(outLedRelay, HIGH);
        sms(F("Obogrev: OFF"));
     }
       else if (gval.indexOf(F("info")) > -1) {
    sms(String(F("Dom: ")) + ta + String(F(" C / ")) + ha + String(F(" %")) + String(F("\n")) + String(F("Tep: ")) + tb + String(F(" C / ")) + hb
    + String(F(" %")) + String(F("\n")) + String(F("Poliv: ")) + poliv_relay + String(F(" / ")) + poliv_text + String(F("\n")) + String(F("Obogrev: ")) + teplo_text);
    }
     else if (gval.indexOf(F("ring")) > -1) {                 // если обнаружен вызов.
      if (gval.indexOf(master_phone) > -1) {                        // проверяем номер, если наш.
        gprsSerial.println(F("ATH0"));                  // сбрасываем вызов.
    } else {  
        gprsSerial.println(F("ATH0"));                  // если не наш, сбрасываем его.
        } }
   }
void sms(String text)  // отправка СМС
{
  gprsSerial.println("AT+CMGS=\"" + master_phone + "\"");
  delay(500);
  gprsSerial.print(text);
  delay(500);
  gprsSerial.print((char)26);
  delay(500);
  }
void InitModem() { /// === инициализация модема === ///
   waitConnect();
  //String  AT[] = {"AT+CLIP=1", "AT+CMGF=1", "AT+CSCS=\"GSM\"", "AT+CNMI=2,2,0,0,0" }; // общие АТ команды
   for (int i = 0; i < 4; i++) {
   sendATCommand(AT[i], true);         // включить АОН
    }
}
void waitConnect() {  // запуск модема
  int countok = 0;
  uint32_t msAT = 0;
  String str; 
  while(countok < 3) {                      //ждём пять ОК  
    uint32_t ms = millis();
    if(( ms - msAT ) > 500 || ms < msAT ) { // Событие срабатывающее каждые 500 мс 
      msAT = ms;
      gprsSerial.println("AT");                    // посылаем команду
      str = "";
      delay(100);                           // ждём ответа
      str = waitgsm();
      if (str.indexOf("OK") > -1) {
       // Serial.println("OK"); 
        countok++;
      } else countok = 0;
    }
  }  
}

String sendATCommand(String cmd, bool waiting) {
  String atval = "";                            // Переменная для хранения результата
  Serial.println(cmd);                          // Дублируем команду в монитор порта
  gprsSerial.println(cmd);                             // Отправляем команду модулю
  if (waiting) {                                // Если необходимо дождаться ответа...
    atval = waitgsm();                          // ... ждем, когда будет передан ответ
    Serial.println(atval);                      // Дублируем ответ в монитор порта
  }
  return atval;                                 // Возвращаем результат. Пусто, если проблема
}
String waitgsm() {                         // Функция ожидания ответа и возврата полученного результата
  String gsmval = "";                            // Переменная для хранения результата
  uint32_t _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
  while (!gprsSerial.available() && (millis() < _timeout))  {}; // Ждем ответа5 секунд, если пришел ответ или наступил таймаут, то...
  if (gprsSerial.available()) {     // если GSM модем что-то послал.
    while (gprsSerial.available()) {  // сохраняем входную строку в переменную val.
      char ch = gprsSerial.read();
      gsmval += char(ch);              // собираем принятые символы в строку
      delay(3);
    } 
  } else {                                      // Если пришел таймаут, то...
    //Serial.println(F("Timeout..."));               // ... оповещаем об этом и...
  }
  return gsmval;                                 // ... возвращаем результат. Пусто, если проблема
}

void text(){
  if (digitalRead(outLedRelay) == HIGH) teplo_text = "OFF"; else teplo_text = "ON ";
  if (digitalRead(outPin) == HIGH) poliv_relay = "OFF"; else poliv_relay = "ON ";
  if (settimer == 0) timer = "OFF"; else timer = "ON ";
   
  if (flag == true) { poliv_text = "GSM ";  }
  else if (settimer == true) {  poliv_text = "time"; }
  else if (settimer == false && flag == false) {  poliv_text = "Ryka"; }  
}

void setup() {
  delay(2000);
  Wire.begin();
  time.begin();
  lcd.init();   // initialize the lcd
  lcd.begin(20, 4);
  Serial.begin(19200);
  gprsSerial.begin(19200);
  InitModem(); 

  dhta.begin(); // Инициализируем датчик 1
  dhtb.begin(); // Инициализируем датчик 2
  lcd.clear();
  lcd.createChar(1, kapla);
  
  digitalWrite(outPin, HIGH);
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, HIGH);
  pinMode(outLedRelay, OUTPUT);
  digitalWrite(outLedRelay, HIGH);
  pinMode(PIN_BUTTON_SELECT, INPUT);
  digitalWrite(PIN_BUTTON_SELECT, HIGH);

  setMinClockOn = EEPROM.read(0);
  setHorClockOn = EEPROM.read(1);
  setSecClockOn = EEPROM.read(5);
  setMinClockOff = EEPROM.read(3);
  setHorClockOff = EEPROM.read(4);
  setSecClockOff = EEPROM.read(6);
  settimer = EEPROM.read(7);
  setdate = EEPROM.read(8);
}

void loop()
{
if (gprsSerial.available()) {
    gval = "";                      // Переменная для хранения ответа модуля
      gval = waitgsm();                 // Получаем ответ от модема для анализа
 Serial.println(gval);
  if (gval.indexOf(F("+CMT")) > -1) {  // если обнаруженa СМС
   gval.toLowerCase();
   cmtexo();    
  }
  else if(gval.indexOf(F("+CSQ")) > -1) {
    p = gval.indexOf(F("+CSQ:"));    
        signal = gval.substring(p+5, p+8).toInt();
  }
}  
  on_led_off();
  poliv();
  text();

 // обработка кнопок
  if (key() == 1) menu(); // если нажата селект
  else if (key() == 3) digitalWrite(outPin, LOW);
  else if (key() == 4) {
    digitalWrite(outPin, HIGH);
    flag = false;
  }

  else if (key() == 2) digitalWrite(outLedRelay, LOW);
  else if (key() == 5) digitalWrite(outLedRelay, HIGH);

// уровень сигнала
  if (millis() - previousMillis_signal > 1000)
    {
      previousMillis_signal = millis();
      val_signal++;
      }
    if (val_signal >= time_signal)
    {
      val_signal = 0;
      gprsSerial.println(F("AT+CSQ"));
    }
     lcd.setCursor(0, 2); lcd.print("GSM: ");   lcd.setCursor(5, 2);  lcd.print(signal);
//////


  // сравниваем время и управляем выходом//
  if (settimer == 1) {
    for (i = 0; i < 7; i++) {
      if (nedela[setdate][i] == time.weekday) {

        if (setMinClockOn == time.minutes && setHorClockOn == time.Hours
            && setSecClockOn == time.seconds) digitalWrite(outPin, LOW);
      }
    }
  }
  if (setMinClockOff == time.minutes && setHorClockOff == time.Hours
      && setSecClockOff == time.seconds) digitalWrite(outPin, HIGH);
      
  ha = dhta.readHumidity(); // Считываем влажность датчика 1
  hb = dhtb.readHumidity(); // Считываем влажность датчика 2
  ta = dhta.readTemperature(); // Считываем температуру датчика 1
  tb = dhtb.readTemperature(); // Считываем температуру датчика 2
 
  lcd.setCursor(0, 0); lcd.print("\1 ");
   lcd.setCursor(2, 0);  lcd.print(poliv_text);
 
  lcd.setCursor(7, 0); lcd.print(poliv_relay);
  lcd.setCursor(12, 0); lcd.print(time.gettime("H:i:s"));
  lcd.setCursor(0, 1); lcd.print("Teplo: ");
 lcd.setCursor(7, 1); lcd.print(teplo_text);
 
 lcd.setCursor(0, 3); lcd.print("Dom: "); lcd.print(ta); lcd.print(" C");
lcd.setCursor(11, 3); lcd.print("Tep: "); lcd.print(tb); lcd.print(" C");
 }

 

b707
Offline
Зарегистрирован: 26.05.2017

smesharik пишет:

Так вот, как сильно будет и будет ли вообще влиять на работу если я строчку и их подобные String обьявлю не в начале

а в самой функции

Если переменные используются только в одной функции, правильнее делать их локальными.

А вообще, если вы хотите сэкономит память - не пользуйтесь классом String и положите все статичные строки в PROGMEM

pasha413
Offline
Зарегистрирован: 27.11.2016

Нашел тут проект умной теплицы:
https://github.com/Porokhnya/GreenhouseProject

smesharik
Offline
Зарегистрирован: 31.01.2016

pasha413 пишет:
Нашел тут проект умной теплицы: https://github.com/Porokhnya/GreenhouseProject

сенк, этих проектов на просторах инета ....

у меня все в принципе работает, только когда Глобальные переменные подходят к 60+%, начинает глячить строка 

sms(String(F("Dom: ")) + ta + String(F(" C / ")) + ha + String(F(" %")) + String(F("\n")) + String(F("Tep: ")) + tb + String(F(" C / ")) + hb
    + String(F(" %")) + String(F("\n")) + String(F("Poliv: ")) + poliv_relay + String(F(" / ")) + poliv_text + String(F("\n")) + String(F("Obogrev: ")) + teplo_text);

достаточно длинная, перестает приходить в смс целиком или только отрывки ее, вот и приходится уменьшать эту память, чтобы работала

pasha413
Offline
Зарегистрирован: 27.11.2016

вот немного доработал. отправляет на несколько номеров. 

при включении проверяет уровень сигнала. в Инфо смс пишет уровень сигнала.

после отправки смс проверяет баланс, если менее 30р отправляет смс об этом (пока не решил вопрос ограничения отправки смс, для экономии при минимальном балансе).

при звонке на сигналку прослушка помещения.

прежим пауза  - останавливаем выполнение программы на заданное время.

// 0 (основной) мастер-номер добавляется при первом звонке либо смс на систему.
/* Команды управления для 0 мастер-номера: 
 *  "reset"                 сброс настроек и номеров на заводские.
 *  "master1:79112345678"   добавить номер 79112345678 в ячейку памяти 1.
 *  "dell:1"                удалить номер из ячейки 1.
 *  "balance:100"           номер баланса *100#.
 *  "phone"                 вывести список номеров в системе.
 */  
/* Команды управления для остальных мастер-номеров: 
 *  "info" либо "?"         инфо о состояни системы и уровня сигнала сети. 
 *  "temp"                  проверка температуры
 *  "money"                 проверка баланса
 *  "pause10"               пауза сигнализации (для прохода, не реагирует) 10 минут, от 1 до 60 минут
 *  "system on\off"         вкл/выкл охрану
 *  "ring on\off"           вкл/выкл вызов при аварии или сработке сигнализации
 *  "sms on\off"            вкл/выкл смс при аварии или сработке сигнализации
*/
// после отправки смс проверяет баланс.
// при звонке на номер сигнализации - прослушка помещения
// длинна сообщения 115 символов

#include <EEPROM.h> 
#include <OneWire.h>
#include <RCSwitch.h>
#include <SoftwareSerial.h>
#define Ver F("Alarm  v4.3.7\n")

OneWire ds(3);                  // датчик температуры подключен к 3 пину, подтяжка 4.7кОм на +.
SoftwareSerial gsm(10, 11);       // модем подключен к 7 и 8 пинам.
RCSwitch mySwitch = RCSwitch(); // беспроводной датчик двери, пин 2.

#define DOOR 4             // пин 4. концевик двери.
#define PIR 5              // пин 5. датчик движения.
#define LED 13             // пин 13. состояние системы.
#define GAS 14             // пин A0. датчик дыма.
#define BUZ 15             // пин A1. сирена.
#define sarai 3258553      // адрес 433 передатчика геркона двери

// DOOR     - если сработал, на входе "+" HIGH.
// SARAI    - если сработал, на пин 2 сигнал.
// PIR      - если сработал, на входе "+" HIGH.
// GAS      - если сработал, на входе "+" HIGH.
// BUZ      - если "-" LOW, то горит. 
// LED      - если "-" LOW, то горит.

#define on "on"     // вкл
#define off "off"   // выкл

int8_t ModemID = 0;         //    тип модема
boolean Guard = 0;          // 1. охрана:                         1 - вкл, 0 - выкл.
boolean AlarmRING = 0;      // 2. вызов при сработке:             1 - вкл, 0 - выкл.
boolean SendSMS = 0;        // 3. отправка смс при сработке:      1 - вкл, 0 - выкл.
boolean DOORon = 0;         // 4. контроль концевика двери:       1 - вкл, 0 - выкл.    
boolean SARAIon = 0;        // 4. контроль концевика двери 2:     1 - вкл, 0 - выкл.    
boolean PIRon = 0;          // 5. контроль датчика движения:      1 - вкл, 0 - выкл.
boolean GASon = 0;          // 6. контроль датчика дыма:          1 - вкл, 0 - выкл.
boolean Sirena = 0;         // 7. сирена:                         1 - вкл, 0 - выкл. 
boolean Firststart = 1;     // первый старт.

boolean DOORFlag = 0;       // флаг состояние датчика двери.
boolean SARAIFlag = 0;      // флаг состояние датчика двери 2.
boolean PIRFlag = 0;        // флаг состояние датчика движения.
boolean GASFlag = 0;        // флаг состояние датчика газа.
int8_t DOORState = LOW;    // Состояние концевика двери.
int8_t PIRState = LOW;     // Состояние датчика движения.
int8_t LEDState = HIGH;    // Состояние светодиода.
int8_t Smoky = LOW;        // Состояние датчика газа.
boolean sendsmscaller = 1;  // разрешение отправки смс.

int Temp = 0;
char CSQ[4];                    // для хранения уровня сигнала
char Bal[4];                    // для временного хранения номера баланса.   
char Phone[14];                 // для временного хранения номера телефона, номер до 14 цифр.      

String RingPhone = "";          // номер звонившего.
String AlarmPhone[5];           // номера для постановки/снятии с охраны и отправки смс.
byte Adress[5] = {25, 40, 55, 70, 85}; // ячейки для пяти номеров в ЕЕПРОМ.

int p = 0;
#define GASThres 400           // предельная концентрация газа
#define interval_alarm 20      // Секунд до отключения "тревожного" пина. 
int previousMillis_alarm = 0;
#define interval_led 1000      // для мигания LED, 1 сек.
int previousMillis_led = 0;
#define interval_door 10       // секунд не смотрим на датчик двери.
int previousMillis_door = 0;
#define interval_sarai 10      // секунд не смотрим на датчик двери 2.
int previousMillis_sarai = 0;
#define interval_pir 20        // секунд не смотрим на датчик движения.
int previousMillis_pir = 0;
#define interval_gas 600       // секунд не смотрим на датчик газа. 10минут
int previousMillis_gas = 0;

/* EEPROM Data:
  № ячейки - значение:
  0 - если записана не 1, то необходимо затереть eeprom и восстановить стандартную конфигурацию.
  1 - Guard = 0;       // охрана:                0 - выкл.
  2 - AlarmRING = 1;   // звонок:                1 - вкл. 
  3 - SendSMS = 1;     // отправка смс:          1 - вкл.
  4 - DOORon = 1;      // концевик двери:        1 - вкл.
  5 - SARAIon = 1;     // концевик двери сарая:  1 - вкл.
  6 - PIRon = 1;       // датчик движения:       1 - вкл.
  7 - GASon = 1;       // датчик дыма:           1 - вкл.
  8 - Sirena = 1;      // сирена:                1 - вкл.
  10 - Firststars = 1; // первый запуск          1.
  20 - ячейка памяти баланса,
  25, 40, 55, 70, 85 - ячейки памяти телефонов.
  100 - ячейка памяти номера последнего звонившего RingPhone.
*/

void setup() { /// === настройка программы === ///
  Serial.begin(9600); 
  Serial.println(Ver); 
  pinMode(DOOR, INPUT_PULLUP);      // вход датчика двери с подтяжкой на +.
  pinMode(PIR, INPUT);           
  pinMode(GAS, INPUT);           
  pinMode(BUZ, OUTPUT);
  pinMode(LED, OUTPUT);             // светодиод горит во время запуска.
    digitalWrite(BUZ, HIGH);        // сирена выкл.
    digitalWrite(PIR, HIGH);        // игнорируем при включении.
  mySwitch.enableReceive(0);        // 433 приемник на 2 пине
  InitModem();                      // запускаем инициализация модема.
  eepromconfig();
  Serial.println(eepromphone()); 
  Signal();  
  TempC();
  Serial.println(eepromtext() + F("\nSignal seti: ") + CSQ + F("%\nTemp ") + Temp + "*C"); // закомментировать если смс
//sms(eepromtext() + "\n" + TempC() + F("\nSignal seti: ") + CSQ + "%", 0); // смс на последний номер
    digitalWrite(LED, HIGH);        // гасим светодиод состояния сигнализации. 
}  
                                 
void loop() {  /// === основной цикл программы === ///
  AlarmPinOff();    // выключаем сирену, если прошло  время.
  if (Guard == 1) { // если на охране
    Detect();       // проверяем датчики.
    Led();          // моргаем светодиодом.
  }
  if (gsm.available()) {                      // Если модем, что-то отправил...
      sendsmscaller = 1;
      String gval = "";                      // Переменная для хранения ответа модуля
      if (gsm.available()) {     // если GSM модем что-то послал.
        while (gsm.available()) {  // сохраняем входную строку в переменную val.
          char ch = gsm.read();
           gval += char(ch);              // собираем принятые символы в строку
           delay(3);
        } 
      } 
      if (gval.indexOf(F("+PBREADY")) > -1) InitModem();
      else if (gval.indexOf(F("+CLIP")) > -1) {        // если обнаружен вызов.
  Serial.println(F("Process RING"));                              
        int ind = gval.indexOf(F("+CLIP: \""));          // обрезаем номер 
        if (ModemID == 1 || ModemID == 3) ind += 8;                         // Парсим строку и
        else if (ModemID == 2) ind += 9;
        String ring = gval.substring(ind, gval.indexOf("\"", ind));
  Serial.println(String(F("RingPhone->")) + ring);                            
        if (CheckPhone(ring) == 1)   sendATCommand("ATA", true);               // снимаем трубку  
        else  sendATCommand("ATH", true);  
      } else if (gval.indexOf(F("+CMT")) > -1) {  // если обнаруженa СМС
  Serial.println(F("Process CMT"));                            
        parsesms(gval);
      } else if(gval.indexOf(F("+CUSD:")) > -1) { // если пришел баланс 
        String bal = "";
        if (ModemID == 3) {
        // команда проверки баланса  AT+CUSD=1,#105#,15
        // анализируем строку 
          int p1 = gval.indexOf("\"");         // начало строки
          int p2 = gval.lastIndexOf("\"");     // конец строки
          gval = gval.substring(p1+1,p2);
        Serial.println(F("Input string:"));    // пишем в порт пришедшую строку
        Serial.println(gval);
  Decode7bit(gval, bal);
        Serial.println(F("Decode string:"));   // пишем в порт конвертированную строку
        } else if (ModemID == 1 || 2) {
          bal = gval.substring(gval.indexOf("\"") + 8, gval.indexOf("\",") -2 );  //
        }
        bal.trim();
        float BAL = bal.toFloat();
        if (BAL < 30.00) {     // если меньше 30руб
  Serial.println(String(F("malo deneg: ")) + bal + "r.");                                 // закомментировать если смс
//sms(String(F("Malo deneg! balance: ")) + bal + "r.", 0);    // смс на последний звонивший
        } else {
  Serial.println(String(F("Sim balance: ")) + BAL + "r.\n");       // закомментировать если смс
//sms(String(F("SIM balance: ")) + bal + "r.", 0);    // смс на последний звонивший
        }
        sendATCommand(F("AT+CUSD=0"), true);              
       } else gval = "";
  } else if (Serial.available()) {           // если в мониторе порта что-то ввели
      String sval = "";
      while (Serial.available()) {         // сохраняем входную строку в переменную val.
        char ch = Serial.read();
        sval += char(ch);                   // собираем принятые символы в строку
        delay(3);
        } 
        sendsmscaller = 0;
  Komand(sval);                        // запускаем консольную программу
//        sendsmscaller = 1;
    }
}

void parsesms(String msg) {
  String msgheader = "";
  String msgsms    = "";
  String msgphone  = "";
  
  msg = msg.substring(msg.indexOf(F("+CMT: ")));
  msgheader = msg.substring(0,msg.indexOf("\r"));            // Выдергиваем телефон

  msgsms = msg.substring(msgheader.length() + 2);
  msgsms = msgsms.substring(0, msgsms.lastIndexOf("OK"));  // Выдергиваем текст SMS
  msgsms.trim();

  int Index = msgheader.indexOf(F("+CMT:"));
  Index += 8;                         // Парсим строку и
  msgphone = msgheader.substring(Index, msgheader.indexOf("\"", Index));
  msgphone.trim();

  Serial.println(String(F("Phone: ")) + msgphone);    // Выводим номер телефона
  Serial.println(String(F("Message: ")) + msgsms);    // Выводим текст SMS
  if (CheckPhone(msgphone) == 1) Komand(msgsms);
}

int CheckPhone(String phone) { /// === проверка телефона === ///
  if (Firststart == 0) {                        // если не первый старт
    for (uint8_t i = 0; i < 5; i++) {
      if (phone == AlarmPhone[i]) { // если есть вызов, и он наш
        phone = AlarmPhone[i];              // запоминаем его.
        RingPhone = AlarmPhone[i];              // запоминаем его.
        RingPhone.toCharArray(Phone, 14);   
        EEPROM.put(100, Phone);                 // записываем RingPhone в память. 
        return 1;                               // возвращаем 1 - номер наш!
      } 
    } return 0;                                 // возвращаем 0 - номер не наш!
  } else if (Firststart == 1) {                 // иначе (если первый старт)
// первый звонивший добавляется как основной мастер номер для управления сигнализацией
        sendATCommand("ATH", true);               // кладем трубку
        phone.toCharArray(Phone, 14);
        EEPROM.put(25, Phone);                    // пишем номер в EEPROM
        EEPROM.put(100, Phone);                   // записываем RingPhone в память. 
        AlarmPhone[0] = Phone;                    // запишем
        RingPhone = Phone;                        // запоминаем его.
        EEPROM.update(10, 0);                     // обновляем Firststart
        Firststart = 0;                           // пишем 0
//  Serial.println(String(F("Firststart:")) + Firststart);
sms(String(F("Master0->")) + phone + " Add", 0);     // смс на звонивший
//  приходит смс в виде: " Master0->79111234567 Add "
    } return 0;                               
}

void eepromconfig() { /// === конфигурирование сигнализации === ///
    if (EEPROM.read(0) != 1) {           // если записана не 1
      for (int i = 0 ; i < 512 ; i++) {  // переписываем все ячейки
        EEPROM.write(i, 0);
      }                      // и записываем:
      EEPROM.update(1, 0);   // Guard       охрана выкл.
      EEPROM.update(2, 0);   // AlarmRING   вызов вкл.
      EEPROM.update(3, 0);   // SendSMS     смс вкл.
      EEPROM.update(4, 0);   // DOORon      датчики дверей вкл.
      EEPROM.update(5, 0);   // SARAIon     датчики дверей вкл.
      EEPROM.update(6, 0);   // PIRon       датчик движения вкл.
      EEPROM.update(7, 0);   // GASon       датчик газа вкл.
      EEPROM.update(8, 0);   // Sirena      сирена вкл.
      EEPROM.update(10, 1);  // Firststart  первый старт!.
      EEPROM.update(20, 0);  // баланс, записываем массив в EEPROM 
      EEPROM.update(0, 1);   // 
  Serial.println(F("EEPROM != 1/ RESET!")); 
    } if (EEPROM.read(0) == 1) {
      Guard      = EEPROM.read(1);   // Охрана
      AlarmRING  = EEPROM.read(2);   // Вызов
      SendSMS    = EEPROM.read(3);   // Отправка смс
      DOORon     = EEPROM.read(4);   // Датчик двери
      SARAIon    = EEPROM.read(5);   // Датчик двери
      PIRon      = EEPROM.read(6);   // Датчик движения
      GASon      = EEPROM.read(7);   // Датчик газа/дыма
      Sirena     = EEPROM.read(8);   // сирена
      Firststart = EEPROM.read(10);  //
    }
}

String eepromtext() { /// === состояние системы === ///
   String SIGN = "";         // текущее состояние системы.
   String SIRENA = "";       // аварийная сирена.
   String RING = "";         // текущее состояние вызов.
   String SMS = "";          // текущее состояние смс.
   String Door = "";         // текущее состояние датчика двери.
   String Sarai = "";        // текущее состояние датчика двери.
   String Pir = "";          // текущее состояние датчика движения.
   String Gas = "";          // текущее состояние датчика газа.
   if (Guard == 1) SIGN = F("System on\n"); else SIGN = F("System off\n");
   if (Sirena == 1) SIRENA = F("Sirena on\n"); else SIRENA = F("Sirena off\n");
   if (AlarmRING == 1) RING = F("Ring on\n"); else RING = F("Ring off\n");
   if (SendSMS == 1) SMS = F("SMS on\n"); else SMS = F("SMS off\n");
   if (DOORon == 1) Door = F("Door on\n"); else Door = F("Door off\n");
   if (SARAIon == 1) Sarai = F("Sarai on\n"); else Sarai = F("Sarai off\n");
   if (PIRon == 1) Pir = F("Pir on\n"); else Pir = F("Pir off\n");
   if (GASon == 1) Gas = F("Gas on\n"); else Gas = F("Gas off\n");
    String LastEvent = SIGN + RING + SMS + SIRENA + Pir + Door + Sarai + Gas + String(F("Pause0-60min"));             // полное состояние системы и датчиков.
    return LastEvent;
}

String eepromphone() { /// === чтение мастер-номеров из EEPROM === ///
    for (int i = 0; i < 5 ; i++) {
      EEPROM.get(Adress[i], Phone);        // считываем мастер-номера 
      AlarmPhone[i] = Phone;
    }
    String numbers = "[0] " + AlarmPhone[0] + "\n[1] " + AlarmPhone[1] + "\n[2] " + AlarmPhone[2] + "\n[3] " + AlarmPhone[3] + "\n[4] " + AlarmPhone[4] + "\n";
    EEPROM.get(100, Phone);                // считываем номер последнего звонившего
    RingPhone = Phone;
    String ring = String(F("Ring ")) + RingPhone + "\n";
    EEPROM.get(20, Bal);                   // считываем номер баланса
    String bal = String(F("Balance *")) + Bal + "#\n"; 
    String EEPhone = numbers + ring + bal;
    return EEPhone;
}

void Detect() { /// === чтение датчиков === ///
  DOORState = digitalRead(DOOR);
  PIRState = digitalRead(PIR);
  Smoky = analogRead(GAS);
  
  if (DOORon == 1) {
    if (DOORState == HIGH && DOORFlag == 0) {
      previousMillis_door = millis();
      DOORFlag = 1;
//  Serial.println(F("Dver' otkrita!"));
  Alarm();                                // 
    }
    else if (DOORState == LOW && DOORFlag == 1) {
      int currentMillis_door = millis();
      if (((currentMillis_door - previousMillis_door) / 1000 > interval_door)) {
        DOORFlag = 0;
      }
    }
  }
  if (SARAIon == 1) {
    if (mySwitch.available()) {
      unsigned long value = mySwitch.getReceivedValue();
      if (value == sarai && SARAIFlag == 0) {
        previousMillis_sarai = millis();
        SARAIFlag = 1;
//  Serial.println(F("Sarai otkrit!"));
  Alarm();                                // 
      }
      mySwitch.resetAvailable();
    }
    int currentMillis_sarai = millis();
    if (((currentMillis_sarai - previousMillis_sarai) / 1000 > interval_sarai)) {
      SARAIFlag = 0;
    }
  }
  if (PIRon == 1) {
    if (PIRState == HIGH && PIRFlag == 0) {
      previousMillis_pir = millis();
      PIRFlag = 1;
//  Serial.println(F("Dvizhenie u dveri!"));
  Alarm();                                // 
    }
    else if (PIRState == LOW && PIRFlag == 1) {
      int currentMillis_pir = millis();
      if (((currentMillis_pir - previousMillis_pir) / 1000 > interval_pir)) {
        PIRFlag = 0; 
      }
    }
  }
  if (GASon == 1) {
    if ((Smoky > GASThres) && GASFlag == 0) {
      previousMillis_gas = millis();
      GASFlag = 1;
      delay(100);
//  Serial.println(F("Gas v dome!"));
  Alarm();                                // 
    }
    else if ((Smoky < GASThres) && GASFlag == 1) {
      int currentMillis_gas = millis();
      if (((currentMillis_gas - previousMillis_gas) / 1000 > interval_gas)) {
        GASFlag = 0; 
      }
    }
  }
}

void Alarm() { /// === запускаем сирену и отправку смс === ///
    previousMillis_alarm = millis();
    if (Sirena == 1) digitalWrite(BUZ, LOW);
    Serial.println(F("Alarm!!!"));  
    if (SendSMS == 1) {
        if (DOORFlag == 1) {
sms(F("Dver' otkrita!"), 1); // смс на все номера
        }
        else if (SARAIFlag == 1) {
sms(F("Sarai otkrit!"), 1); // смс на все номера
        }
        else if (PIRFlag == 1) {
sms(F("Dvizhenie y dveri!"), 1); // смс на все номера
        }
        else if (GASFlag == 1) {
sms(F("Gas v dome!"), 1); // смс на все номера
        }
    }
    if (AlarmRING == 1) {
      sendATCommand("ATD+" + String(AlarmPhone[0]) + ";", true);              // вывключить эхо
    }
}

void AlarmPinOff() { /// === если прошло время, отключаем сирену === ///      
  int currentMillis_alarm = millis();
  if (((currentMillis_alarm - previousMillis_alarm) / 1000 > interval_alarm) || Guard == 0) {
    digitalWrite(BUZ, HIGH);
  } 
}

void GuardOff() { /// === выключение сигнализации === ///
    Guard = 0;
    EEPROM.update(1, Guard);
//  Serial.println(F("System->on"));
sms(F("System->off"), 1); // смс на все номера
}

void GuardOn() { /// === включение сигнализации === ///       
    Guard = 1;
    EEPROM.update(1, Guard);
//  Serial.println(F("System->off"));
sms(F("System->on"), 1); // смс на все номера
}

void Led() { /// === состояние светодиода === ///
  int currentMillis_led = millis();  // светодиод моргает
  //проверяем не прошел ли нужный интервал, если прошел то
    if (currentMillis_led - previousMillis_led > interval_led) {
      // сохраняем время последнего переключения
      previousMillis_led = currentMillis_led;
      // если светодиод не горит, то зажигаем, и наоборот
      if (LEDState == HIGH) LEDState = LOW;
      else LEDState = HIGH;
      digitalWrite(LED, LEDState);
    }
}

void Komand(String kom) { /// === мастер смс === ///
  Serial.println("Kom->" + kom);
  kom.toLowerCase();
  if (RingPhone == AlarmPhone[0] || sendsmscaller == 0) {        // команды выполняются только с 0 мастер номера
    if (kom.indexOf(F("reset")) > -1)    { // полный сброс ЕЕПРОМ
sms(F("System Full Reset!"), 0); // смс на последний номер
      EEPROM.write(0, 0);
  eepromconfig();
  Serial.println(eepromtext());
  Serial.println(eepromphone());
    } else if ((p = kom.indexOf(F("master"))) > -1)  { // добавление мастер-номера
      master(kom.substring(p + 6, p + 7).toInt(), kom.substring(p + 8, kom.indexOf("\n", p + 8)));
///// sms типа: " master1:79111234567 " - ячейка + номер
    } else if ((p = kom.indexOf(F("balance:"))) > -1) { // добавление номера баланса
      balnum(kom.substring(p + 8, p + 11));
///// sms типа: " balance:100 " - номер баланса
    } else if ((p = kom.indexOf(F("dell:"))) > -1) { // удаление номера из ячейки     
      dellphone(kom.substring(p + 5, p + 6).toInt());
///// sms типа: " dell:1 " - удалить номер из ячейки 1
    } else if (kom.indexOf(F("phone")) > -1)     { // инфо о номерах системы
//  Serial.println(eepromphone());
sms(eepromphone(), 0); // смс на последний номер
    }
  }  
  if ((kom.indexOf(F("info")) > -1) || (kom.indexOf(F("?")) > -1)) {     // инфо о состоянии системы
  Signal();  
sms(eepromtext() + F("\nSignal seti: ") + CSQ + "%", 0);     // смс на последний номер
  } else if (kom.indexOf(F("money")) > -1) {   // запрос баланса
  balance();
  } else if ((p = kom.indexOf(F("pause"))) > -1)  {  // время паузы
      pause(kom.substring(p + 5, p + 7).toInt());
///// sms типа: " pause60 " - время паузы. от 1 до 60 минут
  } else if (kom.indexOf(F("datchiki")) > -1) {
    if (kom.indexOf(on) > -1) {       // вкл 
      DOORon = 1;
      SARAIon = 1;
      PIRon = 1;
      GASon = 1;
      EEPROM.update(4, DOORon);
      EEPROM.update(5, SARAIon);
      EEPROM.update(6, PIRon);
      EEPROM.update(7, GASon);
    } else if (kom.indexOf(off) > -1) {       // выкл 
      DOORon = 0;
      SARAIon = 0;
      PIRon = 0;
      GASon = 0;
      EEPROM.update(4, DOORon);
      EEPROM.update(5, SARAIon);
      EEPROM.update(6, PIRon);
      EEPROM.update(7, GASon);
    }
sms(eepromtext(), 1); // смс на последний номер
  } else if (kom.indexOf(F("system")) > -1)  {  // вкл/выкл сигнализацию
    if (kom.indexOf(on) > -1) GuardOn();
    else if (kom.indexOf(off) > -1) GuardOff();
  } else if (kom.indexOf(F("sirena")) > -1) {     // вкл/выкл сирены
    if (kom.indexOf(on) > -1) {       // вкл 
      Sirena = 1;
      EEPROM.update(8, Sirena);                   
sms(String(F("Sirena->on")), 1); // смс на все номера
    } else if (kom.indexOf(off) > -1) {      // выкл
      Sirena = 0;
      EEPROM.update(8, Sirena);                   
sms(String(F("Sirena->off")), 1); // смс на все номера
    }
  } else if (kom.indexOf(F("ring")) > -1)   { // вкл/выкл вызов при сработке
    if (kom.indexOf(on) > -1)   { // вкл 
      AlarmRING = 1;
      EEPROM.update(2, AlarmRING);
sms(String(F("Ring->on")), 1); // смс на все номера
    } else if (kom.indexOf(off) > -1)   { // выкл 
      AlarmRING = 0;
      EEPROM.update(2, AlarmRING);
sms(String(F("Ring->off")), 1); // смс на все номера
    }
  } else if (kom.indexOf(F("sms")) > -1)    { // вкл/выкл смс при сработке
    if (kom.indexOf(on) > -1)    { // вкл 
      SendSMS = 1;
      EEPROM.update(3, SendSMS);
sms(String(F("SMS->on")), 1); // смс на все номера
    } else if (kom.indexOf(off) > -1)    { // выкл
      SendSMS = 0;
      EEPROM.update(3, SendSMS);
sms(String(F("SMS->off")), 1); // смс на все номера
    }
  } else if (kom.indexOf(F("door")) > -1) {  // вкл/выкл контроль датчика двери
    if (kom.indexOf(on) > -1) {  // выкл
      DOORon = 1;
      EEPROM.update(4, DOORon);
sms(String(F("DOOR->on")), 1); // смс на все номера
    } else if (kom.indexOf(off) > -1) {  // выкл контроль датчика двери
      DOORon = 0;
      EEPROM.update(4, DOORon);
sms(String(F("DOOR->off")), 1); // смс на все номера
    }
  } else if (kom.indexOf(F("sarai")) > -1) {  // вкл/выкл контроль датчика двери 2
    if (kom.indexOf(on) > -1) {  // вкл
      SARAIon = 1;
      EEPROM.update(5, SARAIon);
sms(String(F("SARAI->on")), 1); // смс на все номера
    } else if (kom.indexOf(off) > -1) {  // выкл 
      SARAIon = 0;
      EEPROM.update(5, SARAIon);
sms(String(F("SARAI->off")), 1); // смс на все номера
    }
  } else if (kom.indexOf(F("pir")) > -1) {  // вкл/выкл контрол датчика движения
    if (kom.indexOf(on) > -1) {  // вкл
      PIRon = 1;
      EEPROM.update(6, PIRon);
sms(String(F("PIR->on")), 1); // смс на все номера
    } else if (kom.indexOf(off) > -1) {  // выкл
      PIRon = 0;
      EEPROM.update(6, PIRon);
sms(String(F("PIR->off")), 1); // смс на все номера
    }
  } else if (kom.indexOf(F("gas")) > -1) {  // вкл/выкл контроль датчика газа
    if (kom.indexOf(on) > -1) {  // вкл 
      GASon = 1;
      EEPROM.update(7, GASon);
sms(String(F("GAS->on")), 1); // смс на все номера
    } else if (kom.indexOf(off) > -1) {  // выкл 
      GASon = 0;
      EEPROM.update(7, GASon);
sms(String(F("GAS->off")), 1); // смс на все номера
    }
  }
  gsm.println(F("AT+CMGD=1,4")); // стираем смс
}

void Signal() {
    String csq = sendATCommand(F("AT+CSQ"), true);           // 
    csq = csq.substring(csq.indexOf(":") + 2, csq.indexOf(","));
    csq.trim();
    csq.toCharArray(CSQ, 4);
}

void balance() { /// === проверка баланса сим-карты === ///
  EEPROM.get(20, Bal);        // считываем массив символов
  delay(1000);                // ждем секунду, т.к. вылетает с ошибкой
  if (ModemID == 1 || ModemID == 2) {
    sendATCommand(F("AT+CUSD=1"), true);              // вывключить эхо
    sendATCommand(String(F("ATD#")) + Bal + "#;", true); 
  } else if (ModemID == 3) sendATCommand(String(F("AT+CUSD=1")) + ",#" + Bal + F("#,15"), true);  
}

void master (int i, String num) { /// === добавление мастер-номеров === ///
    if (i < 5 && i != 0) {
      num.trim();
      num.toCharArray(Phone, 14); // конвертируем
      AlarmPhone[i] = num;        // пишем номер  
      EEPROM.put(Adress[i], Phone);           // записываем массив в EEPROM 
sms(String(F("Master")) + i + "->" + num + " add", 0); // смс на 0 номер.
    } // else Serial.println(F("MAX number 4!"));             // 4 номера максимум! 
    // 0 номер можно удалить только через RESET!!!
}                              

void dellphone (int i) { /// === удаление мастар-номеров === ///
     if (i < 5 && i != 0) {
sms(String(F("Master")) + i + "->" + AlarmPhone[i] + " dell", 0); // смс на 0 номер
       EEPROM.put(Adress[i], 0);
       AlarmPhone[i] = "";   // обнулим номер
  } 
}

void balnum (String num) { /// === добавляем номер баланса === ///
    num.toCharArray(Bal, 4);   // конвертируем
    EEPROM.put(20, Bal);           // записываем массив в EEPROM 
sms(String(F("Balance->*")) + num + "# Ok", 0); // смс на 0 номер
}

void pause (uint8_t pausa) { /// === добавляем номер баланса === ///
//  Serial.println(String(F("PAUSE ON ")) + pausa + "min");       // закомментировать если смс
sms(String(F("PAUSE ON ")) + pausa + "min", 0); // смс на последний номер
    delay(pausa * 60000); // останавливаем программу на время pausa
//  Serial.println(F("PAUSE OFF"));                               // закомментировать если смс
sms(F("PAUSE OFF"), 0); // смс на последний номер
}

void TempC() {      /// === измеряем температуру === ///
    byte data[2];
    ds.reset();
    ds.write(0xCC);
    ds.write(0x44);
    delay(750);
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
    Temp = (data[1] << 8) + data[0];
    Temp = Temp >> 4;
}

void Decode7bit(String &instr, String &outstr) { /// === декодирование баланса === ///
  byte reminder = 0;
  int bitstate = 7;
  for (unsigned int i = 0; i < instr.length(); i++) {
    byte b = instr[i];
    byte bb = b << (7 - bitstate);
    char c = (bb + reminder) & 0x7F;
    outstr += c;
    reminder = b >> bitstate;
    bitstate--;
    if (bitstate == 0) {
      char c = reminder;
      outstr += c;
      reminder = 0;
      bitstate = 7;
    }
  }
}

void InitModem() { /// === инициализация модема === ///
  gsm.begin(9600);  //Скорость порта для связи Arduino с GSM модулем
  waitConnect();
    String val = sendATCommand(F("ATI"), true);
    if (val.indexOf(F("M590")) > -1) ModemID = 1;
    else if (val.indexOf(F("SIM800")) > -1) ModemID = 2;
    else if (val.indexOf("A6C") > -1) ModemID = 3;
    Serial.println(String(F("ModemID ")) + ModemID + "\n");
       sendATCommand(F("ATE0"), true);              // вывключить эхо
       sendATCommand(F("AT+CLIP=1"), true);         // включить АОН
       sendATCommand(F("AT+CMGF=1"), true);         // включить текстовый формат смс
       sendATCommand(F("AT+CSCS=\"GSM\""), true);   // включить кодировка текста gsm
       sendATCommand(F("AT+CNMI=2,2,0,0,0"), true); // смс прямо в порт
       sendATCommand(F("AT+CREG?"), true);          // регистрация в сети
}

String sendATCommand(String cmd, bool waiting) {
  String atval = "";                            // Переменная для хранения результата
  Serial.println(cmd);                          // Дублируем команду в монитор порта
  gsm.println(cmd);                             // Отправляем команду модулю
  if (waiting) {                                // Если необходимо дождаться ответа...
    long _timeout = millis() + 10000;         // Переменная для отслеживания таймаута (10 секунд)
    while (!gsm.available() && (millis() < _timeout)) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
    if (gsm.available()) {     // если GSM модем что-то послал.
      while (gsm.available()) {  // сохраняем входную строку в переменную val.
        char ch = gsm.read();
        atval += char(ch);              // собираем принятые символы в строку
        delay(3);
      } 
    } else Serial.println(F("Timeout..."));       // ... оповещаем об этом и...
    Serial.println(atval);                      // Дублируем ответ в монитор порта
  }
  return atval;
}

void waitConnect() {  // запуск модема
  int countok = 0;
  uint32_t msAT = 0;
  String str; 
  while(countok < 5) {                      //ждём пять ОК  
    uint32_t ms = millis();
    if(( ms - msAT ) > 500 || ms < msAT ) { // Событие срабатывающее каждые 500 мс 
      msAT = ms;
      Serial.println(">>AT");
      gsm.println("AT");                    // посылаем команду
      str = "";
      delay(100);                           // ждём ответа
    while (gsm.available()) {  // сохраняем входную строку в переменную val.
      char ch = gsm.read();
      str += char(ch);              // собираем принятые символы в строку
      delay(3);
    } 
      if (str.indexOf("OK") > -1) {
        Serial.println("OK"); 
        countok++;
      } else countok = 0;
    }
  }  
}

void sms(String text, byte sendnum) { /// === отправка СМС === ///
    TempC();
    String phone = "";
    if (sendsmscaller == 1) {
      if (sendnum == 0) {                  // отправка смс на номер звонившего
        phone = RingPhone;
  sendATCommand("AT+CMGS=\"+" + phone + "\"", true);            // Переходим в режим ввода текстового сообщения
  sendATCommand(text + F("\nTemp ") + Temp + "*C" + (String)((char)26), true);   // После текста отправляем перенос строки и Ctrl+Z      Serial.println(String(F("SMS send=>")) + phone); 
//  Serial.println(String(F("SMS sended=>")) + phone + "\n" + text); 
      } else if (sendnum == 1) {           // отправка смс на все номера
        for (uint8_t i = 0; i < 4 ; i++) {        
          phone = AlarmPhone[i];
          if (phone != 0) {
  sendATCommand("AT+CMGS=\"+" + phone + "\"", true);            // Переходим в режим ввода текстового сообщения
  sendATCommand(text + F("\nTemp ") + Temp + "*C" + (String)((char)26), true);   // После текста отправляем перенос строки и Ctrl+Z      Serial.println(String(F("SMS send=>")) + phone); 
//  Serial.println(String(F("SMS sended=>")) + phone + "\n" + text); 
          }
        }
      }
  balance();
    } else if (sendsmscaller == 0) Serial.println(text);
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

smesharik пишет:

pasha413 пишет:
Нашел тут проект умной теплицы: https://github.com/Porokhnya/GreenhouseProject

сенк, этих проектов на просторах инета ....

Ну да, много их, только толковых, судя по процитированному ниже - нихера нет:

smesharik пишет:

у меня все в принципе работает, только когда Глобальные переменные подходят к 60+%, начинает глячить строка 

У меня кода почти под завязку в мегу забито (200К), при этом чего только там не нафаршировано - и MQTT, и IoT (ThingSpeak и GardenBoss.ru) как через Wi-Fi, так и через GSM, и управление по SMS (причём всё настраивается без перезаливки прошивки), и куча всяких плюшек. SMS, кстати, на русском туда/сюда гоняются - не вопрос.

Ах, да, забыл - понадобилось всего лишь пару лет на написание и отладку, да и до сих пор расширение функционала идёт. Куда нам до глючащих строк, когда "переменные подходят к 60+%" - я к этому только стремлюсь, данный дзен мне пока не по плечу.

smesharik
Offline
Зарегистрирован: 31.01.2016

DIYMan пишет:

smesharik пишет:

pasha413 пишет:
Нашел тут проект умной теплицы: https://github.com/Porokhnya/GreenhouseProject

сенк, этих проектов на просторах инета ....

Ну да, много их, только толковых, судя по процитированному ниже - нихера нет:

smesharik пишет:

у меня все в принципе работает, только когда Глобальные переменные подходят к 60+%, начинает глячить строка 

У меня кода почти под завязку в мегу забито (200К), при этом чего только там не нафаршировано - и MQTT, и IoT (ThingSpeak и GardenBoss.ru) как через Wi-Fi, так и через GSM, и управление по SMS (причём всё настраивается без перезаливки прошивки), и куча всяких плюшек. SMS, кстати, на русском туда/сюда гоняются - не вопрос.

Ах, да, забыл - понадобилось всего лишь пару лет на написание и отладку, да и до сих пор расширение функционала идёт. Куда нам до глючащих строк, когда "переменные подходят к 60+%" - я к этому только стремлюсь, данный дзен мне пока не по плечу.

мне бы вашу голову и столько лет терпения

но пока что имеем то имем, уровень програмирования у меня начальный, может что и сотворю подглядывая за асами 

AleksandrM
Offline
Зарегистрирован: 20.07.2017

pasha413 Подскажи  как удержать поднятой трубу на модеме до отбоя звонившим вот в зтом моменте?

if (CheckPhone(val) == 1)  sendATCommand("ATA", true);

?

?

sendATCommand("ATh", true);

В поседнем скетче (Вашем) модем A6mini не определяеться пришлось поправить строку в ответе модема  (А6С)поменять на (А6)

else if (val.indexOf("A6C") > -1) ModemID = 3;

 

 

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

DIYMan пишет:
да почти под завязку в мегу забито (200К), при этом чего только там не нафаршировано - и MQTT, и IoT (ThingSpeak и GardenBoss.ru) как через Wi-Fi, так и через GSM, и управление по SMS (причём всё настраивается без перезаливки прошивки), и куча всяких плюшек. SMS, кстати, на русском туда/сюда гоняются - не вопрос.

Ах, да, забыл - понадобилось всего лишь пару лет на написание и отладку, да и до сих пор расширение функционала идёт. Куда нам до глючащих строк, когда "переменные подходят к 60+%" - я к этому только стремлюсь, данный дзен мне пока не по плечу.

порадуйте примером правильного кода.

 С удовольствием поучусь.

pasha413
Offline
Зарегистрирован: 27.11.2016

AleksandrM,. sendATCommand("ATA", true); снимает трубку, отбой только звонивший делает

kvolk
Offline
Зарегистрирован: 12.06.2017

pasha413 пишет:
AleksandrM,. sendATCommand("ATA", true); снимает трубку, отбой только звонивший делает

Оператор сотовой связи так не думает :)

pasha413
Offline
Зарегистрирован: 27.11.2016

kvolk, ваши доказательства)))
сам проверял, на модеме А6С "АТА" поднимает трубку, сбрасываю сам, по крайней мере пару минут слушал

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

kvolk пишет:

pasha413 пишет:
AleksandrM,. sendATCommand("ATA", true); снимает трубку, отбой только звонивший делает

Оператор сотовой связи так не думает :)

Зато модем так "думает".

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Short Circuit пишет:

порадуйте примером правильного кода.

 С удовольствием поучусь.

Не сказал бы, что он прям очень-очень правильный - на вкус и цвет все фломастеры, как известно... А ссылку уже давал, помнится даже в этой теме: https://github.com/Porokhnya/GreenHouseProject

Сам код - не панацея, проекту пару лет уже, периодически устраиваю рефакторинги. Впрочем, это кроме меня мало кому интересно :)

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

pasha413 пишет:

вот немного доработал. отправляет на несколько номеров. 

при включении проверяет уровень сигнала. в Инфо смс пишет уровень сигнала.

после отправки смс проверяет баланс, если менее 30р отправляет смс об этом (пока не решил вопрос ограничения отправки смс, для экономии при минимальном балансе).

при звонке на сигналку прослушка помещения.

прежим пауза  - останавливаем выполнение программы на заданное время.


 

//============= анализ ответа и таймер ожидания  ответа ===========
//int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout)
int8_t GetAnsw1(char* expected_answer, unsigned int timeout)
{    uint8_t x=0, answer=0; char response[100]; unsigned long previous;
     memset(response, '\0', 100); delay(100); // очистка буфера и задержка
     while( gsm.available() > 0) gsm.read();  // Wait for clean input buffer
   //  gsm.println(ATcommand);                  // Send the AT command 
     previous = millis();                     // this loop waits for the answer
     do{ if (gsm.available() != 0) { response[x] = gsm.read(); x++; // если есть данные,записываем и проверяем                                    
        if (strstr(response, expected_answer) != NULL)  {answer = 1;}  // check if the desired answer is in the response of the module
        } Serial.print (F("answer= ")); delay(1000); Serial.println(answer); delay(1); wdt_reset();
       } while((answer == 0) && ((millis() - previous) < timeout));  // Waits for the answer with time out 
        return answer;
}
//=================================================================
gsm.println(F("AT+SAPBR=1,1"));
   GetAnsw1("OK", 17000);

   if (answer == 1) {Serial.println (F("GetAnsw1 = OK")); delay(100); count1 = 0; } 
   if (answer == 0) {............... }

 

вот тут конструкция на мой взгляд неплохая. можно использовать с контролем ожидаемого ответа в том числе.

kvolk
Offline
Зарегистрирован: 12.06.2017

pasha413 пишет:
kvolk, ваши доказательства))) сам проверял, на модеме А6С "АТА" поднимает трубку, сбрасываю сам, по крайней мере пару минут слушал

Ссылка вставляется криво, ищите в поисковике по ключу "Ограничение длительности разговора сотовыми операторами". 

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

вам 30  минут будет мало?

kvolk
Offline
Зарегистрирован: 12.06.2017

Short Circuit пишет:

вам 30  минут будет мало?

Дело не в "много" или "мало". Перечитайте пост, не поняли в чём суть - читайте ещё.

smesharik
Offline
Зарегистрирован: 31.01.2016

кто может подсказать, пытаюсь инет прикрутить к Sim800

в код добавил доступ в интернет к void InitModem добавил

    sendATCommand(F("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\""), true); 
    sendATCommand(F("AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\""), true);        
    sendATCommand(F("AT+SAPBR=3,1,\"USER\",\"mts\""), true);
    sendATCommand(F("AT+SAPBR=3,1,\"PWD\",\"mts\""), true);
    sendATCommand(F("AT+SAPBR=0,1"), true); 
    sendATCommand(F("AT+SAPBR=1,1"), true); 
    sendATCommand(F("AT+SAPBR=2,1"), true);
    sendATCommand(F("AT+HTTPINIT"), true);
    sendATCommand(F("AT+HTTPPARA=\"CID\",1"), true);

и сам запрос вида в loop()


 sendATCommand(("AT+HTTPPARA=\"URL\",\"htt_p//site.ru/test.php?t=44444\""), true);
sendATCommand(F("AT+HTTPACTION=0"), true); 

1. при подключенной ардуинки к компу с питанием модема запрос обрабатывается замечательно,

2. отключаешь USB от ардуинки. но с включенным питанием системы без переcброса, запросы так же обрадатываются

3. отключаешь USB включаешь обычное питании запрос не идет

что может быть такое?

p.s. htt_p без _

kvolk
Offline
Зарегистрирован: 12.06.2017

smesharik пишет:

1. при подключенной ардуинки к компу с питанием модема запрос обрабатывается замечательно,

2. отключаешь USB от ардуинки. но с включенным питанием системы без переcброса, запросы так же обрадатываются

3. отключаешь USB включаешь обычное питании запрос не идет

Чем питаете ардуину и модем? Используете повышайку или нет?

smesharik
Offline
Зарегистрирован: 31.01.2016

kvolk пишет:

smesharik пишет:

1. при подключенной ардуинки к компу с питанием модема запрос обрабатывается замечательно,

2. отключаешь USB от ардуинки. но с включенным питанием системы без переcброса, запросы так же обрадатываются

3. отключаешь USB включаешь обычное питании запрос не идет

Чем питаете ардуину и модем? Используете повышайку или нет?

питаю 12V8А, нано стоит на шилде, куда подается питание, модем отдельным проводом от разъема на понижающим dc/dc  

kvolk
Offline
Зарегистрирован: 12.06.2017

smesharik пишет:

питаю 12V8А, нано стоит на шилде, куда подается питание, модем отдельным проводом от разъема понижающим dc/dc  

Параллельно питающим пинам модема повесьте конденсатор 6,3v 2200 мкф. Дайте ссылку на DC-DC.

smesharik
Offline
Зарегистрирован: 31.01.2016

kvolk пишет:

smesharik пишет:

питаю 12V8А, нано стоит на шилде, куда подается питание, модем отдельным проводом от разъема понижающим dc/dc  

Параллельно питающим пинам модема повесьте конденсатор 6,3v 2200 мкф. Дайте ссылку на DC-DC.

на выход дс/дс перед питанием модема?

kvolk
Offline
Зарегистрирован: 12.06.2017

smesharik пишет:

на выход дс/дс перед питанием модема?

Попробуйте так, должно помочь. Или напаяйте прямо на сам модем.

smesharik
Offline
Зарегистрирован: 31.01.2016

kvolk пишет:

smesharik пишет:

на выход дс/дс перед питанием модема?

Попробуйте так, должно помочь. Или напаяйте прямо на сам модем.

думал про питание, запитал от отдльного блока питания ардуинку +5В, толку 0

smesharik
Offline
Зарегистрирован: 31.01.2016

повесил, 2200 на питание модема + 2200 на +5v ардуинку нано

толку ноль

может есть какие то команды дополнительные?!

потому что как то странно, если при подключенном компеон отпавляет запросыкогда пописана команда AT+SAPBR=2,1 Получаем сведения о соединении и IP адрес , так она я понимаю чисто информативная, но без нее не идет

smesharik
Offline
Зарегистрирован: 31.01.2016

Поборол

добавил ЭХО sendATCommand(F("ATE0"), true); все заработало         

pasha413
Offline
Зарегистрирован: 27.11.2016

АТЕ0 выключает эхо

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

smesharik пишет:

У меня вопрос, сейчас пытаюсь оптимизировать свой проект, поглядывая сюда

Так вот, как сильно будет и будет ли вообще влиять на работу если я строчку и их подобные String обьявлю не в начале

 String  AT[] = {"AT+CLIP=1", "AT+CMGF=1", "AT+CSCS=\"GSM\"", "AT+CNMI=2,2,0,0,0" }; // общие АТ команды

а в самой функции

void InitModem() { /// === инициализация модема === ///
   waitConnect();
  String  AT[] = {"AT+CLIP=1", "AT+CMGF=1", "AT+CSCS=\"GSM\"", "AT+CNMI=2,2,0,0,0" }; // общие АТ команды
   for (int i = 0; i < 4; i++) {
   sendATCommand(AT[i], true);         // включить АОН
    }

Экономия существенная

Первый вариант 
Скетч использует 21306 байт (69%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1204 байт (58%) динамической памяти, оставляя 844 байт для локальных переменных. Максимум: 2048 байт.

Второй вариант
Скетч использует 19832 байт (64%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1160 байт (56%) динамической памяти, оставляя 888 байт для локальных переменных. Максимум: 2048 байт.

 

 

а команда AT&W  сэкономит вам еще больше, так как те команды вам не нужно будет посылать вообще...

smesharik
Offline
Зарегистрирован: 31.01.2016

pasha413 пишет:
АТЕ0 выключает эхо

т.е. да, выключил, по умолчанию он включен был, а у меня не прописан вообще, а он на работу без компа влияет оказывается очень сильно

TrampSRV
Offline
Зарегистрирован: 10.09.2017

В очередной раз прошу поддержки и помощи здесь. Как избавиться от ложных срабатываний датчика движения HC0SR501? который подключен к аналоговому входу А0, и он же подтянут к земле 10кОмным резистором. Чаще всего ложные срабатывания идут в момент звонка на модем. Выдержка из моего кода

 

********************
#define PIR A0              //Pir

*******************

void setup() {

 pinMode(PIR, INPUT);                     /// нога нa PIR

}


*******************
void loop() {
if ( digitalRead(PIR)==HIGH){  // проверяем датчик

        
      
    }
}

 

kvolk
Offline
Зарегистрирован: 12.06.2017

TrampSRV пишет:

В очередной раз прошу поддержки и помощи здесь. Как избавиться от ложных срабатываний датчика движения HC0SR501? который подключен к аналоговому входу А0, и он же подтянут к земле 10кОмным резистором. 

Тут описано и схема тоже прилагается в комментариях, решается добавлением конденсатора параллельно резистору.

TrampSRV
Offline
Зарегистрирован: 10.09.2017

Не помогло, так же идут наводки( Пробывал питать датчик и 3,3 и 5 вольтами, картина та же

MaksVV
Offline
Зарегистрирован: 06.08.2015

 

может так попробовать?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

TrampSRV пишет:

В очередной раз прошу поддержки и помощи здесь. Как избавиться от ложных срабатываний датчика движения HC0SR501? который подключен к аналоговому входу А0, и он же подтянут к земле 10кОмным резистором. Чаще всего ложные срабатывания идут в момент звонка на модем. Выдержка из моего кода

 

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

А лучше берите нормальный охранный датчик и не морочьте себе и другим голову, но те датчики все 12вольтовые, за надежность нужно платить.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

pasha413 пишет:

вот немного доработал. отправляет на несколько номеров. ..........

 

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

TrampSRV
Offline
Зарегистрирован: 10.09.2017

Так и есть, поставил другой датчик движения, благо у меня их 3 штуки было, и все стало как надо!!

b707
Offline
Зарегистрирован: 26.05.2017

Short Circuit пишет:

смс нужно обязательно писать на симкарту, и оттуда доставать, периодиески опрашивая. иначе  будут теряться смс

Поддерживаю. Уже писал об этом автору.

В своем проекте не только полностью отказался от попыток ловить СМС-ки "он-лайн" - вообще не анализирую никакие сообщения модема, кроме ответов на явно посланные мной команды. 

Вместо этого настроено сохранение СМС на СИМку и периодическая проверка новых СМС,

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а есть пример?

b707
Offline
Зарегистрирован: 26.05.2017

Short Circuit пишет:

а есть пример?

пример чего

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

что написали выше, скетча с чтением смс.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

что написали выше, пример вашего скетча с чтением смс.

b707
Offline
Зарегистрирован: 26.05.2017

Short Circuit пишет:

что написали выше, пример вашего скетча с чтением смс.

нет, к сожалению готового примера нет. Для работы с модемом А6 взята библиотека sim900.h. переписана под А6, а потом проект переехал на stm32. Так что там, простите, такая каша....

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

ну вот.. а так хорошо все начиналось :)

 

а  где бы из библиотеки вытащить ту часть посмотреть, что смс выдергивают? Пытался порыться, но чтото не нашел в каком там месте оно хранится, можете помочь?

 

посмотреть для примера хочется, всеравно потом все переделать нужно будет.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Short Circuit пишет:

ну вот.. а так хорошо все начиналось :)

 

а  где бы из библиотеки вытащить ту часть посмотреть, что смс выдергивают? Пытался порыться, но чтото не нашел в каком там месте оно хранится, можете помочь?

 

посмотреть для примера хочется, всеравно потом все переделать нужно будет.

Т.е. просто взять, почитать даташит на AT-команды вашего модема - Клапауций запретил жёстко, да? И там найти, какую AT-команду нужно послать, чтобы прочитать СМС из хранящихся? Это НАСТОЛЬКО сложно, что надо обязательно спросить тут? Если работаете с модемом - даташит с описанием AT-команд должен быть настольной книгой. Не ленитесь - откройте и прочитайте, там есть всё.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

у меня есть достаточно сложные программы для сим800, в том числе я давно голос там использую. Но выдернуть из библиотеки саму логику работы с смс пока не получилось.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Short Circuit пишет:

у меня есть достаточно сложные программы для сим800, в том числе я давно голос там использую. Но выдернуть из библиотеки саму логику работы с смс пока не получилось.

Да при чём тут библиотека-то? Я вам про ДАТАШИТ на AT-команды - библиотека общается с модемом с их помощью. Что вам мешает посмотреть? У вас SIM800? Смотрите https://www.elecrow.com/download/SIM800%20Series_AT%20Command%20Manual_V..., читаем со 114 страницы. Всё это заняло у меня 30 секунд - найти страницу, где начинается информация про вычитывание СМС из модема. И я не перетрудился, как видите. Читайте, читайте.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DIYMan пишет:

Читайте, читайте.

Один мой знакомый сказал, что поколение пепси не умеет делать три фундаментальные вещи: читать, писать и говорить. Судя по вопрсам, которые постоянно валятся на сайте, по их стилю и по используемым формулировкам, я склонен согласиться с этим человеком. Ни читать, ни писать, ни говорить большинство не умеет. А Вы "читайте, читайте".