Замок с цифровым паролем! На arduino uno!

Тема в разделе "Глядите, что я сделал", создана пользователем Svyatslav, 22 апр 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
    }
     
    Последнее редактирование: 23 апр 2018
    ZAZ-965 нравится это.
  2. parovoZZ

    parovoZZ Гуру

    А ПИН как сменить?
     
  3. Svyatslav

    Svyatslav Нерд

    В 6 строке меняйте!
     
  4. Svyatslav

    Svyatslav Нерд

    А адрес дисплея в 4 строке
     
  5. ИгорьК

    ИгорьК Давно здесь

    Правильно! Ни строчки коммента! Это круто! Это вааще! Проект - бомба!
    +100500 - ";" придумали чтобы все в одной строке писать. Проект - весч!
     
    Последнее редактирование: 23 апр 2018
    Arduino_man и Svyatslav нравится это.
  6. parovoZZ

    parovoZZ Гуру

    В смысле? Это в меню надо 6 строку выбрать?
     
  7. ZAZ-965

    ZAZ-965 Гик

    @Svyatslav, можете добавить фото конструкции?
    А замок я хочу, вот такой.
    эдинбург.jpg
     
    Arduino_man и Svyatslav нравится это.
  8. Svyatslav

    Svyatslav Нерд

    Последнее редактирование: 23 апр 2018
  9. Svyatslav

    Svyatslav Нерд

    Верно! Константы которые в начале имени стоит Pin, там хранятся номера пинов каждого элемента!
     
  10. Svyatslav

    Svyatslav Нерд

    Кстати сохранен пароль 1234
     
  11. parovoZZ

    parovoZZ Гуру

    Ничего не понимаю - а где реализация меню в коде?
     
  12. Svyatslav

    Svyatslav Нерд

    Если нажимаем на кнопку когда замок закрыт, то замок переходит в режим ввода пароля! С каждым нажатием на кнопку, увеличивается значение вводимой цифры! После паузы в 2 секунды можно вводить следующую цифру! Если пароль совпал то замок откроется! Если нажать на кнопку когда замок открыт, то он закроется! Пароль можно менять в 6 строке в константе PwdAccess! Длину пароля в 8 строке в переменной PwdInput!
     
  13. Svyatslav

    Svyatslav Нерд

    То есть: PinBeep - это зуммер, PinServo - это серва, PinKey - это кнопка
     
  14. Svyatslav

    Svyatslav Нерд

  15. parovoZZ

    parovoZZ Гуру

    не сходится:

    Код (C++):
    lcd.print("BBO\1 \5APO\4\7:")
    {lcd.print("*");}
    lcd.print("OTKP\6TO");
    lcd.print("\2AKP\6TO");
    lcd.print("BBE\1\3TE \5APO\4b");

     
    И не вижу записи в массив
    Код (C++):
    PwdAccess[]
     
  16. Svyatslav

    Svyatslav Нерд

    Как не видете!?:eek:
     
  17. Svyatslav

    Svyatslav Нерд

    А это:
    Код (C++):
    const uint8_t PinKey = 12, PinBeep = 9, PinServo = 8, PwdAccess[] = {1,2,3,4};
    Код (C++):
    uint8_t ... PwdInput[] = {0,0,0,0};
     
  18. parovoZZ

    parovoZZ Гуру

    А это присвоение начальных значений, то бишь инициализация переменных. Этой строчки в итоговом коде вообще не будет.

    Здесь пароль хранится? Мне казалось, что в pwdaccess[]
     
  19. Svyatslav

    Svyatslav Нерд

    Длина пароля хранится!
     
  20. Svyatslav

    Svyatslav Нерд

    А почему не будет?! Там хранится пины и пароль!!!