Я вначале писал: "у меня Arduino nano v3 (ATmega168), поэтому как ни крути а все не вместишь в него. Для моих нужд самое то, тем более цена вопроса в итоге проучается около 300р. За эти деньги ничего похожего не купишь.
Новая железка на руках, взял тоже Arduino nano v3. У Вас она питается как и модем, от 4.2В?
Подключил по схеме, команды отрабатывает на ура. Но все равно не работает.
Если всеже вернуться к A6, какое на него питание нужно подавать, он ведь нормально отрабатывает команды.
Вот так сеть отрабатывает отлично
#include <SoftwareSerial.h>
SoftwareSerial SIM800(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
void setup() {
Serial.begin(9600); // Скорость обмена данными с компьютером
Serial.println("Start!");
SIM800.begin(9600); // Скорость обмена данными с модемом
SIM800.println("AT");
}
long lastcmd = millis();
void loop() {
if (SIM800.available()) // Ожидаем прихода данных (ответа) от модема...
Serial.write(SIM800.read()); // ...и выводим их в Serial
if (Serial.available()) // Ожидаем команды по Serial...
SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
if (millis() - lastcmd > 5000) { // Прошло ли 5 секунд
lastcmd = millis(); // Фиксируем время
SIM800.println("AT+CSQ"); // Запрашиваем информацию о качестве сигнала
}
}
Благодаря martinholс drive2, на данный момент бьюсь над GPRS версией:
#include <EEPROM.h>
#include <RCSwitch.h>
#include <SoftwareSerial.h>
#include <DallasTemperature.h> // подключаем библиотеку чтения датчиков температуры
SoftwareSerial SIM800(7, 6); // для новых плат начиная с версии RX,TX
OneWire oneWire(4); // и настраиваем пин 4 как шину подключения датчиков DS18B20
DallasTemperature sensors(&oneWire);
RCSwitch mySwitch = RCSwitch(); // беспроводной датчик двери, пин 2.
#define LED 13 // на светодиод (моргалку)
#define BAT 15 // на батарею, через делитель напряжения 39кОм / 11 кОм
/* ------------------------------------- ДАТЧИКИ ------------------------*/
#define DOOR 8 // концевик двери. если сработал, на входе "+" HIGH.
#define PIR 9 // датчик движения. если сработал, на входе "+" HIGH.
#define BUZ 10 // сирена. если "-" LOW, то горит.
#define GAS 14 // датчик дыма. если сработал, на входе "+" HIGH.
#define sarai 3258553 // адрес 433 передатчика геркона двери. если сработал, на пин 2 сигнал.
boolean DOORFlag = false; // флаг состояние датчика двери.
boolean SARAYFlag = false; // флаг состояние датчика двери 2.
boolean PIRFlag = false; // флаг состояние датчика движения.
boolean GASFlag = false; // флаг состояние датчика газа.
int8_t LEDState = LOW; // Состояние светодиода.
int8_t DOORState = LOW; // Состояние концевика двери.
int8_t PIRState = LOW; // Состояние датчика движения.
int8_t Smoky = LOW; // Состояние датчика газа.
#define on "on" // вкл
#define off "off" // выкл
unsigned int p = 0;
#define GASThres 400 // предельная концентрация газа
#define time_sarai 10 // секунд не смотрим на датчик двери 2.
unsigned long lasttime_sarai = 0;
#define interval_led 1000 // для мигания LED, 1 сек.
unsigned long previousMillis_led = 0;
/* ----------------------------------------- НАСТРОЙКИ MQTT брокера--------------------------------------------------------- */
const char *MQTT_user = "****"; // api.cloudmqtt.com > Details > User
const char *MQTT_pass = "*****"; // api.cloudmqtt.com > Details > Password
const char *MQTT_type = "****"; // тип протокола
const char *MQTT_CID = "Home Alarm"; // уникальное имя устройства в сети MQTT
const char *MQTT_SERVER = "******"; // api.cloudmqtt.com > Details > Server сервер MQTT брокера
const char *PORT = "******4"; // api.cloudmqtt.com > Details > Port порт MQTT брокера
/* ----------------------------------------- ИНДИВИДУАЛЬНЫЕ НАСТРОЙКИ !!!--------------------------------------------------------- */
const char *APN = "internet.tele2.ru"; // тчка доступа выхода в интернет вашего сотового оператора
//String USER = ""; // имя выхода в интернет вашего сотового оператора
//String PASS = ""; // пароль доступа выхода в интернет вашего сотового оператора
/* ----------------------------------------- ДАЛЕЕ НЕ ТРОГАЕМ --------------------------------------------------------------- */
bool broker = false; // статус подклюлючения к брокеру
bool Firststart = true; // первый старт.
bool Guard = false; // состояние охраны после подачи питания
bool Buzer = false; // состояние охраны после подачи питания
bool Ring = false; // состояние охраны после подачи питания
bool Sms = false; // состояние охраны после подачи питания
bool Door = false; // состояние охраны после подачи питания
bool Saray = false; // состояние охраны после подачи питания
bool Pir = false; // состояние охраны после подачи питания
bool Gas = false; // состояние охраны после подачи питания
int interval = 3; // интервал отправки данных на сервер после загрузки ардуино
int Timer = 10; // Секунд до отключения "тревожного" пина.
unsigned long lasttimer = 0;
int inDS = 0;
float m = 68.01; // делитель для перевода АЦП в вольты для резистров 39/11kOm
float TempDS[11]; // массив хранения температуры c рахных датчиков
float Vbat, V_min; // переменная хранящая напряжение бортовой сети
unsigned long Time1, Time2 = 0;
char CSQ[4]; // для хранения уровня сигнала.
char MONEY[5]; // хранение баланса.
char Phone[14]; // для временного хранения номера телефона, номер до 14 цифр.
String RingPhone = ""; // номер звонившего.
String AlarmPhone[5]; // номера для постановки/снятии с охраны и отправки смс.
byte Adress[5] = {25, 40, 55, 70, 85}; // ячейки для пяти номеров в ЕЕПРОМ.
char Bal[4]; // для хранения номера баланса.
void setup() {
Serial.begin(9600); //скорость порта
SIM800.begin(9600); //скорость связи с модемом
SIM800_reset();
pinMode(DOOR, INPUT_PULLUP); // вход датчика двери с подтяжкой на +.
pinMode(PIR, INPUT); digitalWrite(PIR, HIGH); //
mySwitch.enableReceive(0); // RF433 приемник на 2 пине
pinMode(GAS, INPUT);
pinMode(BUZ, OUTPUT); digitalWrite(BUZ, LOW); // сирена выкл.
pinMode(LED, OUTPUT); // указываем пин на выход (светодиод)
Serial.println(F("MQTT alarm\n"));
Serial.println(eepromphone());
Serial.println("");
eepromconfig();
Serial.println(eepromtext());
Serial.println("");
}
void loop() {
AlarmPinOff();
if (SIM800.available()) resp_modem(); // если что-то пришло от SIM800 в Ардуино отправляем для разбора
if (Serial.available()) resp_serial(); // если что-то пришло от Ардуино отправляем в SIM800
if (millis()> Time1 + 10000) Time1 = millis(), detection(); // выполняем функцию detection () каждые 10 сек
if (millis()> Time2 + 3600000) { // каждый час
Time2 = millis();
Signal();
SIM800.println("AT+CIPSEND"), delay (200);
MQTT_PUB ("home/signal", CSQ);
MQTT_PUB ("home/balance", MONEY);
SIM800.write(0x1A);
}
}
void resp_serial() { // ---------------- ТРАНСЛИРУЕМ КОМАНДЫ из ПОРТА В МОДЕМ ----------------------------------
String at = "";
int k = 0;
while (Serial.available()) {
k = Serial.read();
at += char(k);
delay(1);
}
Komand(at); // запускаем подпрограмму распознавания команд
}
float VoltRead() { // замеряем напряжение на батарее и переводим значения в вольты
float ADCC = analogRead(BAT);
ADCC = ADCC / m ;
Serial.println(String(F("Напряжение: ")) + ADCC + "V");
if (ADCC < V_min) V_min = ADCC;
return(ADCC); // переводим попугаи в вольты
}
void detection() { // условия проверяемые каждые 10 сек
Detect();
Vbat = VoltRead(); // замеряем напряжение на батарее
Serial.println(String(F("Интервал: ")) + interval);
inDS = 0;
sensors.requestTemperatures(); // читаем температуру с трех датчиков
while (inDS < 10) {
TempDS[inDS] = sensors.getTempCByIndex(inDS); // читаем температуру
if (TempDS[inDS] == -127.00) {
TempDS[inDS]= 80;
break; // пока не доберемся до неподключенного датчика
}
inDS++;
}
for (int i=0; i < inDS; i++) {
Serial.println(String(F("Temp")) + i + "= " + TempDS[i]);
}
Serial.println("");
interval--;
if (interval < 1) {
interval = 6;
if (broker == true) {
eepromconfig();
eepromtext();
SIM800.println("AT+CIPSEND"), delay (200);
/////////////------состояние датчиков----------/////////////
MQTT_FloatPub ("home/ds0", TempDS[0],2);
MQTT_FloatPub ("home/ds1", TempDS[1],2);
MQTT_FloatPub ("home/vbat", Vbat,2);
/////////////------состояние системы----------/////////////
MQTT_PUB ("home/guard", Guard ? "lock" : "unlock");
MQTT_PUB ("home/buzer", Buzer ? "buzeron" : "buzeroff");
MQTT_PUB ("home/ring", Ring ? "ringon" : "ringoff");
MQTT_PUB ("home/sms", Sms ? "smson" : "smsoff");
MQTT_PUB ("home/door", Door ? "dooron" : "dooroff");
MQTT_PUB ("home/saray", Saray ? "sarayon" : "sarayoff");
MQTT_PUB ("home/pir", Pir ? "piron" : "piroff");
MQTT_PUB ("home/gas", Gas ? "gason" : "gasoff");
MQTT_FloatPub ("home/timer", Timer, 0);
MQTT_FloatPub ("home/uptime", millis()/3600000,0);
SIM800.write(0x1A);
} else SIM800.println(F("AT+SAPBR=3,1,\"Contype\",\"GPRS\"")); // подключаемся к GPRS
}
}
void MQTT_FloatPub(const char topic[15], float val, int x) {char st[10]; dtostrf(val,0, x, st), MQTT_PUB (topic, st);}
void MQTT_PUB(const char MQTT_topic[15], const char MQTT_messege[15]) { // пакет на публикацию
SIM800.write(0x30), SIM800.write(strlen(MQTT_topic)+strlen(MQTT_messege)+2);
SIM800.write((byte)0), SIM800.write(strlen(MQTT_topic)), SIM800.write(MQTT_topic); // топик
SIM800.write(MQTT_messege); // сообщение
}
void MQTT_SUB(const char MQTT_topic[15]) { // пакет подписки на топик
SIM800.write(0x82), SIM800.write(strlen(MQTT_topic)+5); // сумма пакета
SIM800.write((byte)0), SIM800.write(0x01), SIM800.write((byte)0); // просто так нужно
SIM800.write(strlen(MQTT_topic)), SIM800.write(MQTT_topic); // топик
SIM800.write((byte)0);
}
void MQTT_SEND(const char MQTT_topic[15], const char MQTT_messege[15]) {
SIM800.println("AT+CIPSEND"), delay (200);
SIM800.write(0x30), SIM800.write(strlen(MQTT_topic)+strlen(MQTT_messege)+2);
SIM800.write((byte)0), SIM800.write(strlen(MQTT_topic)), SIM800.write(MQTT_topic); // топик
SIM800.write(MQTT_messege); // сообщение
SIM800.write(0x1A);
}
void resp_modem() { //------------------ АНЛИЗИРУЕМ БУФЕР ВИРТУАЛЬНОГО ПОРТА МОДЕМА------------------------------
String at = "";
int k = 0;
while (SIM800.available()) {
k = SIM800.read();
at += char(k);
delay(1);
}
Serial.println(at);
if (at.indexOf(F("SMS Ready")) > -1 || at.indexOf(F("NO CARRIER")) > -1 ) {
SIM800.println(F("AT+IPR=9600;E1+DDET=1;+CMGF=1;+CSCS=\"gsm\";+CNMI=2,2,0,0,0;+VTD=1;+CMEE=1;&W")); // Активируем АОН и декодер DTMF
Signal();
/* -------------------------------------- проверяем соеденеиние с ИНТЕРНЕТ, конектимся к серверу------------------------------------------------------- */
} else if (at.indexOf(F("+CME ERROR:")) > -1 ) {
broker = false, delay (50), SIM800.println("AT+CFUN=1,1"), interval = 6 ;
} else if (at.indexOf(F("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\r\nOK")) > -1 ) {
SIM800.println(String(("AT+SAPBR=3,1,\"APN\",\"")) + APN + "\"");
} else if (at.indexOf(String(("AT+SAPBR=3,1,\"APN\",\"")) + APN + "\"\r\r\nOK") > -1 ) {
SIM800.println(F("AT+SAPBR=1,1")), delay (1000); // устанавливаем соеденение
} else if (at.indexOf(F("AT+SAPBR=1,1\r\r\nOK")) > -1 ) {
SIM800.println(F("AT+SAPBR=2,1")),delay (1000); // проверяем статус соединения
} else if (at.indexOf(F("+SAPBR: 1,1")) > -1 ) {
SIM800.println(String(("AT+CIPSTART=\"TCP\",\"")) + MQTT_SERVER + "\",\"" + PORT + "\"");
/* -------------------------------------- команды управления ------------------------------------------*/
} else if (at.indexOf(F("home/comandlock"),4) > -1 ) guard(1), MQTT_SEND ("home/send", "lock");
else if (at.indexOf(F("home/comandunlock"),4) > -1 ) guard(0), MQTT_SEND ("home/send", "unlock");
else if (at.indexOf(F("home/comandbuzeron"),4) > -1 ) buzer(1), MQTT_SEND ("home/send", "buzeron");
else if (at.indexOf(F("home/comandbuzeroff"),4) > -1 ) buzer(0), MQTT_SEND ("home/send", "buzeroff");
else if (at.indexOf(F("home/comandringon"),4) > -1 ) ring(1), MQTT_SEND ("home/send", "ringon");
else if (at.indexOf(F("home/comandringoff"),4) > -1 ) ring(0), MQTT_SEND ("home/send", "ringoff");
else if (at.indexOf(F("home/comandsmson"),4) > -1 ) sms(1), MQTT_SEND ("home/send", "smson");
else if (at.indexOf(F("home/comandsmsoff"),4) > -1 ) sms(0), MQTT_SEND ("home/send", "smsoff");
else if (at.indexOf(F("home/comanddooron"),4) > -1 ) door(1), MQTT_SEND ("home/send", "dooron");
else if (at.indexOf(F("home/comanddooroff"),4) > -1 ) door(0), MQTT_SEND ("home/send", "dooroff");
else if (at.indexOf(F("home/comandpiron"),4) > -1 ) pir(1), MQTT_SEND ("home/send", "piron");
else if (at.indexOf(F("home/comandpiroff"),4) > -1 ) pir(0), MQTT_SEND ("home/send", "piroff");
else if (at.indexOf(F("home/comandgason"),4) > -1 ) gas(1), MQTT_SEND ("home/send", "gason");
else if (at.indexOf(F("home/comandgasoff"),4) > -1 ) gas(0), MQTT_SEND ("home/send", "gasoff");
else if (at.indexOf(F("home/comandsarayon"),4) > -1 ) saray(1), MQTT_SEND ("home/send", "sarayon");
else if (at.indexOf(F("home/comandsarayoff"),4) > -1 ) saray(0), MQTT_SEND ("home/send", "sarayoff");
else if (at.indexOf(F("home/settimer"),4) > -1 ) {
Timer = at.substring(at.indexOf("") + 17, at.indexOf("") + 20).toInt();
EEPROM.put(10, Timer);
} else if (at.indexOf(F("home/comandrefresh"),4) > -1 ) {
//Serial.println(F("Команда обновления"));
Serial.println(eepromphone());
Serial.println("");
eepromconfig();
eepromtext();
Serial.println("");
SIM800.println("AT+CIPSEND"), delay (200);
/////////////------состояние датчиков----------/////////////
MQTT_FloatPub ("home/ds0", TempDS[0],2);
MQTT_FloatPub ("home/ds1", TempDS[1],2);
MQTT_FloatPub ("home/vbat", Vbat,2);
MQTT_PUB ("home/door", DOORFlag ? "dooropen" : "doorclose");
MQTT_PUB ("home/pir", PIRFlag ? "piropen" : "pirclose");
MQTT_PUB ("home/saray", SARAYFlag ? "sarayopen" : "sarayclose");
MQTT_PUB ("home/gas", GASFlag ? "gasopen" : "gasclose");
/////////////------состояние системы----------/////////////
MQTT_PUB ("home/guard", Guard ? "lock" : "unlock");
MQTT_PUB ("home/buzer", Buzer ? "buzeron" : "buzeroff");
MQTT_PUB ("home/ring", Ring ? "ringon" : "ringoff");
MQTT_PUB ("home/sms", Sms ? "smson" : "smsoff");
MQTT_PUB ("home/door", Door ? "dooron" : "dooroff");
MQTT_PUB ("home/saray", Saray ? "sarayon" : "sarayoff");
MQTT_PUB ("home/pir", Pir ? "piron" : "piroff");
MQTT_PUB ("home/gas", Gas ? "gason" : "gasoff");
MQTT_PUB ("home/signal", CSQ);
MQTT_PUB ("home/balance", MONEY);
MQTT_FloatPub ("home/timer", Timer, 0);
MQTT_FloatPub ("home/uptime", millis()/3600000,0);
SIM800.write(0x1A);
interval = 6; // швырнуть данные на сервер и ждать 60 сек
} else if (at.indexOf(F("CONNECT OK\r\n")) > -1 ) MQTT_CONNECT (); // после соединения с сервером отправляем пакет авторизации, публикации и пдписки у брокера
else if (at.indexOf(F("+CLIP: ")) > -1) { // если обнаружен вызов.
SIM800.println(F("ATH")); // снимаем трубку
for (int i = 0; i < 5; i++) { // проверяем сохраненные номера
if (at.indexOf(AlarmPhone[i]) > -1 && AlarmPhone[i] != 0) { // если он наш
RingPhone = AlarmPhone[i]; // запоминаем номер звонящего
RingPhone.toCharArray(Phone, 14);
EEPROM.put(100, Phone); // записываем RingPhone в память.
} else if (Firststart) { // если первый старт
int ind = at.indexOf(F("+CLIP: \"")); // обрезаем номер ...
ind += 8;
String ring = at.substring(ind, at.indexOf("\"", ind));
RingPhone = ring; // запоминаем номер звонящего
ring.toCharArray(Phone, 14); // сохраняем в переменную Phone
EEPROM.put(25, Phone); // пишем номер в EEPROM как основной мастер-номер
EEPROM.put(100, Phone); // записываем RingPhone в память.
AlarmPhone[0] = Phone; // запишем
Firststart = false; // пишем 0
EEPROM.update(10, Firststart); // обновляем Firststart
Serial.println(String(F("Firststart:")) + Firststart);
//sms(String(F("Master0:")) + ring + " Ok", 0); // смс на звонивший
//sms("Master0:" + ring + " Ok", 0); // смс на звонивший
}
}
} else if (at.indexOf(F("+CSQ:")) > -1) { // если пришел уровень сигнала
at = at.substring(at.indexOf(":") + 2, at.indexOf(",")); // парсим ответ об уровне сигнала
at.trim(); // удаляем пробелы вначале и в конце строки
at.toCharArray(CSQ, 4);
Balance();
} else if (at.indexOf(F("+CUSD:")) > -1) { // если пришел баланс
int p1 = at.indexOf("\""); // начало строки
int p2 = at.lastIndexOf("\""); // конец строки
at = at.substring(p1 + 1, p2); // обрезаем строку
String money = getBalFromString(at); // обрезаем числовые
money.toCharArray(MONEY, 10); // конвертируем
SIM800.println(F("AT+CUSD=0"));
}
}
void MQTT_CONNECT() {
SIM800.println("AT+CIPSEND"), delay (100);
SIM800.write(0x10); // маркер пакета на установку соединения
SIM800.write(strlen(MQTT_type)+strlen(MQTT_CID)+strlen(MQTT_user)+strlen(MQTT_pass)+12);
SIM800.write((byte)0),SIM800.write(strlen(MQTT_type)),SIM800.write(MQTT_type); // тип протокола
SIM800.write(0x03), SIM800.write(0xC2),SIM800.write((byte)0),SIM800.write(0x3C); // просто так нужно
SIM800.write((byte)0), SIM800.write(strlen(MQTT_CID)), SIM800.write(MQTT_CID); // MQTT идентификатор устройства
SIM800.write((byte)0), SIM800.write(strlen(MQTT_user)), SIM800.write(MQTT_user); // MQTT логин
SIM800.write((byte)0), SIM800.write(strlen(MQTT_pass)), SIM800.write(MQTT_pass); // MQTT пароль
MQTT_PUB ("home/status", "Подключено"); // пакет публикации
MQTT_SUB ("home/comand"); // пакет подписки на присылаемые команды
MQTT_SUB ("home/settimer"); // пакет подписки на присылаемые команды
MQTT_PUB ("home/signal", CSQ);
MQTT_PUB ("home/balance", MONEY);
MQTT_FloatPub ("home/timer", Timer, 0);
SIM800.write(0x1A), broker = true; // маркер завершения пакета
}
void Signal() {
SIM800.println(F("AT+CSQ")); // проверяем уровень сигнала сети
}
void Balance() {
SIM800.println(String(F("AT+CUSD=1,\"#")) + Bal + ("#\",15")); // проверяем баланс на симкарте
}
void guard (bool st) {
Guard = st;
EEPROM.write(1, st); // пишем в EEPROM
}
void buzer(bool st) {
Buzer = st;
EEPROM.write(2, st); // пишем в EEPROM
}
void ring(bool st) {
Ring = st;
EEPROM.write(3, st); // пишем в EEPROM
}
void sms(bool st) {
Sms = st;
EEPROM.write(4, st); // пишем в EEPROM
}
void door(bool st) {
Door = st;
EEPROM.write(5, st); // пишем в EEPROM
}
void saray(bool st) {
Saray = st;
EEPROM.write(6, st); // пишем в EEPROM
}
void pir(bool st) {
Pir = st;
EEPROM.write(7, st); // пишем в EEPROM
}
void gas(bool st) {
Gas = st;
EEPROM.write(8, st); // пишем в EEPROM
}
String getBalFromString(String str) { // Функция извлечения цифр из сообщения - для парсинга баланса из USSD-запроса
bool flag = false;
String result = "";
str.replace(",", "."); // Если в качестве разделителя десятичных используется запятая - меняем её на точку.
for (int i = 0; i < str.length(); i++) {
if (isDigit(str[i]) || (str[i] == (char)46 && flag)) { // Если начинается группа цифр (при этом, на точку без цифр не обращаем внимания),
if (result == "" && i > 0 && (String)str[i - 1] == "-") { // Нельзя забывать, что баланс может быть отрицательным
result += "-"; // Добавляем знак в начале
}
result += str[i]; // начинаем собирать их вместе
if (!flag) flag = true; // Выставляем флаг, который указывает на то, что сборка числа началась.
}
else { // Если цифры закончились и флаг говорит о том, что сборка уже была,
if (str[i] != (char)32) { // Если порядок числа отделен пробелом - игнорируем его, иначе...
if (flag) break; // ...считаем, что все.
}
}
}
return result; // Возвращаем полученное число.
}
void SIM800_reset() { // перезагрузка модема
SIM800.println("AT+CFUN=1,1");
}
void eepromconfig() { /// === конфигурирование сигнализации === ///
if (EEPROM.read(0) != 1) { // если по 0 адресу записана не 1, переписываем в память 000
for (int i = 0 ; i < 512 ; i++) { // переписываем все ячейки
EEPROM.write(i, 0);
} // и записываем:
EEPROM.update(0, 1); // пишем 1 в 0 адрес
EEPROM.update(1, 0); // Guard охрана выкл.
EEPROM.update(2, 0); // Sirena сирена при сработке вкл.
EEPROM.update(3, 0); // RING вызов при сработке вкл.
EEPROM.update(4, 0); // SMS смс при сработке вкл.
EEPROM.update(5, 0); // DOOR датчики дверей вкл.
EEPROM.update(6, 0); // SARAI датчики дверей вкл.
EEPROM.update(7, 0); // PIR датчик движения вкл.
EEPROM.update(8, 0); // GAS датчик газа вкл.
EEPROM.update(9, 1); // Firststart первый старт!
Serial.println(F("EEPROM != 1/ RESET!"));
} if (EEPROM.read(0) == 1) { // если в 0 записана 1, считываем конфигурацию
Guard = EEPROM.read(1); // Охрана
Buzer = EEPROM.read(2); // Сирена
Ring = EEPROM.read(3); // Вызов
Sms = EEPROM.read(4); // Отправка смс
Door = EEPROM.read(5); // Датчик двери
Saray = EEPROM.read(6); // Датчик двери
Pir = EEPROM.read(7); // Датчик движения
Gas = EEPROM.read(8); // Датчик газа/дыма
Firststart = EEPROM.read(9); // Первый старт
EEPROM.get(10, Timer);
}
}
String eepromtext() { /// === состояние системы === ///
String SIGN = ""; // текущее состояние системы.
String sirena = ""; // сирена при сработке.
String ring = ""; // вызов при сработке.
String sms = ""; // смс при сработке.
String door = ""; // датчика двери.
String saray = ""; // датчика двери RF433.
String pir = ""; // датчик движения.
String gas = ""; // датчик газа.
if (Guard) SIGN = F("System on\n"); else SIGN = F("System off\n");
if (Buzer) sirena = F("Sirena on\n"); else sirena = F("Sirena off\n");
if (Ring) ring = F("Ring on\n"); else ring = F("Ring off\n");
if (Sms) sms = F("SMS on\n"); else sms = F("SMS off\n");
if (Door) door = F("Door on\n"); else door = F("Door off\n");
if (Saray) saray = F("Sarai on\n"); else saray = F("Sarai off\n");
if (Pir) pir = F("Pir on\n"); else pir = F("Pir off\n");
if (Gas) gas = F("Gas on\n"); else gas = F("Gas off");
String LastEvent = SIGN + sirena + ring + sms + door + saray + pir + gas; // полное состояние системы и датчиков.
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 + "#";
String EEPhone = numbers + ring + bal;
return EEPhone;
}
void sms(String text, byte sendnum) { /// === отправка СМС === ///
String phone = "";
text += String(F("\nTemp_ul ")) + TempDS[0]; // добавляем к тексту температуру на улице
text += String(F("*C\nTemp_pom ")) + TempDS[1]; // добавляем к тексту температуру на в помещении
text += String(F("*C\n")) + MONEY; // добавляем к тексту баланс sim карты
if (!sendnum) { // отправка смс на номер звонившего
phone = RingPhone;
SIM800.println(String(F("AT+CMGS=\"+")) + phone + "\""); // Переходим в режим ввода текстового сообщения
SIM800.println(text + (String)((char)26)); // отправка текста
} else if (sendnum) { // отправка смс на все номера
for (uint8_t i = 0; i < 4 ; i++) {
phone = AlarmPhone[i];
if (phone != 0) { // если ячейка пустая - не отправлять смс
SIM800.println(String(F("AT+CMGS=\"+")) + phone + "\""); // Переходим в режим ввода текстового сообщения
SIM800.println(text + (String)((char)26)); // отправка текста
}
}
}
}
void Komand(String kom) { /// === мастер смс === ///
Serial.println("Kom->" + kom);
kom.toLowerCase(); //
if (RingPhone == AlarmPhone[0]) { // команды выполняются только с 0 мастер номера
if (kom.indexOf(F("master")) > -1) { // добавление дополнительных мастер-номеров
p = kom.indexOf(F("master"));
master(kom.substring(p + 6, p + 7).toInt(), kom.substring(p + 8, kom.indexOf("\n", p + 8)));
///// sms типа: " master1:79111234567 " - ячейка + номер
} else if (kom.indexOf(F("balance:")) > -1) { // добавление номера баланса
p = kom.indexOf(F("balance:"));
balnum(kom.substring(p + 8, p + 11));
///// sms типа: " balance:100 " - номер баланса
} else if (kom.indexOf(F("dell:")) > -1) { // удаление мастер-номера из ячейки
p = kom.indexOf(F("dell:"));
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); // смс на последний номер
} else if (kom.indexOf(F("reset")) > -1) { // полный сброс ЕЕПРОМ!
sms(F("System Full Reset!"), 0); // смс на последний номер
EEPROM.write(0, false);
SIM800_reset(); // перезапускаем модем
}
}
if ((kom.indexOf(F("info")) > -1) || (kom.indexOf(F("?")) > -1)) { // инфо о состоянии системы
Signal(); // проверяем уровень сигнала сети
eepromconfig(); // считывем конфигурацию системы
sms(eepromtext(), 0); // смс на последний номер
} else if (kom.indexOf(F("datchiki")) > -1) { // все датчики
if (kom.indexOf(on) > -1) { // включить все датчики одной командой
Door = true; // вкл датчик двери
Saray = true; // вкл датчик двери RF433
Pir = true; // вкл датчик движения
Gas = true; // вкл датчик газа
EEPROM.update(4, Door); // пишем в EEPROM
EEPROM.update(5, Saray); // пишем в EEPROM
EEPROM.update(6, Pir); // пишем в EEPROM
EEPROM.update(7, Gas); // пишем в EEPROM
} else if (kom.indexOf(off) > -1) { // выключить все датчики
Door = false; // выкл датчик двери
Saray = false; // выкл датчик двери RF433
Pir = false; // выкл датчик движения
Gas =false; // выкл датчик газа
EEPROM.update(4, Door); // пишем в EEPROM
EEPROM.update(5, Saray); // пишем в EEPROM
EEPROM.update(6, Pir); // пишем в EEPROM
EEPROM.update(7, Gas); // пишем в EEPROM
}
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) { // вкл сирену при сработке
Buzer = true;
EEPROM.update(8, Buzer); // пишем в EEPROM
sms(String(F("Sirena->on")), 1); // смс на все номера
} else if (kom.indexOf(off) > -1) { // выкл сирену при сработке
Buzer = false;
EEPROM.update(8, Buzer); // пишем в EEPROM
sms(String(F("Sirena->off")), 1); // смс на все номера
}
} else if (kom.indexOf(F("ring")) > -1) { // вкл/выкл вызов при сработке
if (kom.indexOf(on) > -1) { // вкл вызов при сработке
Ring = true;
EEPROM.update(2, Ring); // пишем в EEPROM
sms(String(F("Ring->on")), 1); // смс на все номера
} else if (kom.indexOf(off) > -1) { // выкл вызов при сработке
Ring = false;
EEPROM.update(2, Ring); // пишем в EEPROM
sms(String(F("Ring->off")), 1); // смс на все номера
}
} else if (kom.indexOf(F("sms")) > -1) { // вкл/выкл смс при сработке
if (kom.indexOf(on) > -1) { // вкл смс при сработке
Sms = true;
EEPROM.update(3, Sms); // пишем в EEPROM
sms(String(F("SMS->on")), 1); // смс на все номера
} else if (kom.indexOf(off) > -1) { // выкл смс при сработке
Sms = false;
EEPROM.update(3, Sms); // пишем в EEPROM
sms(String(F("SMS->off")), 1); // смс на все номера
}
} else if (kom.indexOf(F("door")) > -1) { // вкл/выкл контроль датчика двери
if (kom.indexOf(on) > -1) { // вкл контроль датчика двери
Door = true;
EEPROM.update(4, Door); // пишем в EEPROM
sms(String(F("DOOR->on")), 1); // смс на все номера
} else if (kom.indexOf(off) > -1) { // выкл контроль датчика двери
Door = false;
EEPROM.update(4, Door); // пишем в EEPROM
sms(String(F("DOOR->off")), 1); // смс на все номера
}
} else if (kom.indexOf(F("sarai")) > -1) { // вкл/выкл контроль датчика двери RF433
if (kom.indexOf(on) > -1) { // вкл контроль RF433
Saray = true;
EEPROM.update(5, Saray); // пишем в EEPROM
sms(String(F("SARAI->on")), 1); // смс на все номера
} else if (kom.indexOf(off) > -1) { // выкл контроль RF433
Saray = false;
EEPROM.update(5, Saray); // пишем в EEPROM
sms(String(F("SARAI->off")), 1); // смс на все номера
}
} else if (kom.indexOf(F("pir")) > -1) { // вкл/выкл контроль датчика движения
if (kom.indexOf(on) > -1) { // вкл контроль датчика движения
Pir = true;
EEPROM.update(6, Pir); // пишем в EEPROM
sms(String(F("PIR->on")), 1); // смс на все номера
} else if (kom.indexOf(off) > -1) { // выкл контроль датчика движения
Pir = false;
EEPROM.update(6, Pir); // пишем в EEPROM
sms(String(F("PIR->off")), 1); // смс на все номера
}
} else if (kom.indexOf(F("gas")) > -1) { // вкл/выкл контроль датчика газа
if (kom.indexOf(on) > -1) { // вкл контроль датчика газа
Gas = true;
EEPROM.update(7, Gas); // пишем в EEPROM
sms(String(F("GAS->on")), 1); // смс на все номера
} else if (kom.indexOf(off) > -1) { // выкл контроль датчика газа
Gas = false;
EEPROM.update(7, Gas); // пишем в EEPROM
sms(String(F("GAS->off")), 1); // смс на все номера
}
}
SIM800.println(F("AT+CMGD=1,4")); // стираем смс
}
void GuardOn() { /// === включение сигнализации === ///
Guard = true;
EEPROM.update(1, Guard);
sms(F("System->on"), 1); // смс на все номера
}
void GuardOff() { /// === выключение сигнализации === ///
Guard = false;
EEPROM.update(1, Guard);
sms(F("System->off"), 1); // смс на все номера
}
void master (int i, String num) { /// === добавление мастер-номеров === ///
if (i < 5 && i != 0) { // если ячейка от 1 до 4
num.trim();
num.toCharArray(Phone, 14); // конвертируем номер
AlarmPhone[i] = num;
EEPROM.put(Adress[i], Phone); // записываем массив в EEPROM
sms(String(F("Master")) + i + "->" + num + " add", 0); // смс на 0 номер.
}
}
void dellphone (int i) { /// === удаление мастар-номеров === ///
if (i < 5 && i != 0) { // если ячейка от 1 до 4
AlarmPhone[i] = ""; // стираем номер
EEPROM.put(Adress[i], 0); // стираем номер
sms(String(F("Master")) + i + "->" + AlarmPhone[i] + " dell", 0); // смс на 0 номер
}
// 0 номер можно удалить только через RESET!!!
}
void balnum (String num) { /// === добавляем номер баланса === ///
num.toCharArray(Bal, 4); // конвертируем
EEPROM.put(20, Bal); // записываем номер в EEPROM
sms(String(F("Balance->*")) + num + "# Ok", 0); // смс на 0 номер
}
void Led() { /// === состояние светодиода === ///
int currentMillis_led = millis(); // светодиод моргает
//проверяем не прошел ли нужный интервал, если прошел то
if (currentMillis_led - previousMillis_led > interval_led) {
// сохраняем время последнего переключения
previousMillis_led = currentMillis_led;
// если светодиод не горит, то зажигаем, и наоборот
if (LEDState == LOW) LEDState = HIGH;
else LEDState = LOW;
digitalWrite(LED, LEDState);
}
}
void Detect() { /// === чтение датчиков === ///
DOORState = digitalRead(DOOR);
PIRState = digitalRead(PIR);
Smoky = analogRead(GAS);
if (DOORState == HIGH && !DOORFlag) { // если он сработал
DOORFlag = true; // ставим флаг
Serial.println(F("Dver' otkrita!"));
MQTT_SEND ("home/door", "dooropen");
if (Door) Alarm(); // запускаем подпрограмму Alarm
} else if (DOORState == LOW && DOORFlag) {
DOORFlag = false; // возвращаем флаг к начальному состоянию
Serial.println(F("Dver' zakrita!"));
MQTT_SEND ("home/door", "doorclose");
}
if (mySwitch.available()) { // если датчик сарая включен
unsigned long value = mySwitch.getReceivedValue(); // считываем значение с RF433
if (value == sarai && !SARAYFlag) { // если он сработал
lasttime_sarai = millis(); // запускаем таймер
SARAYFlag = true; // ставим флаг
Serial.println(F("Sarai otkrit!"));
// MQTT_SEND ("home/saray", "sarayopen");
if (Saray) Alarm(); // запускаем подпрограмму Alarm
}
mySwitch.resetAvailable();
}
if (((millis() - lasttime_sarai)/1000 > time_sarai)) { // если прошол интервал
SARAYFlag = false; // возвращаем флаг к начальному состоянию
// MQTT_SEND ("home/saray", "sarayclose");
}
if (PIRState == HIGH && !PIRFlag) { // если он сработал
PIRFlag = true; // ставим флаг
Serial.println(F("Dvizhenie u dveri!"));
MQTT_SEND ("home/pir", "piropen");
if (Pir) Alarm(); // запускаем подпрограмму Alarm
} else if (PIRState == LOW && PIRFlag) { // иначе если движения нет
PIRFlag = false; // возвращаем флаг к начальному состоянию
MQTT_SEND ("home/pir", "pirclose");
}
if ((Smoky > GASThres) && !GASFlag) { // если он сработал
GASFlag = true; // ставим флаг
Serial.println(F("Gas v dome!"));
MQTT_SEND ("home/gas", "gasopen");
if (Gas) Alarm(); // запускаем подпрограмму Alarm
} else if ((Smoky < GASThres) && GASFlag) { // иначе если газа нет
GASFlag = false; // возвращаем флаг к начальному состоянию
MQTT_SEND ("home/gas", "gasclose");
}
}
void Alarm() { /// === аварийные сигналы === ///
if (Buzer) { // если включена сирена при сработке
lasttimer = millis(); // запускаем таймер сирены
digitalWrite(BUZ, HIGH); // запускаем ее
}
Serial.println(F("Alarm!!!"));
if (DOORFlag) { // если сработал датчик двери
}
if (SARAYFlag) { // если сработал датчик двери RF433
}
if (PIRFlag) { // если сработал датчик движения
}
if (GASFlag) { // если сработал датчик газа
}
}
void AlarmPinOff() { /// === отключаем сирену === ///
if ((millis() - lasttimer)/1000 > Timer) digitalWrite(BUZ, LOW); // если прошло время, отключаем сирену
}
смс пока не проверял, еще не все добавил, но работает. использую приложение MQTT dash, но оно не устраивает отсутствием уведомлений и виджета.
подскажите есть ли какое приложение. чтоб можно было добавить виджет и уведомления по изменения статуса устройств, т.к. смс уже не устраивает?
AleksandrM, про MQTT_type позже напишу.
А6 не подойдёт, хотя если можете переписать под под него, то не проблема (у меня завести gprs на А6 была проблема)
AleksandrM, про MQTT_type позже напишу. А6 не подойдёт, хотя если можете переписать под под него, то не проблема (у меня завести gprs на А6 была проблема)
Паша. я на А6 в инет выходил без проблем, Яндекс скачивался. Дальше правда не копал, проект с А6 пока заброшен, отодвинут более актуальными задачками :)
Short Circuit, у меня 2 модема, один с версией 1308, другой 1418., Вот первый не пошел по gprs, а второй норм. Завтра скину ссылку что я нашел по прошивке (смене по модема)
В loop() {
if (millis()/1000 > timer) { // проверяем каждый час
Signal(); // проверяем уровень сигнала
timer += 360;
} Пост 667 смотрите, не могу с телефона писать...до компа доберусь только в четверг))
Проверяем уровень сигнала и тем самым убиваем 2х зайцев (можно заменить на регистрацию в сети). В подпрограмме sendATcomand(): если не придет ответ на команду, дергаем ногу модема reset. Но это для А6го.
Для sim800 можно программно перезагружать: в 705 посте посмотрите)
В loop() { if (millis()/1000 > timer) { // проверяем каждый час Signal(); // проверяем уровень сигнала timer += 360; } Пост 667 смотрите, не могу с телефона писать...до компа доберусь только в четверг)) Проверяем уровень сигнала и тем самым убиваем 2х зайцев (можно заменить на регистрацию в сети). В подпрограмме sendATcomand(): если не придет ответ на команду, дергаем ногу модема reset. Но это для А6го. Для sim800 можно программно перезагружать: в 705 посте посмотрите)
Мучался на коленке собирать, сделал плату и заказал в китае.
Питание как видите, одна понижайка на 5в (ардуино, реле, часы) и вторая на 3.3в на GSM. с другой стороны преобразователь уровней с 3.3 на 5в. Кстате после всякого навесного монтажа работать стало стабильнее, всяких проблем с модемом не стало. Правда есть кое какие косяки по разводке но это выяснилось потом при монтаже уже.
А так это система полива и контроля состояния воды в баке, на этой же печатке сделали контроль отопительной системы в доме зимой.
Так что код универсален и подстраивается как надо
п.с. в коде #705 ошибка (у меня не захотел работать как надо)
153 ind += 8;
заменить на ind+=9, а то получается не состыковка по номерам, записывается в памяти как +79123456789 а последний звонивший отображается 79123456789 т.е. без +, и ардуинка не понимает
smesharik, это, как выяснилось, с разными операторами необходимо менять (Теле2 и МТС номер возвращается с + и без). Насколько помню у сим800 питание от 3.6В-4.2В.
smesharik, это, как выяснилось, с разными операторами необходимо менять (Теле2 и МТС номер возвращается с + и без). Насколько помню у сим800 питание от 3.6В-4.2В.
Ну вы меня поняли :) По мануалу 3,4-4,4в. Я где то 3.8 поставил
4.25 много, снижайте, стабильное напряжение надо
это не мусор!
если постоянно
12
Call Ready
13
14
SMS Ready
значит модем постоянно перезагружается, что-то нето с питанием!!!
Ходит на на ногах модем от 4.0 до 4.25.
Исправил, но нечего не меняется.
4.25 много, снижайте, стабильное напряжение надо
на данном напряжении модем начал греться
Тоже долгодмусился sim800, сделал так и теперь проблем нет,
Преобразователь dc/dc360, вместо потенциометра, резак на 27к. Как раз 4.0В
Я использую HW-411.
Нашел Б.П. 5В, попробую с него подать питание. Отпишу когда подам
Тоже долгодмусился sim800, сделал так и теперь проблем нет,
Преобразователь dc/dc360, вместо потенциометра, резак на 27к. Как раз 4.0В
Эксперимент приостанавливается, поехал за новой ардуиной, что то померла эта(
ужас, а из-за чего?
:=(
ужас, а из-за чего?
:=(
Ничего не делал, выключил потом включил, чип горячий, нечего не шьет. Если питание только по USB то горит on и L. Если питание 5В то только L
Теперь ты знаешь, что такое тиристорный эффект.
Теперь ты знаешь, что такое тиристорный эффект.
Всмысле?)
В самом прямом смысле: http://www.chipinfo.ru/literature/compeljournal/2005/200502/p8.html
В самом прямом смысле: http://www.chipinfo.ru/literature/compeljournal/2005/200502/p8.html
Ну то что плату в мусор то понятно)
Судя по статье, первое это подаем 5V, потом USB. 5V не отключал, только USB)
Спасибо этой теме и людям в ней!
Все что мне было надо - у меня заработало.
На основе ваших скетчев я сделал GSM реле в 3 канала...
С памятью последних положений ну и со всем остальным что тут есть.
Спасибо этой теме и людям в ней!
Все что мне было надо - у меня заработало.
На основе ваших скетчев я сделал GSM реле в 3 канала...
С памятью последних положений ну и со всем остальным что тут есть.
пожалуйста :)
Новая железка на руках, взял тоже Arduino nano v3. У Вас она питается как и модем, от 4.2В?
Новая железка на руках, взял тоже Arduino nano v3. У Вас она питается как и модем, от 4.2В?
не, ардуина питается от usb, а для питания модема нужно 4.2В (отдельное питание). вот для вас схема:
я вместо отдельного источника питания использую второй USB
Подключил по схеме, команды отрабатывает на ура. Но все равно не работает.
Если всеже вернуться к A6, какое на него питание нужно подавать, он ведь нормально отрабатывает команды.
Вот так сеть отрабатывает отлично
A6 питание 5V. читайте pdf на модем
A6 питание 5V. читайте pdf на модем
И на А6 так же тишина(
Благодаря martinhol с drive2, на данный момент бьюсь над GPRS версией:
смс пока не проверял, еще не все добавил, но работает. использую приложение MQTT dash, но оно не устраивает отсутствием уведомлений и виджета.
подскажите есть ли какое приложение. чтоб можно было добавить виджет и уведомления по изменения статуса устройств, т.к. смс уже не устраивает?
pasha413 Что должно быть в строке : MQTT_type ?
A6 mini подойдет для проэкта?
AleksandrM, про MQTT_type позже напишу.
А6 не подойдёт, хотя если можете переписать под под него, то не проблема (у меня завести gprs на А6 была проблема)
Паша. я на А6 в инет выходил без проблем, Яндекс скачивался. Дальше правда не копал, проект с А6 пока заброшен, отодвинут более актуальными задачками :)
У меня 2 А6, один трудится на даче - сигналка, второй лежит в запасе.
И 2 сим800 (один не поддерживает gprs - выйду с отпуска буду прошивать)
сим800Н у вас? и как вы его прошьете??
смс пока не проверял, еще не все добавил, но работает. использую приложение MQTT dash, но оно не устраивает отсутствием уведомлений и виджета.
подскажите есть ли какое приложение. чтоб можно было добавить виджет и уведомления по изменения статуса устройств, т.к. смс уже не устраивает?
блинк пробовали? у меня пока чтото не получилось тесты через него, хотя там много чего есть для обратной связи с устройством и прочего.
SIM800l. Где-то ссылку сохранял, завтра кину, все на работе, отпуск же)))
Что-то типа этого
https://elementztechblog.wordpress.com/2016/08/02/updating-firmware-of-s...
Не, завтра выйду с отпуска, начну вливаться))
вот этот модуль хотите перешить?? именно перешить а не файлы в него прописать??
а вы сначала поинтересуйтесь, те пины что вам нужны доступны на этом модуле на фото??
там специальные контакты под прошивку новой версии, и включаются они в юсб разьем!!
так что перешить насколько я понимаю вы этот модуль не сможете.
вот на сим800С там требуемые контакты по любому доступны будут.
Short Circuit, у меня 2 модема, один с версией 1308, другой 1418., Вот первый не пошел по gprs, а второй норм. Завтра скину ссылку что я нашел по прошивке (смене по модема)
еще раз - должны быть доступны специальные контакты на модуле.. иначе никак.
через порт рхтх не прошивается.
по поводу прошивки sim800 вот в этой теме писалось. с поста #9
http://arduino.ru/forum/apparatnye-voprosy/sim800l-ne-mozhet-zaregistrirovat-sim
pasha413 Что должно быть в строке : MQTT_type ?
A6 mini подойдет для проэкта?
MQIsdp
Вот столкнулся с такой проблемой....
Пол года все было нормально а за последнюю неделю 2 раза такая ситуация...
Модем зарегестрирован в сети, звонки на него идут но реакции 0.Модем А6 mini
Прога на ардуине крутиться, светодиод мигает , но при сработке- реакции ноль.
Скетч из этой темы, допиленый под себя.
Как с этой бедой справиться?
Может периодически спрашивать что-то у оператора и если нет ответа- сброс?
Вот столкнулся с такой проблемой....
Может периодически спрашивать что-то у оператора и если нет ответа- сброс?
Я периодически спрашиваю регистрацию в сети, если нет то перезагружаю модем
Можна кусочек кода для примера?
В loop() {
if (millis()/1000 > timer) { // проверяем каждый час
Signal(); // проверяем уровень сигнала
timer += 360;
} Пост 667 смотрите, не могу с телефона писать...до компа доберусь только в четверг))
Проверяем уровень сигнала и тем самым убиваем 2х зайцев (можно заменить на регистрацию в сети). В подпрограмме sendATcomand(): если не придет ответ на команду, дергаем ногу модема reset. Но это для А6го.
Для sim800 можно программно перезагружать: в 705 посте посмотрите)
если он в состоянии воспринимать команды и не завис
Можно также ногой, там есть RST
Можно также ногой, там есть RST
если он в состоянии воспринимать команды и не завис
по сравнению с сим300 800й как небо и земля..
виснет крайне редко.
НО!! производитель рекомендует снимать питание с модуля для перезагрузки зависшего модуля. Так что по питанию - это самый верный вариант.
хрен... проверять нужно каждые 3 минуты..
Здравствуйте.
Никто не пробовал запустить телеграмбота на arduino + SIM800?
Я вот нашел код
, но долго мучил его (не отправлялось сообщение), нашел все-таки ошибку, оказалось в строке 35 необходимо изменить на
сообщение от бота приходит, а вот как получить сообщение ботом, никак не смог понять,
может у кого есть идеи?
вставлю свои 5 копеек.
Мучался на коленке собирать, сделал плату и заказал в китае.
Питание как видите, одна понижайка на 5в (ардуино, реле, часы) и вторая на 3.3в на GSM. с другой стороны преобразователь уровней с 3.3 на 5в. Кстате после всякого навесного монтажа работать стало стабильнее, всяких проблем с модемом не стало. Правда есть кое какие косяки по разводке но это выяснилось потом при монтаже уже.
А так это система полива и контроля состояния воды в баке, на этой же печатке сделали контроль отопительной системы в доме зимой.
Так что код универсален и подстраивается как надо
п.с. в коде #705 ошибка (у меня не захотел работать как надо)
заменить на ind+=9, а то получается не состыковка по номерам, записывается в памяти как +79123456789 а последний звонивший отображается 79123456789 т.е. без +, и ардуинка не понимает
smesharik, это, как выяснилось, с разными операторами необходимо менять (Теле2 и МТС номер возвращается с + и без). Насколько помню у сим800 питание от 3.6В-4.2В.
Ну вы меня поняли :) По мануалу 3,4-4,4в. Я где то 3.8 поставил
У меня МТС идет с +
Использовали код из #705 поста?
50/50, код создавался параллельно с темой, с 705 взята только работа с GSM модемом
Такая проблема нарисовалась: При добавлении мастер-номеров приходит сообщение /master1 add/.
Призвонке с добавленного номера 0 реакции как и на SMS. По команде PHONE показывает 1мастер и добавленный номер.
при звонке с добавленного номера в монитор порта пишет "No Master Ring!" Где я что напутал?
Номер обрезает нормально:?
"RingPhone ......"