#1 2019-02-21 22:42:05

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

помогите поправить код ibutton+ардуино

Вот скетч работающего замка. Работает  так поднесли ключ открылась дверь по  истечении 3 секунд сама закрылась. Мне же надо, чтоб поднесли ключ  - открылась дверь и не закрывалась пока ещё раз не поднесут ключ к считывателю. Помогите исправить код.

 

#include <OneWire.h>
OneWire ds(10);// Определяем пин подключения к ключу
byte aaa[2][8] = {{0x01,0x11,0xF7,0x43,0x01,0x00,0x00,0x65},// Двухмерный массив известных ключей  EB 0 0 1 B6 7A 12 1 
                  {0xEB,0x00,0x00,0x01,0xB6,0x7A,0x12,0x01}};// Первое число - количество ключей, второе - количество байт в ключе
byte addr[8], k, m; // Обозначаем массив для чтения ключа из 8 байт
void setup() {
pinMode(13, OUTPUT);// Прописываем диод на пин 13.
Serial.begin(9600);}// Запускаем порт
void loop() {
  m = 0;// Обнуляем указатель наличия ключа
if (ds.search(addr)){// Если устройство подключено - считываем
for (k=0; k<2; k++){// Запускаем цикл перебора ключей
if(aaa[k][0] == addr[0] && aaa[k][1] == addr[1] && aaa[k][2] == addr[2] // Сравниваем побайтно массивы
&& aaa[k][3] == addr[3] && aaa[k][4] == addr[4] && aaa[k][5] == addr[5] // Да, это черезчур громоздко, зато просто "как кувалда".
&& aaa[k][6] == addr[6] && aaa[k][7] == addr[7]){ m=1;}} // Если ключ есть увеличиваем значение указателя
if (m > 0) {// Проверяем значение указателя
      Serial.println("OK");// Если код совпал пишем ОК!
      digitalWrite(13, HIGH);// Зажигаем диод
            
      delay(3000);// Выдерживаем паузу
      digitalWrite(13, LOW);}// Гасим диод
      else {Serial.println("NO!");// Если несовпадение пишем NO!
      delay(500);}

      
for(int i=7; i>-1; i--){// Запускаем цикл печати данных из массива
Serial.print(addr[i], HEX);// Печатаем нужный байт в шестнадцатиричном виде
Serial.print(" ");}// Печатаем пробел
Serial.println();// В конце цикла переводим строку
ds.reset_search();}} // Сбрасываем устройство

Неактивний

#2 2019-02-22 00:46:01

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: помогите поправить код ibutton+ардуино

а где у вас в коде дверь закрывается через 3 сек.

Неактивний

#3 2019-02-22 02:03:29

ard125
Учасник
Зареєстрований: 2019-01-30
Повідомлень: 121

Re: помогите поправить код ibutton+ардуино

Добавляйте в код флаг. Поднесли ключ - флаг взвели, замок сработал. Еще раз поднесли ключ - флаг сбросили, замок закрылся.

Неактивний

#4 2019-02-22 19:12:12

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: помогите поправить код ibutton+ардуино

Не проверял работу

//-----замок-----------------------
typedef void(*pDo)();
pDo Do = [] {};
#include <OneWire.h>
OneWire ds(/*пин*/10);
const byte num = 2; // 2 кода
const byte base[num][8] = {
  {0x01, 0x11, 0xF7, 0x43, 0x01, 0x00, 0x00, 0x65},// 1-й код
  {0xEB, 0x00, 0x00, 0x01, 0xB6, 0x7A, 0x12, 0x01} // 2-й код
};
void runLock() {
  byte tmp[8];
  bool ok = false;
  if (ds.search(tmp)) {
    for (int i = 0; i < num; i++) {
      if (base[i][0] == tmp[0] && base[i][1] == tmp[1] &&
          base[i][2] == tmp[2] && base[i][3] == tmp[3] &&
          base[i][4] == tmp[4] && base[i][5] == tmp[5] &&
          base[i][6] == tmp[6] && base[i][7] == tmp[7] ) ok = true;
    }
    for (int i = 7; i > -1; i--) {
      Serial.print(tmp[i], HEX); Serial.print(" ");
    }
    Serial.println();
    if (ok)Do();
    ds.reset_search();
  }
}
//---------автомат-----------------------------
const byte ledPin =/*пин*/13;
// состояния автомата
const byte s0 = 0;// считываем что бы открыть
const byte s1 = 1;// пауза что бы убрать ключ
const byte s2 = 2;// считываем что бы закрыть
const byte s3 = 3;// пауза что бы убрать ключ
pDo run = [] {};
const unsigned long time1s = 1000; // 1 секунда на убрать ключ
unsigned long past;
void set(byte s) {
  past = millis();
  switch (s) {
    case s0:
      digitalWrite(ledPin, LOW);
      Do = [] {set(s1);};
      run = [] {};
      break;
    case s1:
      digitalWrite(ledPin, HIGH);
      Do = [] {};
      run = [] {
        if (millis() - past > time1s)
          set(s2);
      };
      break;
    case s2:
      Do = [] {set(s3);};
      run = [] {};
      break;
    case s3:
      digitalWrite(ledPin, LOW);
      Do = [] {};
      run = [] {
        if (millis() - past > time1s)
          set(s0);
      };
      break;
  }
}
//-------------------------------------------------
void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  set(s0);
}

void loop() {
  runLock();
  run();
}

Остання редакція qwone (2019-02-22 22:49:42)

Неактивний

#5 2019-02-22 20:54:19

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: помогите поправить код ibutton+ардуино

qwone- Спасибо. Скопилировался правильно.  Буду на работе проверю.


"а где у вас в коде дверь закрывается через 3 сек."

Дверь в коде - это светодиод!


Serial.println("OK");// Если код совпал пишем ОК!
      digitalWrite(13, HIGH);// Зажигаем диод
            
      delay(3000);// Выдерживаем паузу
      digitalWrite(13, LOW);}// Гасим диод
      else {Serial.println("NO!");// Если несовпадение пишем NO!
      delay(500);}

Остання редакція ssipk (2019-02-22 20:54:50)

Неактивний

#6 2019-02-22 21:35:03

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: помогите поправить код ibutton+ардуино

Вы же просили поднесли карточку дверь открылась . Еще раз дверь закрылась. Конечно это нужно делать с паузой в 1 секунду. А то дверь отрылась-закрылась будет меняться каждую секунду без отъема карточки.

Неактивний

#7 2019-02-22 22:05:54

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: помогите поправить код ibutton+ардуино

"qwone" - Вам спасибо за код.
А про дверь и светодиод - это я отвечал "vvr"

Неактивний

#8 2019-02-25 21:01:41

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: помогите поправить код ibutton+ардуино

Посоветуйте хороший учебник по программированию в среде ардуино и по Си  или С++

Неактивний

#9 2019-02-25 21:58:59

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: помогите поправить код ibutton+ардуино

Хороших то и нету. Посредственных море. А конечные автоматы с лямда функцией это моя личная наработка. Ну так по мелочам http://arduino.ru/forum/programmirovanie/tsifrovye-avtomaty-v-klassakh-po-qwone#comment-431698

Неактивний

#10 2019-02-25 22:14:53

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: помогите поправить код ibutton+ардуино

Я работаю матером по ремонту оргтехники и бытовой техники. Ардуино решил освоить интересная штука. Меня интересует именно программирование.  Модули я сам паяю ... Вот и спрашиваю про хороший учебник ... Я так понимаю Вы на Си пишите?

Неактивний

#11 2019-02-25 22:56:16

C/C++
Гість

Re: помогите поправить код ibutton+ардуино

Полный справочник по C ++ 4-е издание Герберта Шилдта.

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму