один ibutton считыватель на arduino и esp8266
- Войдите на сайт для отправки комментариев
Ср, 30/11/2016 - 21:07
черновик схемы

в esp8266 уже зашит код (0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB) чтоб есп включала свет
в ардуино же залит скетч с ключем (0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB)
char* RUS(char* StrIn){char* StrOut=StrIn; uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; while(i[2]>0&&i[0]<255){if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0){StrOut[i[1]]=i[3]+0x30;i[0]++;}else if(i[2]==0xd0&&i[3]==0x81){StrOut[i[1]]=0xA8;i[0]++;}else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90){StrOut[i[1]]=i[3]+0x70;i[0]++;}else if(i[2]==0xd1&&i[3]==0x91){StrOut[i[1]]=0xB8;i[0]++;}else{StrOut[i[1]]=i[2];} i[0]++; i[1]++; i[2]=StrIn[i[0]]; i[3]=StrIn[i[0]+1];} StrOut[i[1]]='\0'; return StrOut;}
#include <OneWire.h>
#include "pitches.h"
const byte greenLed = 10; //зеленая лампочка
const byte redLed = 11; //красная лампочка
const byte gerkonPin = 8; //gerkon
const byte iButtonPin = 12; //пин для ibutton
const byte tonePin = 7; // пин для пищалки
const byte waterPin = 9; // пин датчика воды
const byte alarmTime = 2; // время, чтобы поднести ключ при разблокировке
const byte startTime = 5; // время на закрытие двери при постановке на сигнализацию
OneWire ds(iButtonPin); //ibutton
byte code1[8] = {0x01, 0x86, 0xF1, 0x04, 0x12, 0x00, 0x00, 0x05}; //первый ключ
boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде
boolean alarmState = 0; //флаг работающей сигнализации
boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке.
boolean Hacked = 0;
// стандартные коды: 1- включение, 2- выключение, 3- тревога
void setup()
{
Serial.begin(115200);
delay(2000); //задержка включения
pinMode(greenLed, OUTPUT); //задаем режим работы пинов
pinMode(redLed, OUTPUT);
pinMode(waterPin, INPUT);
pinMode(gerkonPin, INPUT);
Notify(98); // оповещение о включении ардуино (напр. после перезагрузки)
}
void loop()
{
byte returnedValue = 0;
if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ
returnedValue = findKey();
if (returnedValue == 1) { // нашли известный ключ
guardON(); //вкл статус сигнализации
}
}
if(alarmState==1) { // если включена сигнализация, то
gerkonState = digitalRead(gerkonPin); //смотрим геркон
// Serial.println(gerkonState, HEX);
if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;)
Notify(1); // сообщаем компьютеру об открытии двери
alarmON(); //включаем сигналку
}
returnedValue = findKey(); //нужно выключить изнутри квартиры
if (returnedValue == 1) { // нашли известный ключ и
alarmState=0;
guardOFF();
}
}
returnedValue = 0; //обнуляем для обработки датчиков воды
//returnedValue = checkWater();
//if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды
// Notify(10); //сообщаем о срабатывании датчика воды
//}
delay (500);
}
int checkWater() //функция проверки датчика воды
{
int WsensorState = analogRead(waterPin);
Serial.println(WsensorState);
if (WsensorState == 1 && waterAlarmed == 0){
waterAlarmed =1;
return 1;
}
return 0;
}
int findKey() // функция поиска ключа
{
byte i;
byte addr[8];
byte checkOK = 0; //счетчик совпадений массива с эталоном
// Serial.println("searching key...");
if ( !ds.search(addr)) { // тут надо сделать нормально сделатЬ!!!
// Serial.println("No key connected..."); // сообщаем об этом
return; // и прерываем программу
for(int i = 0; i < 8; i++) {
ds.reset_search(); // сброс ключа
if (addr[i]==code1[i]) {
checkOK++;
}
}
if (checkOK == 5 )
return 1;
}
return 0;
}
void guardON() // выполнение действие при на сигнализацию
{
int j;
alarmState=1; //включаем статус сигнализации
guardSound(1); //бибикаем
for (j=0; j < startTime; j++) {
guardBlink(1); //моргаем лампочками и ждем время для закрытия двери
}
Notify(0);
}
void guardOFF() // выполнение действие при снятии с сигнализации
{
alarmState=0; // выключаем статус сигнализации
Hacked = 0; // отменям статус "взломано"
digitalWrite(greenLed, LOW);
guardSound(2); //бибикаем
guardBlink(2); //моргаем лампочками
Notify(3);
}
int alarmON() // выполнение действий при срабатывании сигнализации
{
int checkcount=0;
while (checkcount < alarmTime) { // даем alarmTime секунд для поднесения ключа
int alarmCancel = findKey(); //ищем ключик
if (alarmCancel == 1) { // нашли ключ
guardOFF(); //отключаем сигналку,
break; // выходим из цикла
}
checkcount++;
guardBlink(3); //пищим о том, что ищем ключ
guardSound(3); //светим о том, что ищем ключ
}
if (checkcount==alarmTime) { // если не нашли, то включаем оповещение
Notify(2);
guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО
guardSound(4); //светим о том, что УСЁ ПРОПАЛО
Hacked = 1;
}
}
int guardBlink (int x) //функция светового оповещения
{
if (x==1) { // первое ожидание для закрытия двери.
digitalWrite(redLed, HIGH);
digitalWrite(greenLed, LOW);
delay(500);
digitalWrite(redLed, LOW);
digitalWrite(greenLed, HIGH);
delay(500);
}
if (x==2) { // выключаем сигнализацию и диоды
digitalWrite(redLed, LOW);
digitalWrite(greenLed, LOW);
}
if (x==3) { // во время ожидания ключа при открытой двери
digitalWrite(redLed, HIGH);
delay (250);
digitalWrite(redLed, LOW);
delay (250);
}
if (x==4) { // просрочено, ахтунг
digitalWrite(redLed, HIGH);
}
}
int guardSound (int x) //функция звукового оповещения
{
if (x==1) {
int melody[] = { // музыка при включении сигнализацию
NOTE_G3, NOTE_G3, NOTE_G3
};
int noteDurations[] = {
4,4,4
};
for (int thisNote = 0; thisNote < 3; thisNote++) {
int noteDuration = 1000/noteDurations[thisNote];
tone(tonePin, melody[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(tonePin);
}
}
if (x==2) { // выключаем сигнализацию
int melody[] = {
NOTE_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3
};
int noteDurations[] = {
4, 8, 8, 4,4,4,4,4
};
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000/noteDurations[thisNote];
tone(tonePin, melody[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(tonePin);
}
}
if (x==3) { //тон ожидания ключа
tone(tonePin,NOTE_C4, 100);
}
if (x==4) { //тон просроченного ключа
tone(tonePin, 500); //включаем на 500 Гц
delay(100); //ждем 100 Мс
tone(tonePin, 1000); //включаем на 1000 Гц
delay(100); //ждем 100 Мс
}
}
int Notify(int x) //функция оповещения в последователньый порт
{
if (x==0) { // оповещение о постановке на сигнализацию
Serial.println(RUS("Сигнализация включена"));
}
if (x==1) { // оповещение о открытии двери
Serial.println(RUS("Дверь открыта"));
}
if (x==2) { // оповещение о взломе квартиры!
Serial.println(RUS("Тревога, проникновение"));
}
if (x==3) { // оповещение о выключении сигнализации
Serial.println(RUS("Сигнализация отключена"));
}
if (x==98) { // оповещение о включении ardunio
Serial.println(RUS("Система готова к работе"));
}
if (x==99) { // оповещение о ОШИБКЕ
Serial.println(RUS("Error"));
}
}
суть такова что в скетче что то не верно у меня так как начинает реагировать на совершенно любой ключ.
интересуют вопросы такие как:
1) верно ли по схеме у меня все
2) как все же сделать чтоб ардуина реагировала только на тот ключ что записан в скетче.
3) возможно ли дополнить скетч еще одной функцией, при чтении ключа (0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB ) отправляла бы этот код на любой из своих выходов, (при этом не реагировала бы сирена на этот ключ), а тот в свою очередь шел к есп.