У меня вопрос, сейчас пытаюсь оптимизировать свой проект, поглядывая сюда
Так вот, как сильно будет и будет ли вообще влиять на работу если я строчку и их подобные 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 байт.
вот немного доработал. отправляет на несколько номеров.
при включении проверяет уровень сигнала. в Инфо смс пишет уровень сигнала.
после отправки смс проверяет баланс, если менее 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);
}
Ну да, много их, только толковых, судя по процитированному ниже - нихера нет:
smesharik пишет:
у меня все в принципе работает, только когда Глобальные переменные подходят к 60+%, начинает глячить строка
У меня кода почти под завязку в мегу забито (200К), при этом чего только там не нафаршировано - и MQTT, и IoT (ThingSpeak и GardenBoss.ru) как через Wi-Fi, так и через GSM, и управление по SMS (причём всё настраивается без перезаливки прошивки), и куча всяких плюшек. SMS, кстати, на русском туда/сюда гоняются - не вопрос.
Ах, да, забыл - понадобилось всего лишь пару лет на написание и отладку, да и до сих пор расширение функционала идёт. Куда нам до глючащих строк, когда "переменные подходят к 60+%" - я к этому только стремлюсь, данный дзен мне пока не по плечу.
Ну да, много их, только толковых, судя по процитированному ниже - нихера нет:
smesharik пишет:
у меня все в принципе работает, только когда Глобальные переменные подходят к 60+%, начинает глячить строка
У меня кода почти под завязку в мегу забито (200К), при этом чего только там не нафаршировано - и MQTT, и IoT (ThingSpeak и GardenBoss.ru) как через Wi-Fi, так и через GSM, и управление по SMS (причём всё настраивается без перезаливки прошивки), и куча всяких плюшек. SMS, кстати, на русском туда/сюда гоняются - не вопрос.
Ах, да, забыл - понадобилось всего лишь пару лет на написание и отладку, да и до сих пор расширение функционала идёт. Куда нам до глючащих строк, когда "переменные подходят к 60+%" - я к этому только стремлюсь, данный дзен мне пока не по плечу.
мне бы вашу голову и столько лет терпения
но пока что имеем то имем, уровень програмирования у меня начальный, может что и сотворю подглядывая за асами
да почти под завязку в мегу забито (200К), при этом чего только там не нафаршировано - и MQTT, и IoT (ThingSpeak и GardenBoss.ru) как через Wi-Fi, так и через GSM, и управление по SMS (причём всё настраивается без перезаливки прошивки), и куча всяких плюшек. SMS, кстати, на русском туда/сюда гоняются - не вопрос.
Ах, да, забыл - понадобилось всего лишь пару лет на написание и отладку, да и до сих пор расширение функционала идёт. Куда нам до глючащих строк, когда "переменные подходят к 60+%" - я к этому только стремлюсь, данный дзен мне пока не по плечу.
Не сказал бы, что он прям очень-очень правильный - на вкус и цвет все фломастеры, как известно... А ссылку уже давал, помнится даже в этой теме: https://github.com/Porokhnya/GreenHouseProject
Сам код - не панацея, проекту пару лет уже, периодически устраиваю рефакторинги. Впрочем, это кроме меня мало кому интересно :)
вот немного доработал. отправляет на несколько номеров.
при включении проверяет уровень сигнала. в Инфо смс пишет уровень сигнала.
после отправки смс проверяет баланс, если менее 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;
}
//=================================================================
повесил, 2200 на питание модема + 2200 на +5v ардуинку нано
толку ноль
может есть какие то команды дополнительные?!
потому что как то странно, если при подключенном компеон отпавляет запросыкогда пописана команда AT+SAPBR=2,1 Получаем сведения о соединении и IP адрес , так она я понимаю чисто информативная, но без нее не идет
У меня вопрос, сейчас пытаюсь оптимизировать свой проект, поглядывая сюда
Так вот, как сильно будет и будет ли вообще влиять на работу если я строчку и их подобные 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 сэкономит вам еще больше, так как те команды вам не нужно будет посылать вообще...
В очередной раз прошу поддержки и помощи здесь. Как избавиться от ложных срабатываний датчика движения HC0SR501? который подключен к аналоговому входу А0, и он же подтянут к земле 10кОмным резистором. Чаще всего ложные срабатывания идут в момент звонка на модем. Выдержка из моего кода
********************
#define PIR A0 //Pir
*******************
void setup() {
pinMode(PIR, INPUT); /// нога нa PIR
}
*******************
void loop() {
if ( digitalRead(PIR)==HIGH){ // проверяем датчик
}
}
В очередной раз прошу поддержки и помощи здесь. Как избавиться от ложных срабатываний датчика движения HC0SR501? который подключен к аналоговому входу А0, и он же подтянут к земле 10кОмным резистором.
В очередной раз прошу поддержки и помощи здесь. Как избавиться от ложных срабатываний датчика движения HC0SR501? который подключен к аналоговому входу А0, и он же подтянут к земле 10кОмным резистором. Чаще всего ложные срабатывания идут в момент звонка на модем. Выдержка из моего кода
а кто вам сказал, что ложные из-за этого?? нет конечно. Танцы с бубном не помогут, всякие транзисторы в схему и т.д. - не помогут. Поставьте наружную gsm антенну внешнюю, так как наводки идут на сам пиросенсор, это простейший бюджетный датчик. Проверить легко - закрутить чувствительность пиросенсора в минимальную строну - ложных уменьшится значительно, но не пропадут.
А лучше берите нормальный охранный датчик и не морочьте себе и другим голову, но те датчики все 12вольтовые, за надежность нужно платить.
вот немного доработал. отправляет на несколько номеров. ..........
смс нужно обязательно писать на симкарту, и оттуда доставать, периодиески опрашивая. иначе будут теряться смс, оператор их тупо пачками может слать, да и программе это сильно мешает, во время работы программы смс валится - фигня начинается.
смс нужно обязательно писать на симкарту, и оттуда доставать, периодиески опрашивая. иначе будут теряться смс
Поддерживаю. Уже писал об этом автору.
В своем проекте не только полностью отказался от попыток ловить СМС-ки "он-лайн" - вообще не анализирую никакие сообщения модема, кроме ответов на явно посланные мной команды.
Вместо этого настроено сохранение СМС на СИМку и периодическая проверка новых СМС,
что написали выше, пример вашего скетча с чтением смс.
нет, к сожалению готового примера нет. Для работы с модемом А6 взята библиотека sim900.h. переписана под А6, а потом проект переехал на stm32. Так что там, простите, такая каша....
а где бы из библиотеки вытащить ту часть посмотреть, что смс выдергивают? Пытался порыться, но чтото не нашел в каком там месте оно хранится, можете помочь?
посмотреть для примера хочется, всеравно потом все переделать нужно будет.
а где бы из библиотеки вытащить ту часть посмотреть, что смс выдергивают? Пытался порыться, но чтото не нашел в каком там месте оно хранится, можете помочь?
посмотреть для примера хочется, всеравно потом все переделать нужно будет.
Т.е. просто взять, почитать даташит на AT-команды вашего модема - Клапауций запретил жёстко, да? И там найти, какую AT-команду нужно послать, чтобы прочитать СМС из хранящихся? Это НАСТОЛЬКО сложно, что надо обязательно спросить тут? Если работаете с модемом - даташит с описанием AT-команд должен быть настольной книгой. Не ленитесь - откройте и прочитайте, там есть всё.
у меня есть достаточно сложные программы для сим800, в том числе я давно голос там использую. Но выдернуть из библиотеки саму логику работы с смс пока не получилось.
у меня есть достаточно сложные программы для сим800, в том числе я давно голос там использую. Но выдернуть из библиотеки саму логику работы с смс пока не получилось.
Да при чём тут библиотека-то? Я вам про ДАТАШИТ на AT-команды - библиотека общается с модемом с их помощью. Что вам мешает посмотреть? У вас SIM800? Смотрите https://www.elecrow.com/download/SIM800%20Series_AT%20Command%20Manual_V..., читаем со 114 страницы. Всё это заняло у меня 30 секунд - найти страницу, где начинается информация про вычитывание СМС из модема. И я не перетрудился, как видите. Читайте, читайте.
Один мой знакомый сказал, что поколение пепси не умеет делать три фундаментальные вещи: читать, писать и говорить. Судя по вопрсам, которые постоянно валятся на сайте, по их стилю и по используемым формулировкам, я склонен согласиться с этим человеком. Ни читать, ни писать, ни говорить большинство не умеет. А Вы "читайте, читайте".
У меня вопрос, сейчас пытаюсь оптимизировать свой проект, поглядывая сюда
Так вот, как сильно будет и будет ли вообще влиять на работу если я строчку и их подобные String обьявлю не в начале
а в самой функции
Экономия существенная
smesharik, так выложите проект, поможем)
я не стал использовать ее:
smesharik, так выложите проект, поможем)
я не стал использовать ее:
тоже вариант
Так вот, как сильно будет и будет ли вообще влиять на работу если я строчку и их подобные String обьявлю не в начале
а в самой функции
Если переменные используются только в одной функции, правильнее делать их локальными.
А вообще, если вы хотите сэкономит память - не пользуйтесь классом String и положите все статичные строки в PROGMEM
Нашел тут проект умной теплицы:
https://github.com/Porokhnya/GreenhouseProject
сенк, этих проектов на просторах инета ....
у меня все в принципе работает, только когда Глобальные переменные подходят к 60+%, начинает глячить строка
достаточно длинная, перестает приходить в смс целиком или только отрывки ее, вот и приходится уменьшать эту память, чтобы работала
вот немного доработал. отправляет на несколько номеров.
при включении проверяет уровень сигнала. в Инфо смс пишет уровень сигнала.
после отправки смс проверяет баланс, если менее 30р отправляет смс об этом (пока не решил вопрос ограничения отправки смс, для экономии при минимальном балансе).
при звонке на сигналку прослушка помещения.
прежим пауза - останавливаем выполнение программы на заданное время.
сенк, этих проектов на просторах инета ....
Ну да, много их, только толковых, судя по процитированному ниже - нихера нет:
у меня все в принципе работает, только когда Глобальные переменные подходят к 60+%, начинает глячить строка
У меня кода почти под завязку в мегу забито (200К), при этом чего только там не нафаршировано - и MQTT, и IoT (ThingSpeak и GardenBoss.ru) как через Wi-Fi, так и через GSM, и управление по SMS (причём всё настраивается без перезаливки прошивки), и куча всяких плюшек. SMS, кстати, на русском туда/сюда гоняются - не вопрос.
Ах, да, забыл - понадобилось всего лишь пару лет на написание и отладку, да и до сих пор расширение функционала идёт. Куда нам до глючащих строк, когда "переменные подходят к 60+%" - я к этому только стремлюсь, данный дзен мне пока не по плечу.
сенк, этих проектов на просторах инета ....
Ну да, много их, только толковых, судя по процитированному ниже - нихера нет:
у меня все в принципе работает, только когда Глобальные переменные подходят к 60+%, начинает глячить строка
У меня кода почти под завязку в мегу забито (200К), при этом чего только там не нафаршировано - и MQTT, и IoT (ThingSpeak и GardenBoss.ru) как через Wi-Fi, так и через GSM, и управление по SMS (причём всё настраивается без перезаливки прошивки), и куча всяких плюшек. SMS, кстати, на русском туда/сюда гоняются - не вопрос.
Ах, да, забыл - понадобилось всего лишь пару лет на написание и отладку, да и до сих пор расширение функционала идёт. Куда нам до глючащих строк, когда "переменные подходят к 60+%" - я к этому только стремлюсь, данный дзен мне пока не по плечу.
мне бы вашу голову и столько лет терпения
но пока что имеем то имем, уровень програмирования у меня начальный, может что и сотворю подглядывая за асами
pasha413 Подскажи как удержать поднятой трубу на модеме до отбоя звонившим вот в зтом моменте?
if (CheckPhone(val) == 1) sendATCommand("ATA", true);
?
?
sendATCommand("ATh", true);
В поседнем скетче (Вашем) модем A6mini не определяеться пришлось поправить строку в ответе модема (А6С)поменять на (А6)
else
if
(val.indexOf(
"A6C"
) > -1) ModemID = 3;
Ах, да, забыл - понадобилось всего лишь пару лет на написание и отладку, да и до сих пор расширение функционала идёт. Куда нам до глючащих строк, когда "переменные подходят к 60+%" - я к этому только стремлюсь, данный дзен мне пока не по плечу.
порадуйте примером правильного кода.
С удовольствием поучусь.
AleksandrM,. sendATCommand("ATA", true); снимает трубку, отбой только звонивший делает
Оператор сотовой связи так не думает :)
kvolk, ваши доказательства)))
сам проверял, на модеме А6С "АТА" поднимает трубку, сбрасываю сам, по крайней мере пару минут слушал
Оператор сотовой связи так не думает :)
Зато модем так "думает".
порадуйте примером правильного кода.
С удовольствием поучусь.
Не сказал бы, что он прям очень-очень правильный - на вкус и цвет все фломастеры, как известно... А ссылку уже давал, помнится даже в этой теме: https://github.com/Porokhnya/GreenHouseProject
Сам код - не панацея, проекту пару лет уже, периодически устраиваю рефакторинги. Впрочем, это кроме меня мало кому интересно :)
вот немного доработал. отправляет на несколько номеров.
при включении проверяет уровень сигнала. в Инфо смс пишет уровень сигнала.
после отправки смс проверяет баланс, если менее 30р отправляет смс об этом (пока не решил вопрос ограничения отправки смс, для экономии при минимальном балансе).
при звонке на сигналку прослушка помещения.
прежим пауза - останавливаем выполнение программы на заданное время.
вот тут конструкция на мой взгляд неплохая. можно использовать с контролем ожидаемого ответа в том числе.
Ссылка вставляется криво, ищите в поисковике по ключу "Ограничение длительности разговора сотовыми операторами".
вам 30 минут будет мало?
вам 30 минут будет мало?
Дело не в "много" или "мало". Перечитайте пост, не поняли в чём суть - читайте ещё.
кто может подсказать, пытаюсь инет прикрутить к Sim800
в код добавил доступ в интернет к void InitModem добавил
и сам запрос вида в loop()
1. при подключенной ардуинки к компу с питанием модема запрос обрабатывается замечательно,
2. отключаешь USB от ардуинки. но с включенным питанием системы без переcброса, запросы так же обрадатываются
3. отключаешь USB включаешь обычное питании запрос не идет
что может быть такое?
p.s. htt_p без _
1. при подключенной ардуинки к компу с питанием модема запрос обрабатывается замечательно,
2. отключаешь USB от ардуинки. но с включенным питанием системы без переcброса, запросы так же обрадатываются
3. отключаешь USB включаешь обычное питании запрос не идет
Чем питаете ардуину и модем? Используете повышайку или нет?
1. при подключенной ардуинки к компу с питанием модема запрос обрабатывается замечательно,
2. отключаешь USB от ардуинки. но с включенным питанием системы без переcброса, запросы так же обрадатываются
3. отключаешь USB включаешь обычное питании запрос не идет
Чем питаете ардуину и модем? Используете повышайку или нет?
питаю 12V8А, нано стоит на шилде, куда подается питание, модем отдельным проводом от разъема на понижающим dc/dc
питаю 12V8А, нано стоит на шилде, куда подается питание, модем отдельным проводом от разъема понижающим dc/dc
Параллельно питающим пинам модема повесьте конденсатор 6,3v 2200 мкф. Дайте ссылку на DC-DC.
питаю 12V8А, нано стоит на шилде, куда подается питание, модем отдельным проводом от разъема понижающим dc/dc
Параллельно питающим пинам модема повесьте конденсатор 6,3v 2200 мкф. Дайте ссылку на DC-DC.
на выход дс/дс перед питанием модема?
на выход дс/дс перед питанием модема?
Попробуйте так, должно помочь. Или напаяйте прямо на сам модем.
на выход дс/дс перед питанием модема?
Попробуйте так, должно помочь. Или напаяйте прямо на сам модем.
думал про питание, запитал от отдльного блока питания ардуинку +5В, толку 0
повесил, 2200 на питание модема + 2200 на +5v ардуинку нано
толку ноль
может есть какие то команды дополнительные?!
потому что как то странно, если при подключенном компеон отпавляет запросыкогда пописана команда AT+SAPBR=2,1 Получаем сведения о соединении и IP адрес , так она я понимаю чисто информативная, но без нее не идет
Поборол
добавил ЭХО sendATCommand(F("ATE0"), true); все заработало
АТЕ0 выключает эхо
У меня вопрос, сейчас пытаюсь оптимизировать свой проект, поглядывая сюда
Так вот, как сильно будет и будет ли вообще влиять на работу если я строчку и их подобные String обьявлю не в начале
а в самой функции
Экономия существенная
а команда AT&W сэкономит вам еще больше, так как те команды вам не нужно будет посылать вообще...
т.е. да, выключил, по умолчанию он включен был, а у меня не прописан вообще, а он на работу без компа влияет оказывается очень сильно
В очередной раз прошу поддержки и помощи здесь. Как избавиться от ложных срабатываний датчика движения HC0SR501? который подключен к аналоговому входу А0, и он же подтянут к земле 10кОмным резистором. Чаще всего ложные срабатывания идут в момент звонка на модем. Выдержка из моего кода
В очередной раз прошу поддержки и помощи здесь. Как избавиться от ложных срабатываний датчика движения HC0SR501? который подключен к аналоговому входу А0, и он же подтянут к земле 10кОмным резистором.
Тут описано и схема тоже прилагается в комментариях, решается добавлением конденсатора параллельно резистору.
Не помогло, так же идут наводки( Пробывал питать датчик и 3,3 и 5 вольтами, картина та же
может так попробовать?
В очередной раз прошу поддержки и помощи здесь. Как избавиться от ложных срабатываний датчика движения HC0SR501? который подключен к аналоговому входу А0, и он же подтянут к земле 10кОмным резистором. Чаще всего ложные срабатывания идут в момент звонка на модем. Выдержка из моего кода
а кто вам сказал, что ложные из-за этого?? нет конечно. Танцы с бубном не помогут, всякие транзисторы в схему и т.д. - не помогут. Поставьте наружную gsm антенну внешнюю, так как наводки идут на сам пиросенсор, это простейший бюджетный датчик. Проверить легко - закрутить чувствительность пиросенсора в минимальную строну - ложных уменьшится значительно, но не пропадут.
А лучше берите нормальный охранный датчик и не морочьте себе и другим голову, но те датчики все 12вольтовые, за надежность нужно платить.
вот немного доработал. отправляет на несколько номеров. ..........
смс нужно обязательно писать на симкарту, и оттуда доставать, периодиески опрашивая. иначе будут теряться смс, оператор их тупо пачками может слать, да и программе это сильно мешает, во время работы программы смс валится - фигня начинается.
Так и есть, поставил другой датчик движения, благо у меня их 3 штуки было, и все стало как надо!!
смс нужно обязательно писать на симкарту, и оттуда доставать, периодиески опрашивая. иначе будут теряться смс
Поддерживаю. Уже писал об этом автору.
В своем проекте не только полностью отказался от попыток ловить СМС-ки "он-лайн" - вообще не анализирую никакие сообщения модема, кроме ответов на явно посланные мной команды.
Вместо этого настроено сохранение СМС на СИМку и периодическая проверка новых СМС,
а есть пример?
а есть пример?
пример чего
что написали выше, скетча с чтением смс.
что написали выше, пример вашего скетча с чтением смс.
что написали выше, пример вашего скетча с чтением смс.
нет, к сожалению готового примера нет. Для работы с модемом А6 взята библиотека sim900.h. переписана под А6, а потом проект переехал на stm32. Так что там, простите, такая каша....
ну вот.. а так хорошо все начиналось :)
а где бы из библиотеки вытащить ту часть посмотреть, что смс выдергивают? Пытался порыться, но чтото не нашел в каком там месте оно хранится, можете помочь?
посмотреть для примера хочется, всеравно потом все переделать нужно будет.
ну вот.. а так хорошо все начиналось :)
а где бы из библиотеки вытащить ту часть посмотреть, что смс выдергивают? Пытался порыться, но чтото не нашел в каком там месте оно хранится, можете помочь?
посмотреть для примера хочется, всеравно потом все переделать нужно будет.
Т.е. просто взять, почитать даташит на AT-команды вашего модема - Клапауций запретил жёстко, да? И там найти, какую AT-команду нужно послать, чтобы прочитать СМС из хранящихся? Это НАСТОЛЬКО сложно, что надо обязательно спросить тут? Если работаете с модемом - даташит с описанием AT-команд должен быть настольной книгой. Не ленитесь - откройте и прочитайте, там есть всё.
у меня есть достаточно сложные программы для сим800, в том числе я давно голос там использую. Но выдернуть из библиотеки саму логику работы с смс пока не получилось.
у меня есть достаточно сложные программы для сим800, в том числе я давно голос там использую. Но выдернуть из библиотеки саму логику работы с смс пока не получилось.
Да при чём тут библиотека-то? Я вам про ДАТАШИТ на AT-команды - библиотека общается с модемом с их помощью. Что вам мешает посмотреть? У вас SIM800? Смотрите https://www.elecrow.com/download/SIM800%20Series_AT%20Command%20Manual_V..., читаем со 114 страницы. Всё это заняло у меня 30 секунд - найти страницу, где начинается информация про вычитывание СМС из модема. И я не перетрудился, как видите. Читайте, читайте.
Читайте, читайте.
Один мой знакомый сказал, что поколение пепси не умеет делать три фундаментальные вещи: читать, писать и говорить. Судя по вопрсам, которые постоянно валятся на сайте, по их стилю и по используемым формулировкам, я склонен согласиться с этим человеком. Ни читать, ни писать, ни говорить большинство не умеет. А Вы "читайте, читайте".