Замок с цифровым паролем! На Arduino! (код с комментариями!!!)

Тема в разделе "Глядите, что я сделал", создана пользователем Svyatslav, 24 авг 2018.

  1. Svyatslav

    Svyatslav Гик

    Тому кто хочет замок!
    Нам нужно:
    Серво,
    lcd i2c 16x2 дисплей,
    troyka кнопка,
    troyka зуммер.
    Подключаем:
    Зуммер - 9пин
    Серво - 8пин
    Кнопка - 12пин
    lcd i2c - i2c
    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h> //Подключаем библиотеку для дисплея lcd i2c
    #include <Servo.h> //Подключаем библиотеку для сервы
    LiquidCrystal_I2C lcd(0x3F, 16, 2); //Объявляем объект для работы с lcd i2c адрес 0x3F 16 клеток 2 строки
    Servo ObjServo; //Объявляем объект для работы с сервой
    const uint8_t PinKey = 12, PinBeep = 9, PinServo = 8, PwdAccess[] = {1,2,3,4}; //Объявляем константы с выводами и паролем 1234
    bool ChangeMode = 1, PressKey = 0; //Создаём флаги. ChangeMode сигнализирует о смене режима а PressKey о нажатии на кнопку
    uint32_t PressTime = 0; //Создаём переменную для хранения времени последнего отпускания кнопки
    uint8_t Mode = 102, PwdInput[] = {0,0,0,0}; //Создаём переменные: Mode - Режим работы а PwdInput - вводимый пароль
    uint8_t symbol[7][8] = {{14, 10, 10, 10, 31, 17, 17, 0}, {14, 17, 1, 2, 1, 17, 14, 0}, {17, 17, 19, 21, 25, 17, 17, 0},
    {7, 9, 17, 17, 17, 17, 17, 0}, {31, 17, 17, 17, 17, 17, 17, 0}, {17, 17, 17, 29, 19, 19, 29, 0}, {15, 17, 17, 15, 5, 9, 17, 0}}; //Создаём символы для lcd i2c: Д,З,И,Л,П,Ы,Я

    void setup()
    {
      pinMode(PinKey, INPUT); pinMode(PinBeep, OUTPUT); pinMode(PinServo, OUTPUT); //Конфигурируем выводы
      ObjServo.attach(PinServo); lcd.init(); lcd.backlight(); ObjServo.write(0); //Иницилизируем lcd i2c и сервой
      for(int i = 0; i < 7; i++){lcd.createChar(i + 1, symbol[i]);} //Загружаем символы в память
    }

    void loop()
    {
      //Отслеживаем состояние кнопки и ждем пока она будет отпущена. Если нажатие было, устанавливаем флаг PressKey и сохраняем время! Ещё пищим зуммером
      if(digitalRead(PinKey)){tone(PinBeep, 1000, 100); while(digitalRead(2)){delay(100);} PressTime = millis(); PressKey = 1;}
      //Выполняем код в соответствии с текущим режимом Mode (0-99 ввод пароля, 100 проверка, 101 открыто, 102 закрыто)
      if(Mode < 100)
      {
        if(ChangeMode){ChangeMode = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("BBO\1 \5APO\4\7:"); lcd.setCursor(0, 1);
        for(int i = 0; i < sizeof(PwdAccess); i++){lcd.print("*");}}
        if(PressKey){PwdInput[Mode]++; if(PwdInput[Mode] > 9){PwdInput[Mode] = 0;}}
        lcd.setCursor(Mode, 1); if(millis() % 400 < 200){lcd.print(PwdInput[Mode]);}else{lcd.print(" ");}
        if((PressTime + 2000) < millis()){PressTime = millis(); lcd.setCursor(Mode, 1); lcd.print(PwdInput[Mode]); Mode++;
        if(Mode >= sizeof(PwdAccess)){Mode = 100;}}
      }
      else if(Mode == 100) //если установлен режим 100 (проверка пароля) то...
      {
        Mode = 101; for(int i = 0; i < sizeof(PwdAccess); i++){if(PwdAccess[i] != PwdInput[i]){Mode = 102;}} ChangeMode = 1;
      }
      else if(Mode == 101) //если установлен режим 101 (открыто) то...
      {
        if(ChangeMode){ChangeMode = 0; tone(PinBeep, 2000, 1000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("OTKP\6TO");
        ObjServo.write(180);}
        if(PressKey){Mode = 102; ChangeMode = 1;}
      }
      else if(Mode == 102) //если установлен режим 102 (закрыто) то...
      {
        if(ChangeMode){ChangeMode = 0; tone(PinBeep, 2000, 1000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("\2AKP\6TO");
        delay(2000); ObjServo.write(0); lcd.setCursor(0, 1); lcd.print("BBE\1\3TE \5APO\4b");}
        if(PressKey){for(int i = 0; i < sizeof(PwdAccess); i++){PwdInput[i] = 0;} Mode = 0; ChangeMode=1;}
      }
      PressKey = 0; //Сбрасываем флаг PressKey
    }
    Project_5_bb.png
     
    Последнее редактирование: 28 авг 2018
    Tomasina нравится это.
  2. Svyatslav

    Svyatslav Гик

    На этот раз код с комментариями!!!

    Скоро этот проект с изменяемым паролем без подключения к компу!!!
     
    Последнее редактирование модератором: 24 авг 2018
  3. Mitrandir

    Mitrandir Гуру

    это форум так изуродовал код?)
     
  4. Svyatslav

    Svyatslav Гик

    Ой!:(:eek:

    IARDUINO... ...так написала
     
    Последнее редактирование модератором: 26 авг 2018
  5. Mitrandir

    Mitrandir Гуру

    это обфускатор такой?
     
  6. Svyatslav

    Svyatslav Гик

    iarduino.ru

     
  7. BAR__MEN

    BAR__MEN Гуру

    Пиар iarduino в Амперке.. Это что-то новое...
    Автор, ты - труп:D:D
    ----
    И опять, злоупотребление восклицательными знаками
     
    Svyatslav нравится это.
  8. Svyatslav

    Svyatslav Гик

    Я так привык...
    ...печатать этим знаком
    ...заказывать из iarduino
    P.S !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Вот что значит восклицательный знак!
     
  9. Svyatslav

    Svyatslav Гик

    Я не труп!!!
     
    Последнее редактирование: 16 сен 2018
  10. BAR__MEN

    BAR__MEN Гуру

    Жаль что я не модератор,...
     
    Svyatslav и Andrey12 нравится это.
  11. Svyatslav

    Svyatslav Гик

    Хаха! :D
     
    Последнее редактирование: 16 сен 2018
  12. BAR__MEN

    BAR__MEN Гуру

    :mad::mad::mad:
     
  13. Deniskyn

    Deniskyn Гик

    Смотрю, вот все вроде бы и ничего....
    Но менять пароль из кода имхо трэш =) что с безперебойным питанием девайса, нет света и я в "сарай" не попал?
    ПС
    Ну и rfid припилить что бы таким неудобным способом пароль вводить, пароль оставить "на всякий пожарный"
     
    Svyatslav и BAR__MEN нравится это.
  14. Svyatslav

    Svyatslav Гик

    Почему вы так пишете!? :eek::mad::(
     
    Последнее редактирование: 16 сен 2018
  15. Svyatslav

    Svyatslav Гик

    Отличная идея!!!:);)
     
  16. BAR__MEN

    BAR__MEN Гуру

    Я буду так писать, пока Вы обращаетесь ко мне на "вы":)
    Не нравится мне так, чувствую себя старым пнем:)
     
  17. Svyatslav

    Svyatslav Гик

    Ладно! Не буду так больше писать! Это мой секретный язык qwerty!
     
  18. BAR__MEN

    BAR__MEN Гуру

    Вам что, 10 лет?


    UPD: хм.. точно, 10...:eek::eek::confused:
     
    Svyatslav нравится это.
  19. Mitrandir

    Mitrandir Гуру

    Это стаж работы с ардуино. 10тилетних в ржд не берут
     
    BAR__MEN нравится это.
  20. Svyatslav

    Svyatslav Гик

    Да