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

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

1

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

Gienekb пишет:

 У вас какая библиотека? У меня 2.6.2
 
 
Я разработал проблему. Он компилирует правильно.
Только при копировании скетча, получаю так:

что то с кириллицей у вас

 

 

Gienekb
Offline
Зарегистрирован: 29.08.2017
 
Да, я согласен, у меня проблема с  кириллицей . Единственный вопрос - почему?
Если я копирую с поста # 216, получаю:

001
#include <EEPROM.h>
002
#include <OneWire.h>
003
#include<SoftwareSerial.h>
004
SoftwareSerial mySerial(2, 3);
005
 
006
OneWire ds(12);                              // датчик температуры подключен к 9 пину, подтяжка 4.7кОм на +.
007
#define DOOR 4                              // концевик двери.
008
#define PIR 5                               // датчик движения.
009
#define Led 8                               // состояние системы. моргает - на охране.
010
#define BUZ 10                              // сирена.
011
#define GAS A0                              // датчик дыма.
012
 
013
// DOOR     - если сработал, на входе "+" HIGH.
014
// PIR      - если сработал, на входе "+" HIGH.
015
// GAS      - если сработал, на входе "+" HIGH.
016
// BUZ      - если "-" LOW, то горит.
017
// Led      - если "-" LOW, то горит.

 

Denikyhar
Offline
Зарегистрирован: 18.05.2017

#include
#include

SoftwareSerial mySerial(8, 9); //На этих пинах подключен модем RX, TX
#define RLed 10 // Красный светодиод
#define BLed 11 // Синий светодиод
#define GLed 12 // Зеленый светодиод
#define AlarmPin 4 // Выход "тревожного" пина, при срабатывании датчика на этом пине устанавливается сигнал высокого уровня на время указанное в переменной AlarmInterval, по умолчанию 60 секунд.
#define InverseAlarmPin 5 // Инверсный выход "тревожного" пина, при срабатывании датчика на этом пине устанавливается сигнал низкого уровня на время указанное в переменной AlarmInterval, по умолчанию 60 секунд.
#define DoorPin 6 // Номер входа, подключенный к датчику
int8_t DoorState = 0; // Переменная для хранения состояния датчика
int8_t DoorFlag = 1;

int8_t RLedState = LOW;
int8_t GLedState = LOW;
int8_t BLedState = LOW;

unsigned long previousAlarmMillis = 0;
uint16_t AlarmInterval = 60; // Секунд до отключения "тревожного" пина.

unsigned long previousMillis = 0;
uint16_t interval = 100;

uint8_t PauseTime = 15; // Время, указывается в минутах, на которое сигнализация должна засыпать при получении смс команды Pause.

uint8_t ch = 0;
int8_t sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
int8_t AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
int8_t guard = 1; //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
int8_t sendsmscaller; //Переменная для отправки смс о снятии или установки на охрану пользователям которые отсутствуют в массиве AlarmPhone
int8_t LedTestOn = 0;
int8_t LedOn = 1;

String BalanceNumber = "#100#"; //Команда запроса баланса. #100# - ответ латинскими буквами, *100# - ответ русскими буквами. Работает только с латинскими буквами. В данном случае команда запроса баланса Beeline(Россия).
uint8_t BalanceStringLen = 22; //Число символов от начала строки которые нужно переслать в смс сообщении при получении USSD ответа о балансе. Убираем спам от оператора при запросе баланса, особо критично для модема M590, обрезаем всё лишнее.

String val = "";
String RingPhone = "";
String LastEvent = "System -> guard ";

int8_t ModemID = 0;

const char* AllowPhone[] = {"70001234501", "70001234502", "70001234503", "70001234504", "70001234505"}; //Номера которым разрешено управлять охраной. На первый номер будут отправляться смс монитора порта (для отладки)
int8_t CountPhone = sizeof(AllowPhone) / sizeof(AllowPhone[0]);

const char* AlarmPhone[] = {"70001234501", "70001234502"}; //Номера для отправки смс при срабатывании датчиков и о снятии или установки на охрану. На первый номер будет осуществляться вызов если AlarmRing = 1;
int8_t CountAlarmPhone = sizeof(AlarmPhone) / sizeof(AlarmPhone[0]);

/*
EEPROM Data:
№ ячейки - значение;
0 - если записана не 1, то необходимо затереть часть памяти eeprom'a и восстановить стандартную конфигурацию.
10 - sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
11 - AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
12 - LedTestOn = 0;
13 - LedOn = 1;
14 - guard =1; //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
*/
void setup() {

Serial.begin(9600);

//EEPROM.update(0, 255); //reset config;
eepromconfig();

pinMode(RLed, OUTPUT);
pinMode(GLed, OUTPUT);
pinMode(BLed, OUTPUT);
digitalWrite(RLed, HIGH);
digitalWrite(GLed, HIGH);
digitalWrite(BLed, HIGH);

digitalWrite(RLed, LOW);
delay(500);
digitalWrite(RLed, HIGH);
digitalWrite(GLed, LOW);
delay(500);
digitalWrite(GLed, HIGH);
digitalWrite(BLed, LOW);
delay(500);
digitalWrite(BLed, HIGH);

pinMode(DoorPin, INPUT);

pinMode(AlarmPin, OUTPUT);
digitalWrite(AlarmPin, LOW);
pinMode(InverseAlarmPin, OUTPUT);
digitalWrite(InverseAlarmPin, HIGH);

InitModem();
}

void loop() {
if (LedTestOn == 0) digitalWrite(BLed, HIGH);
if (LedTestOn == 1) LedTest();
Led();
AlarmPinOff();
Detect();
if (mySerial.available()) {
while (mySerial.available()) {
ch = mySerial.read();
val += char(ch);
delay(20);
}
if (val.indexOf("+PBREADY") > -1) InitModem();
if (val.indexOf("RING") > -1) {
if (CheckPhone() == 1) {
mySerial.println("ATH0");
sendsmscaller = 1;

MasterRing();
} else {

mySerial.println("ATH0");
}
} else if (val.indexOf("+CMT:") > -1) {
if (CheckPhone() == 1) {
sendsmscaller = 1;
MasterSms();
}
} else if (val.indexOf("+CUSD:") > -1) {

Serial.println(RingPhone);
Serial.println(val);
if (val.indexOf("\"") > -1) {
sms(String(val.substring(String(val.indexOf("\"")).toInt() + 1, String(val.indexOf("\"")).toInt() + BalanceStringLen)), String("+" + RingPhone));
delay(1000);
}
mySerial.println("AT+CUSD=0");
delay(200);
} else
Serial.println(val);
val = "";
}
if (Serial.available()) {
while (Serial.available()) {
ch = Serial.read();
val += char(ch);
delay(20);
}
mySerial.println(val);
ConsolePrint();
val = "";
}
}

void eepromconfig() {
pinMode(13, OUTPUT);
if (EEPROM.read(0) != 1) {
for (int i = 0 ; i < 20 ; i++) {
EEPROM.update(i, 255);
delay(10);
}
EEPROM.update(10, 1); // sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
EEPROM.update(11, 1); // AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
EEPROM.update(12, 0); // LedTestOn = 0;
EEPROM.update(13, 1); // LedOn = 1;
EEPROM.update(14, 1); //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
EEPROM.update(0, 1);
digitalWrite(13, HIGH);
}
if (EEPROM.read(0) == 1) {
sendsms = EEPROM.read(10); // sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
AlarmRing = EEPROM.read(11); // AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
LedTestOn = EEPROM.read(12); // LedTestOn = 0;
LedOn = EEPROM.read(13); // LedOn = 1;
guard = EEPROM.read(14); //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
if (guard == 1) LastEvent = LastEvent + "on";
if (guard == 0) LastEvent = LastEvent + "off";
}
}

void InitModem() {
delay(2000);
Serial.begin(9600);
mySerial.begin(9600);
mySerial.println("AT");
delay(100);
mySerial.println("ATI");
delay(100);
if (mySerial.find("M590")) ModemID = 1;
mySerial.println("ATI");
delay(100);
if (mySerial.find("SIM800")) ModemID = 2;
delay(100);
mySerial.println("AT+CLIP=1");
delay(100);
mySerial.println("AT+CMGF=1");
delay(100);
mySerial.println("AT+CSCS=\"GSM\"");
delay(100);
mySerial.println("AT+CNMI=2,2");
delay(100);
}

int CheckPhone() {
for (int i = 0; i < CountPhone; i++) {
if (val.indexOf(AllowPhone[i]) > -1) {
RingPhone = AllowPhone[i];
Serial.println("Event: +" + RingPhone);
return 1;
}
}
return 0;
}

void Detect() {
DoorState = digitalRead(DoorPin);
if (DoorState == LOW && DoorFlag == 0) {
DoorFlag = 1;
delay(100);
if (LedOn == 1) digitalWrite(GLed, LOW);
Alarm();
}
if (DoorState == HIGH && DoorFlag == 1) {
DoorFlag = 0;
delay(100);
}
}

void Led() {
if (guard == 1) {
digitalWrite(GLed, HIGH);
digitalWrite(RLed, LOW);
}
if (guard == 0) {
digitalWrite(RLed, HIGH);
if (LedOn == 1) digitalWrite(GLed, LOW);
}
}

void LedTest() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (RLedState == LOW)
RLedState = HIGH;
else
RLedState = LOW;
digitalWrite(BLed, RLedState);
}
}

void AlarmPinOff() {
unsigned long currentAlarmMillis = millis();
if (currentAlarmMillis - previousAlarmMillis > AlarmInterval * 1000) {
digitalWrite(AlarmPin, LOW);
digitalWrite(InverseAlarmPin, HIGH);
}
}

void Alarm() {
if (guard == 1) {
digitalWrite(AlarmPin, HIGH);
digitalWrite(InverseAlarmPin, LOW);
previousAlarmMillis = millis();
for (int i = 0; i < CountAlarmPhone; i++) {
sms(String("Srabotal datchik dveri!"), String("+" + String(AlarmPhone[i])));
delay(1000);
}
if (AlarmRing == 1) {
mySerial.println("ATD+" + String(AlarmPhone[0]) + ";");
delay(1000);
}
}
}

void MasterRing() {
if (guard == 1) GuardOff();
else if (guard == 0) GuardOn();
}

void GuardOff() {
guard = 0;
EEPROM.update(14, guard);
LastEvent = "Guard Off. Phone +" + RingPhone;
Serial.println(LastEvent);
delay(1000);
for (int i = 0; i < CountAlarmPhone; i++) {
if (RingPhone == String(AlarmPhone[i])) sendsmscaller = 0;
delay(1000);
sms(String(LastEvent), String("+" + String(AlarmPhone[i])));
delay(1000);
}
if (sendsmscaller == 1) {
delay(1000);
sms(String("Guard Off"), String("+" + RingPhone));
delay(1000);
}
}

void GuardOn() {
guard = 1;
EEPROM.update(14, guard);
DoorFlag = 1;
LastEvent = "Guard On. Phone +" + RingPhone;
Serial.println(LastEvent);
delay(1000);
for (int i = 0; i < CountAlarmPhone; i++) {
if (RingPhone == String(AlarmPhone[i])) sendsmscaller = 0;
delay(1000);
sms(String(LastEvent), String("+" + String(AlarmPhone[i])));
delay(1000);
}
if (sendsmscaller == 1) {
delay(1000);
sms(String("Guard On"), String("+" + RingPhone));
delay(1000);
}
}

void MasterSms() {
val.toLowerCase();
if ((val.indexOf("resetconfig") > -1)) {
EEPROM.update(0, 255);
eepromconfig();
}
if ((val.indexOf("money") > -1)) {
delay(1000);
balance();
delay(1000);
}
if ((val.indexOf("pause") > -1)) {
delay(1000);
sms(String("Pause " + String(PauseTime) + " min"), String("+" + RingPhone));
digitalWrite(BLed, LOW);
delay(PauseTime * 60000);
digitalWrite(BLed, HIGH);
}
if ((val.indexOf("ringon") > -1)) {
delay(1000);
AlarmRing = 1;
EEPROM.update(11, AlarmRing);
sms(String("RingOn: Alarm Ring is ON"), String("+" + RingPhone));
delay(1000);
}
if ((val.indexOf("ringoff") > -1)) {
delay(1000);
AlarmRing = 0;
EEPROM.update(11, AlarmRing);
sms(String("RingOff: Alarm Ring is OFF"), String("+" + RingPhone));
delay(1000);
}
if ((val.indexOf("smson") > -1)) {
delay(1000);
sendsms = 1;
EEPROM.update(10, sendsms);
sms(String("Sms On"), String("+" + RingPhone));
delay(1000);
}
if ((val.indexOf("smsoff") > -1)) {
delay(1000);
sms(String("Sms Off"), String("+" + RingPhone));
sendsms = 0;
EEPROM.update(10, sendsms);
delay(1000);
}
if ((val.indexOf("guardon") > -1)) {
delay(1000);
GuardOn();
}
if ((val.indexOf("guardoff") > -1)) {
delay(1000);
GuardOff();
}
if ((val.indexOf("info") > -1)) {
delay(1000);
sms(String("Info: " + LastEvent), String("+" + RingPhone));
delay(1000);
}
if ((val.indexOf("clearsms") > -1)) {
clearsms();
delay(2000);
sms(String("Clear: All messages removed"), String("+" + RingPhone));
delay(1000);
}
if ((val.indexOf("teston") > -1)) {
delay(1000);
LedTestOn = 1;
EEPROM.update(12, LedTestOn);
delay(1000);
}
if ((val.indexOf("testoff") > -1)) {
delay(1000);
LedTestOn = 0;
EEPROM.update(12, LedTestOn);
digitalWrite(BLed, HIGH);
delay(1000);
}
if ((val.indexOf("ledoff") > -1)) {
delay(1000);
LedOn = 0;
EEPROM.update(13, LedOn);
digitalWrite(GLed, HIGH);
delay(1000);
}
if ((val.indexOf("ledon") > -1)) {
delay(1000);
LedOn = 1;
EEPROM.update(13, LedOn);
digitalWrite(GLed, LOW);
delay(1000);
}
clearsms();
}

void ConsolePrint() {
val.toLowerCase();
if ((val.indexOf("clearsms") > -1)) {
clearsms();
delay(2000);
}
if ((val.indexOf("resetconfig") > -1)) {
EEPROM.update(0, 255);
eepromconfig();
}
}

void balance() {
mySerial.println("AT+CUSD=1");
delay(200);
mySerial.println("ATD" + BalanceNumber);
delay(200);
}

void clearsms() {
if (ModemID == 1) mySerial.println("AT+CMGD=0,4");
if (ModemID == 2) mySerial.println("AT+CMGD=4");
}

void sms(String text, String phone) {
if (sendsms == 1 ) {
mySerial.println("AT+CMGS=\"" + phone + "\"");
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS sended! Phone: " + phone + "; Message: " + text);
delay(5000);
} else {
delay(1000);
Serial.println("Silent mode, SMS not sended! Phone: " + phone + "; Message: " + text);
}
}
что здесь не так немогу запрограмирувать ардуино

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

#include
#include

Так не должно быть! #include подключает библиотеку.

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

pasha413 пишет:
Так не должно быть! #include подключает библиотеку.
Да, не, Страдивари для лохов делал скрипки, а для нормальных пацанов - барабаны :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

"что здесь не так немогу запрограмирувать ардуино"

Не так тут всё.....

Denikyhar
Offline
Зарегистрирован: 18.05.2017

а что мне далать с кодом редактировать или надо что то удалить от туда ?

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Спрячь под спойлер.

Denikyhar
Offline
Зарегистрирован: 18.05.2017

а поксажите как спрятать я в етом деле новичок?

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Не туда галку ткнул. Ниже надо. Сворачивать код по умолчанию.

Denikyhar
Offline
Зарегистрирован: 18.05.2017
#include <SoftwareSerial.h>
#include <EEPROM.h>

SoftwareSerial mySerial(8, 9); //На этих пинах подключен модем RX, TX
#define RLed 10 // Красный светодиод
#define BLed 11 // Синий светодиод
#define GLed 12 // Зеленый светодиод
#define AlarmPin 4 // Выход "тревожного" пина, при срабатывании датчика на этом пине устанавливается сигнал высокого уровня на время указанное в переменной AlarmInterval, по умолчанию 60 секунд.
#define InverseAlarmPin 5 // Инверсный выход "тревожного" пина, при срабатывании датчика на этом пине устанавливается сигнал низкого уровня на время указанное в переменной AlarmInterval, по умолчанию 60 секунд.
#define DoorPin 6 // Номер входа, подключенный к датчику
int8_t DoorState = 0; // Переменная для хранения состояния датчика
int8_t DoorFlag = 1;

int8_t RLedState = LOW;
int8_t GLedState = LOW;
int8_t BLedState = LOW;


unsigned long previousAlarmMillis = 0;
uint16_t AlarmInterval = 60; // Секунд до отключения "тревожного" пина.

unsigned long previousMillis = 0;
uint16_t interval = 100;

uint8_t PauseTime = 15; // Время, указывается в минутах, на которое сигнализация должна засыпать при получении смс команды Pause.

uint8_t ch = 0;
int8_t sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
int8_t AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
int8_t guard = 1; //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
int8_t sendsmscaller; //Переменная для отправки смс о снятии или установки на охрану пользователям которые отсутствуют в массиве AlarmPhone
int8_t LedTestOn = 0;
int8_t LedOn = 1;

String BalanceNumber = "#100#"; //Команда запроса баланса. #100# - ответ латинскими буквами, *100# - ответ русскими буквами. Работает только с латинскими буквами. В данном случае команда запроса баланса Beeline(Россия).
uint8_t BalanceStringLen = 22; //Число символов от начала строки которые нужно переслать в смс сообщении при получении USSD ответа о балансе. Убираем спам от оператора при запросе баланса, особо критично для модема M590, обрезаем всё лишнее.

String val = "";
String RingPhone = "";
String LastEvent = "System -> guard ";

int8_t ModemID = 0;

const char* AllowPhone[] = {"70001234501", "70001234502", "70001234503", "70001234504", "70001234505"}; //Номера которым разрешено управлять охраной. На первый номер будут отправляться смс монитора порта (для отладки)
int8_t CountPhone = sizeof(AllowPhone) / sizeof(AllowPhone[0]);

const char* AlarmPhone[] = {"70001234501", "70001234502"}; //Номера для отправки смс при срабатывании датчиков и о снятии или установки на охрану. На первый номер будет осуществляться вызов если AlarmRing = 1;
int8_t CountAlarmPhone = sizeof(AlarmPhone) / sizeof(AlarmPhone[0]);


/*
  EEPROM Data:
  № ячейки - значение;
  0 - если записана не 1, то необходимо затереть часть памяти eeprom'a и восстановить стандартную конфигурацию.
  10 - sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
  11 - AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
  12 - LedTestOn = 0;
  13 - LedOn = 1;
  14 - guard =1; //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
*/
void setup() {

  Serial.begin(9600);

  //EEPROM.update(0, 255); //reset config;
  eepromconfig();

  pinMode(RLed, OUTPUT);
  pinMode(GLed, OUTPUT);
  pinMode(BLed, OUTPUT);
  digitalWrite(RLed, HIGH);
  digitalWrite(GLed, HIGH);
  digitalWrite(BLed, HIGH);

  digitalWrite(RLed, LOW);
  delay(500);
  digitalWrite(RLed, HIGH);
  digitalWrite(GLed, LOW);
  delay(500);
  digitalWrite(GLed, HIGH);
  digitalWrite(BLed, LOW);
  delay(500);
  digitalWrite(BLed, HIGH);

  pinMode(DoorPin, INPUT);

  pinMode(AlarmPin, OUTPUT);
  digitalWrite(AlarmPin, LOW);
  pinMode(InverseAlarmPin, OUTPUT);
  digitalWrite(InverseAlarmPin, HIGH);

  InitModem();
}

void loop() {
  if (LedTestOn == 0) digitalWrite(BLed, HIGH);
  if (LedTestOn == 1) LedTest();
  Led();
  AlarmPinOff();
  Detect();
  if (mySerial.available()) {
    while (mySerial.available()) { 
      ch = mySerial.read();
      val += char(ch);
      delay(20);
    }
    if (val.indexOf("+PBREADY") > -1) InitModem();
    if (val.indexOf("RING") > -1) { 
      if (CheckPhone() == 1) {
        mySerial.println("ATH0");
        sendsmscaller = 1;

        MasterRing();
      } else {

        mySerial.println("ATH0"); 
      }
    } else if (val.indexOf("+CMT:") > -1) {  
      if (CheckPhone() == 1) {
        sendsmscaller = 1;
        MasterSms();
      }
    } else if (val.indexOf("+CUSD:") > -1) { 

      Serial.println(RingPhone);
      Serial.println(val);
      if (val.indexOf("\"") > -1) {
        sms(String(val.substring(String(val.indexOf("\"")).toInt() + 1, String(val.indexOf("\"")).toInt() + BalanceStringLen)), String("+" + RingPhone));
        delay(1000);
      }
      mySerial.println("AT+CUSD=0");
      delay(200);
    } else
      Serial.println(val); 
    val = "";
  }
  if (Serial.available()) { 
    while (Serial.available()) { 
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
    mySerial.println(val);
    ConsolePrint();
    val = "";  
  }
}

void eepromconfig() {
  pinMode(13, OUTPUT);
  if (EEPROM.read(0) != 1) {
    for (int i = 0 ; i < 20 ; i++) {
      EEPROM.update(i, 255);
      delay(10);
    }
    EEPROM.update(10, 1);  // sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
    EEPROM.update(11, 1);  // AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
    EEPROM.update(12, 0);  // LedTestOn = 0;
    EEPROM.update(13, 1);  // LedOn = 1;
    EEPROM.update(14, 1); //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
    EEPROM.update(0, 1);
    digitalWrite(13, HIGH);
  }
  if (EEPROM.read(0) == 1) {
    sendsms = EEPROM.read(10);  // sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
    AlarmRing = EEPROM.read(11);  // AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
    LedTestOn = EEPROM.read(12);  // LedTestOn = 0;
    LedOn = EEPROM.read(13);  // LedOn = 1;
    guard = EEPROM.read(14); //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
    if (guard == 1) LastEvent = LastEvent + "on";
    if (guard == 0) LastEvent = LastEvent + "off";
  }
}

void InitModem() {
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println("AT");
  delay(100);
  mySerial.println("ATI");
  delay(100);
  if (mySerial.find("M590")) ModemID = 1;
  mySerial.println("ATI");
  delay(100);
  if (mySerial.find("SIM800")) ModemID = 2;
  delay(100);
  mySerial.println("AT+CLIP=1");
  delay(100);
  mySerial.println("AT+CMGF=1"); 
  delay(100);
  mySerial.println("AT+CSCS=\"GSM\"");
  delay(100);
  mySerial.println("AT+CNMI=2,2");
  delay(100);
}

int CheckPhone() {
  for (int i = 0; i < CountPhone; i++) {
    if (val.indexOf(AllowPhone[i]) > -1) {
      RingPhone = AllowPhone[i];
      Serial.println("Event: +" + RingPhone);
      return 1;
    }
  }
  return 0;
}

void Detect() {
  DoorState = digitalRead(DoorPin);
  if (DoorState == LOW && DoorFlag == 0) {
    DoorFlag = 1;
    delay(100);
    if (LedOn == 1) digitalWrite(GLed, LOW);
    Alarm();
  }
  if (DoorState == HIGH && DoorFlag == 1) {
    DoorFlag = 0;
    delay(100);
  }
}

void Led() {
  if (guard == 1) {
    digitalWrite(GLed, HIGH);
    digitalWrite(RLed, LOW);
  }
  if (guard == 0) {
    digitalWrite(RLed, HIGH);
    if (LedOn == 1) digitalWrite(GLed, LOW);
  }
}

void LedTest() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    if (RLedState == LOW)
      RLedState = HIGH;
    else
      RLedState = LOW;
    digitalWrite(BLed, RLedState);
  }
}

void AlarmPinOff() {
  unsigned long currentAlarmMillis = millis();
  if (currentAlarmMillis - previousAlarmMillis > AlarmInterval * 1000) {
    digitalWrite(AlarmPin, LOW);
    digitalWrite(InverseAlarmPin, HIGH);
  }
}

void Alarm() {
  if (guard == 1) {
    digitalWrite(AlarmPin, HIGH);
    digitalWrite(InverseAlarmPin, LOW);
    previousAlarmMillis = millis();
    for (int i = 0; i < CountAlarmPhone; i++) {
      sms(String("Srabotal datchik dveri!"), String("+" + String(AlarmPhone[i])));
      delay(1000);
    }
    if (AlarmRing == 1) {
      mySerial.println("ATD+" + String(AlarmPhone[0]) + ";");
      delay(1000);
    }
  }
}

void MasterRing() {
  if (guard == 1) GuardOff();
  else if (guard == 0) GuardOn();
}

void GuardOff() {
  guard = 0;
  EEPROM.update(14, guard);
  LastEvent = "Guard Off. Phone +" + RingPhone;
  Serial.println(LastEvent);
  delay(1000);
  for (int i = 0; i < CountAlarmPhone; i++) {
    if (RingPhone == String(AlarmPhone[i])) sendsmscaller = 0;
    delay(1000);
    sms(String(LastEvent), String("+" + String(AlarmPhone[i])));
    delay(1000);
  }
  if (sendsmscaller == 1) {
    delay(1000);
    sms(String("Guard Off"), String("+" + RingPhone));
    delay(1000);
  }
}

void GuardOn() {
  guard = 1;
  EEPROM.update(14, guard);
  DoorFlag = 1;
  LastEvent = "Guard On. Phone +" + RingPhone;
  Serial.println(LastEvent);
  delay(1000);
  for (int i = 0; i < CountAlarmPhone; i++) {
    if (RingPhone == String(AlarmPhone[i])) sendsmscaller = 0;
    delay(1000);
    sms(String(LastEvent), String("+" + String(AlarmPhone[i])));
    delay(1000);
  }
  if (sendsmscaller == 1) {
    delay(1000);
    sms(String("Guard On"), String("+" + RingPhone));
    delay(1000);
  }
}

void MasterSms() {
  val.toLowerCase();
  if ((val.indexOf("resetconfig") > -1)) {
    EEPROM.update(0, 255);
    eepromconfig();
  }
  if ((val.indexOf("money") > -1)) {
    delay(1000);
    balance();
    delay(1000);
  }
  if ((val.indexOf("pause") > -1)) {
    delay(1000);
    sms(String("Pause " + String(PauseTime) + " min"), String("+" + RingPhone));
    digitalWrite(BLed, LOW);
    delay(PauseTime * 60000);
    digitalWrite(BLed, HIGH);
  }
  if ((val.indexOf("ringon") > -1)) {
    delay(1000);
    AlarmRing = 1;
    EEPROM.update(11, AlarmRing);
    sms(String("RingOn: Alarm Ring is ON"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("ringoff") > -1)) {
    delay(1000);
    AlarmRing = 0;
    EEPROM.update(11, AlarmRing);
    sms(String("RingOff: Alarm Ring is OFF"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("smson") > -1)) {
    delay(1000);
    sendsms = 1;
    EEPROM.update(10, sendsms);
    sms(String("Sms On"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("smsoff") > -1)) {
    delay(1000);
    sms(String("Sms Off"), String("+" + RingPhone));
    sendsms = 0;
    EEPROM.update(10, sendsms);
    delay(1000);
  }
  if ((val.indexOf("guardon") > -1)) {
    delay(1000);
    GuardOn();
  }
  if ((val.indexOf("guardoff") > -1)) {
    delay(1000);
    GuardOff();
  }
  if ((val.indexOf("info") > -1)) {
    delay(1000);
    sms(String("Info: " + LastEvent), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("clearsms") > -1)) {
    clearsms();
    delay(2000);
    sms(String("Clear: All messages removed"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("teston") > -1)) {
    delay(1000);
    LedTestOn = 1;
    EEPROM.update(12, LedTestOn);
    delay(1000);
  }
  if ((val.indexOf("testoff") > -1)) {
    delay(1000);
    LedTestOn = 0;
    EEPROM.update(12, LedTestOn);
    digitalWrite(BLed, HIGH);
    delay(1000);
  }
  if ((val.indexOf("ledoff") > -1)) {
    delay(1000);
    LedOn = 0;
    EEPROM.update(13, LedOn);
    digitalWrite(GLed, HIGH);
    delay(1000);
  }
  if ((val.indexOf("ledon") > -1)) {
    delay(1000);
    LedOn = 1;
    EEPROM.update(13, LedOn);
    digitalWrite(GLed, LOW);
    delay(1000);
  }
  clearsms();
}

void ConsolePrint() {
  val.toLowerCase();
  if ((val.indexOf("clearsms") > -1)) {
    clearsms();
    delay(2000);
  }
  if ((val.indexOf("resetconfig") > -1)) {
    EEPROM.update(0, 255);
    eepromconfig();
  }
}

void balance() {
  mySerial.println("AT+CUSD=1");
  delay(200);
  mySerial.println("ATD" + BalanceNumber);
  delay(200);
}

void clearsms() {
  if (ModemID == 1) mySerial.println("AT+CMGD=0,4");
  if (ModemID == 2) mySerial.println("AT+CMGD=4");
}

void sms(String text, String phone) {
  if (sendsms == 1 ) {
    mySerial.println("AT+CMGS=\"" + phone + "\"");
    delay(500);
    mySerial.print(text);
    delay(500);
    mySerial.print((char)26);
    delay(500);
    Serial.println("SMS sended! Phone: " + phone + "; Message: " + text);
    delay(5000);
  } else {
    delay(1000);
    Serial.println("Silent mode, SMS not sended! Phone: " + phone + "; Message: " + text);
  }
}

 

Denikyhar
Offline
Зарегистрирован: 18.05.2017

а как перенести в програматор ардуино

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Шта? Уважаемый, ну почитайте уже основы ардуиноведенья! Ардуины самопрограммируются обычно. По UART. Из среды разработки Arduino IDE, которую можно скачать на официальном сайте. Потом еще библиотеки потребуется подключить. Большая часть пятикласников с этим легко справляются. Или Вы хотите шить программатором скомпилированный бинарник?

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

Denikyhar пишет:

а как перенести в програматор ардуино

Вам наверное для диплома надо? :)

Denikyhar
Offline
Зарегистрирован: 18.05.2017

спасибо

Denikyhar
Offline
Зарегистрирован: 18.05.2017

нет а что такое

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

Denikyhar пишет:

нет а что такое

Да так, обознался... :) Оставлю тут, так, просто поржать https://mysku.ru/blog/ebay/43282.html#comment2273204

Denikyhar
Offline
Зарегистрирован: 18.05.2017

ну и что с того мне не смешно 

 

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

Denikyhar пишет:

ну и что с того мне не смешно 

Да, иногда так бывает, кому-то смешно, а кому-то - нет.

Denikyhar
Offline
Зарегистрирован: 18.05.2017

ну я выжу ви неочень хотыте помогать ему 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Нда, мне нада и ниипет! Армия сука страшная. kvolk, ты случаем не золотая рыбка? Может и мне что-то нада? Да точно нада! :)

Повеселил с утра. И откуда они такие берутся? 

Таким никто не любит помогать. Потому что сразу пытаются влезть на шею и ножки свесить.

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

kvolk пишет:

Вам наверное для диплома надо? :)

да какой диплом, что вы... вы посмотрите, как он пишет. Кто такому даст диплом?

Denikyhar
Offline
Зарегистрирован: 18.05.2017

он может хочет научитса а ви тут все прям умникы !

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

А мы тут универ с преподавателями холявными. Хочет учиться - научится. Он халяву хочет скорее, чтобы не учится, а диплом получить.

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

Umka пишет:

Кто там бесперебойник просил? https://ru.aliexpress.com/item/DC-5-2-1A-DIY-4-2/32824032545.html?spm=a2g0v.10010108.1000023.2.4065f35EFTlOP

Я просил... Коменты читали?

= NoNaMe пишет:

Хотел использовать как миниUPS. Для этих целей не подошла. После отключения внешнего питания, вполне нормально высаживает аккумулятор, а по достижению предела его отключает. Однако после этого при подаче питания толком работу не возобновляет (на выходе платы питание некоторое время переключается между 2V и 5V), требуется аккумулятор отключить, а затем подключить заново. В целом, плата рабочая.

Это не ИБП, а контроллер - заряда разряда на 2,1А и плата защиты. Да, и на преобразование 3,7В -> 5В потратите 50% ёмксти акума. Да и плата совсем не бюджетная.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Не, чукча не читатель! :)

Может это частный случай? Там ссылка есть на другой лот, который по их мнению именно миниUPS.

И вот еще на гике статья https://geektimes.ru/company/nag/blog/294315/

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

Umka пишет:

И вот еще на гике статья https://geektimes.ru/company/nag/blog/294315/

Очень дорого :) Народная плата на TP4056 + транзистор + пару диодов  обойдётся в разы дешевле .

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

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

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

Umka пишет:

Кто там бесперебойник просил? https://ru.aliexpress.com/item/DC-5-2-1A-DIY-4-2/32824032545.html?spm=a2g0v.10010108.1000023.2.4065f35EFTlOP

По этой ссылке внизу написано: Этот модуль не подходит для бесперебойного питания (ИБП), если вам нужно модуля ибп, Нажмите здесь, чтобы купить

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

вот это

unsigned long door2 = 3258553; // адрес 433 передатчика геркона двери

меняем на

#define door2 3258553 // адрес 433 передатчика геркона двери

а почему бы вот эти строки: 

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

записать как:

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_door2 20      // секунд не смотрим на датчик двери 2.
int previousMillis_door2 = 0;
#define interval_pir 20        // секунд не смотрим на датчик движения. (а этих вообще переменных нету в коде)
int previousMillis_pir = 0;
#define interval_gas 60      // секунд не смотрим на датчик газа.      (а этих вообще переменных нету в коде)
int previousMillis_gas = 0;

 

Еще тогда меньше памяти занимать будет

понимаю конечно 13 байт памяти и 2 байта динамической для переменных это нет ни что, но все же оптимизация екарный бабык)

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

d13lider, благодарю. Именно так и сделаю. нашел, почему отсутствуют interval_pir и interval_gas. исправил у себя в скетче

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

ЕвгенийП пишет:

Umka пишет:

Кто там бесперебойник просил? https://ru.aliexpress.com/item/DC-5-2-1A-DIY-4-2/32824032545.html?spm=a2g0v.10010108.1000023.2.4065f35EFTlOP

По этой ссылке внизу написано: Этот модуль не подходит для бесперебойного питания (ИБП), если вам нужно модуля ибп, Нажмите здесь, чтобы купить

Модуль интеренсный, но все эти повышающие модули подходять для чего угодно, кроме питания модемов. Из-за пульсаций повышайки модемы "сходят с ума", и регистрируются в сети оператора через раз, а то и вобще отказываются регистрироваться. Именно по этой причине пришлось отказался от повышайки, плюс кэтому автономность работы устройства выросла с 24 часов до 60.

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

Umka пишет:

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

Если речь не о стоимости, тогда зачем изобретать велосипед? Можно пойти и купить готовое охранное устройство.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Давайте без крайностей. И почему нельзя фильтровать пульсации? Ведь импульсные преобразователи (БП) по сути одинаковы, повышайки или понижайки суть одно же. Тем более вч пульсации. 

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

Umka пишет:

И почему нельзя фильтровать пульсации?

Можно фильтровать. Сначала созавать пульсации, а потом фильтровать. Можно героически преодолевать трудности которые сами себе и создали.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Даже комментировать не хочется. Разве это трудности?!

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

kvolk пишет:

Если речь не о стоимости, тогда зачем изобретать велосипед? Можно пойти и купить готовое охранное устройство.

А Вы не понимаете?

Это же хобби. Я делаю что-то потому, что получаю от этого удовольствие, и плачу именно за это удовольствие, а не за конечное изделие. Его (удовольствие) Вы тоже предлагаете купить готовое?

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

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

ЕвгенийП пишет:

kvolk пишет:
 

Если речь не о стоимости, тогда зачем изобретать велосипед? Можно пойти и купить готовое охранное устройство.

PS. Пост 486.

А Вы не понимаете?

Это же хобби. Я делаю что-то потому, что получаю от этого удовольствие, и плачу именно за это удовольствие, а не за конечное изделие. Его (удовольствие) Вы тоже предлагаете купить готовое?

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

Я всё понимаю, читаю внимательно и последовательно.

http://arduino.ru/forum/proekty/gsm-signalizatsiya-m590arduino?page=9#co...

Umka пишет:

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

PS. Пост 481.

Так что там по поводу рыбаков и охотников?

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

ИТАК - ЛОЖКА ДЕГТЯ В ВАШУ БОЧКУ С МЕДОМ!

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

То неизбежны случаи когда проц иногда, но будет "вешаться" в силу причин наличия испульсных помех на входах где висят датчики с проводами. ЭТО БУДЕТ ПРОИСХОДИТЬ.! ЭТО БУДЕТ ОБЯЗАТЕЛЬНО ПРОИСХОДИТЬ! РАНО ИЛИ ПОЗДНО!

Так вот - вопрос всем в лоб: КАК ПРОГРАММНО ЗАПУСТИТЬ ВОЧДОГ?  чтобы например проц не  работает более 30 сек - и сам рессетится?

Без такой фичи - это бесполезная железка, поверьте мне на слово.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

Я лично давно смотрю в сторону собаки, читал статейки как и что работает. Однако попадались мне темы где описывали проблемы с собакой в том что если ставить его на максимум то при сработке он не успевает заново установить новый промежуток и ардуинке встаёт в вечный ребут. Это связано вроди как с прошивкой какой-то, и от версии зависит.
Кто пробовал ставить собаку ?

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

Поищите по форуму, тут уже на этом столько собак съели, что бить пальцы ещё раз сил никаких нет.

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

ЕвгенийП пишет:

Поищите по форуму, тут уже на этом столько собак съели, что бить пальцы ещё раз сил никаких нет.

тем не менее проблемы собак в гсм сигналке - не обсуждались. вообще.

 и именно проблема секунд на 30 например.

fixedip
Offline
Зарегистрирован: 16.03.2015

Как-то давно то же хотел сделать сигналку на на М590 (кстати на том же исходнике, что и третьем  посте), но пока модем ехал, начал писать код под сигналку без GSM (в надежде на последующее воссоединение) на ключах (домофонные).

Код рабочий (до воссоединения так дело и не дошло) , может кому пригодится, вообщем делюсь.

#include <EEPROM.h>
#include <OneWire.h>
#define zone1 A0
#define oxr 2
#define Zone1LED 4
#define alarm1LED 5
#define STOP1LED 6
int statusZ;
int timeOUT;
int statusO;
byte alarm;
byte Norma;
byte armed = 0;
const byte saveKey = 3; // вход для кнопки обнуления
const byte statusLed = 13;
OneWire  ds(8);

byte addr[8];
byte allKey; // всего ключей
 
// функция сверяет два адреса (два массива)
boolean addrTest(byte addr1[8], byte addr2[8]){
    for(int i = 0; i < 8; i++) {
      if (addr1[i] != addr2[i]) return 0;
  }
  return 1;
}

void error(){
  while(1){
    digitalWrite(statusLed, !digitalRead(statusLed));
    delay(300);
  }
}//

 boolean keyTest(){ // возвращает 1 если ключ есть в еепром
  byte addrTemp[8];  
  for (int i = 0; i < allKey; i++){  
    for(int y = 0; y < 8; y++) addrTemp[y] = EEPROM.read((i << 3) + y );   
    if (addrTest(addrTemp, addr)) return 1;
    
  }     
  return 0;
}//

void save(){ // сохраняет ключ в еепром
   digitalWrite(statusLed, HIGH);    
   if (allKey >= 63) error(); // если места нет 
 
   while (!ds.search(addr)) ds.reset_search(); // ждем ключ 
    if ( OneWire::crc8( addr, 7) != addr[7]) error();
    if (keyTest()) error(); // если нашли ключ в еепром.
  
   for(int i = 0; i < 8; i++) EEPROM.write((allKey << 3) + i, addr[i]);    
      
   allKey++; // прибавляем единицу к количеству ключей 
   EEPROM.write(511, allKey); 
  
  digitalWrite(statusLed, LOW);
  
}//
void button ()
{
  armed = !armed;
  Serial.print (keyTest());
  delay(1000);
}


void setup () {
  Serial.begin(9600);
  pinMode(zone1, INPUT);
  pinMode(oxr, INPUT);
  pinMode(Zone1LED, OUTPUT);
  pinMode(alarm1LED, OUTPUT);
  pinMode(STOP1LED, OUTPUT);
  attachInterrupt(0, button, RISING);
  pinMode(statusLed, OUTPUT);  
  pinMode(saveKey, INPUT_PULLUP);
  // если при включении нажата кнопка, сбрасываем ключи на 0 
  if (!digitalRead(saveKey)) EEPROM.write(511, 0);
  
  allKey = EEPROM.read(511); // читаем количество ключей
}
void loop () {
   ds.reset_search();
   
  statusZ = analogRead(zone1);
    
  
  if (keyTest()) button(); // если нашли ключ в еепром, открываем дверь
  boolean keyTest(false);
  Serial.println("A0 =");Serial.println(statusZ);
   if (armed == 0) {
    digitalWrite (Zone1LED, LOW);
    digitalWrite (alarm1LED, LOW);
    digitalWrite (STOP1LED, HIGH);
    alarm = 0;
    Norma = 0;
    timeOUT = 0;
    if (statusZ > 200)
    {
      Serial.println("Kopotkoe zamikanie");
      LED2 ();
    }
    if (statusZ == 0)
    {
      Serial.println("Obriv");
      LED2 ();
    }
  }
  if (Norma == 0)
  {
    if (statusZ > 150 && statusZ < 200)
    {
      Norma = 1;
    }
    else
    {
      Norma = 0;
    }
  }
  if (armed == 1 && alarm == 0 && Norma == 1)
  {
    if (statusZ > 150 && statusZ < 200 )
    {
      Serial.println("Norma");
      digitalWrite (Zone1LED, HIGH);
      digitalWrite (alarm1LED, LOW);
      digitalWrite (STOP1LED, LOW);
    }
    if (statusZ < 150 || statusZ > 200)
    {
      if (timeOUT == 300)
      {
      Serial.println("Alarm");
      digitalWrite (Zone1LED, LOW);
      digitalWrite (alarm1LED, HIGH);
      digitalWrite (STOP1LED, LOW);
      alarm = 1;
      timeOUT = 0;
      }
      timeOUT = timeOUT ++;
      Serial.print("timeOUT = ");Serial.println(timeOUT);
    delay(timeOUT);
    }
  }
  if (armed == 1 && alarm == 0 && Norma == 0)
  {
 LED ();
 Serial.println("Error");
  }
 
  
  //if (!digitalRead(saveKey)) save(); // если нажали кнопку  
  // сканируем шину, если нет устройств выходим из loop
if (!ds.search(addr));// return; 
 // if ( OneWire::crc8( addr, 7) != addr[7]); //return;
}

void LED ()
{
digitalWrite (Zone1LED, HIGH);
    delay(100);
    digitalWrite (alarm1LED, HIGH);
    delay(100);
    digitalWrite (Zone1LED, LOW);
    delay(100);
    digitalWrite (alarm1LED, LOW);
    delay(100);
}
void LED2 ()
{
digitalWrite (STOP1LED, HIGH);
    delay(100);
    digitalWrite (alarm1LED, HIGH);
    delay(100);
    digitalWrite (STOP1LED, LOW);
    delay(100);
    digitalWrite (alarm1LED, LOW);
    delay(100);
}

 

fixedip
Offline
Зарегистрирован: 16.03.2015

Схема подключения

https://drive.google.com/file/d/1DpYQdxiG8xGtC35NtK7onOeuB2n-udkzrA/view?usp=sharing - подключение шлейфа.

 https://drive.google.com/file/d/1BT8MQj5NYY5-n0--kbRcd-i8Za32rOETuA/view?usp=sharing - считывателя и индикаторов

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

Short Circuit пишет:

тем не менее проблемы собак в гсм сигналке - не обсуждались. вообще.

Нет никакой проблемы в собаке - ни вообще, ни в гсм-сигналке в частности. В ардуино Уно,Нано есть штатный вотчдог,  код его использования занимает ровно три строки, включая #include для вызова библиотеки. проще некуда:

#include <avr/wdt.h>

void setup() {

wdt_enable (WDTO_8S);  // start watcdog for 8sec
}

void loop() {

wdt_reset();  // reset watchdog timer every loop cycle
}

Единственная тонкость - если у вас Нано, надо сначало перешить загрузчик на оптибут или просто на штатный загрузчик от Уно.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

мой рассказ про собаку https://www.youtube.com/watch?v=ZTKsBBE9aGQ

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

b707 пишет:
Нет никакой проблемы в собаке - ни вообще, ни в гсм-сигналке в частности.

как нет? сейчас в 3 сек докажу, что есть:

вы пишите - wdt_enable (WDTO_8S);  // start watcdog for 8sec

тоесть каждый, весь цикл в программе должен проходить всегда не медленнее чем 8 сек?  а то, что пишут здесь этому отвечает? :) вот поэтому я написал вопрос за 30 сек.. :)

Тут его сложнее нужно прописывать, как - я пока не знаю.