Лучший симулятор Arduino UnoArduSim 11 серия. Вход в меню по паролю, для TFT дисплея на Arduino.

Здравствуйте!

Эта статья содержит код программы, который использовался в 11 серии сериала «Не спали свою Ардуинку». Его можно использовать для изучения, и как заготовку для своего будущего меню со входом по паролю, и ниже найдете схему подключения TFT дисплея 1.8 160х128 пикселея и кнопок, к Arduino Mega 2560, чтобы вы сразу смогли собрать, и проверить работоспособность кода.

Меню с паролем для TFT дисплея 1.8 160х128 пикселей на Arduino Mega.

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

Данный код является примером того, как можно обеспечить вход в меню по паролю, для TFT дисплея на Arduino. Он представляет собой четыре странички меню, одна из которых задействована для ввода пароля. После введения неправильного пароля предлагается ввести пароль заново. После введения правильного пароля открывается доступ к остальным трем страничкам.

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

Этот код написан для платы Arduino Mega, но его можно использовать и для других плат Arduino, надо всего лишь указать в коде другие контакты, для подключения дисплея к шине SPI.

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


//Начало скетча


#include "TFT.h" //Подключение библиотеки TFT
#include "SPI.h" //Подключение библиотеки SPI
TFT TFTscreen = TFT(53, 49, 50);//CS, DC, RESET (Подключение контактов TFT дисплея по SPI)

int page = 0;    //Переменная отвечающая за вывод определенной сраницы меню
boolean flag = 1;//Переменная разрешающая вывод на TFT дисплей
boolean flag_button = 1;      //Переменная разрешающая опрос кнопок
unsigned long saveMillis = 0; //Переменная для хранения значения времени

const int  pin_OK = 6;    //Контакт для подключения кнопки OK
const int  pin_EXIT = 7;  //Контакт для подключения кнопки EXIT
const int  pin_UP = 8;    //Контакт для подключения кнопки UP
const int  pin_DOWN = 9;  //Контакт для подключения кнопки DOWN

//Переменна для хранения значения, обеспечивающего выбор вводимого значения пароля
int num_pass = 0;

//Константы для хранения пароля
const int  pass_0 = 4;
const int  pass_1 = 4;
const int  pass_2 = 4;
const int  pass_3 = 4;

//Переменные для хранения введенного пароля
int pass_number_0 = 0;
int pass_number_1 = 0;
int pass_number_2 = 0;
int pass_number_3 = 0;

//Функция для вывода чисел на TFT дисплей (для симулятора UnoArduSim)
void PRINT( long text, int x, int y, int srift, int xStep);
//Переменные Функции для вывода чисел на TFT дисплей
String incomingString;
String tempString;
int val, z = 0, z2 = 1, s = 0;

int goto_ = 0; //Переменная для обеспечения обходного пути(когда не работает функция goto)

void setup()
{
  TFTscreen.begin();              //Выполнить инициализацию TFT дисплея
  TFTscreen.background(0,0,0);    //Залить экран TFT дисплея черным цветом
  TFTscreen.setTextSize(2);       //Задать размер текста выводимого на TFT дисплей
  TFTscreen.stroke(255, 255, 255);//Задать белый цвет для теста выводимого на TFT дисплей

//Установить контакты контакты как входы, ч подаче на них высокого уровня (5 вольт)
  pinMode(pin_OK, INPUT_PULLUP);
  pinMode(pin_EXIT, INPUT_PULLUP);
  pinMode(pin_UP, INPUT_PULLUP);
  pinMode(pin_DOWN, INPUT_PULLUP);

}

void loop() {
//Условие разрешающее считывание кнопки, через пол секунды после того как она была нажата
  if (millis() - saveMillis > 500) {  flag_button = 1;}

  if(flag_button == 1 && page > 0){   //Опрос кнопки DOWN
    if(digitalRead(pin_DOWN) == LOW){  
      page++; if(page > 3){ page = 1;}
      flag = 1; flag_button = 0; saveMillis = millis();
    }

    if(digitalRead(pin_UP) == LOW){   //Опрос кнопки UP
      page--; if(page < 1){ page = 3;}
      flag = 1; flag_button = 0; saveMillis = millis();
    }
  } 

  if(flag_button == 1 && page > 0){   //Опрос кнопки EXIT
    if(digitalRead(pin_EXIT) == LOW){
      page = 0;
      num_pass = 0;
      pass_number_0 = 0;
      pass_number_1 = 0;
      pass_number_2 = 0;
      pass_number_3 = 0;
      flag = 1; flag_button = 0; saveMillis = millis();
    }
  }

  if(page == 0){  //Вывод на дисплей 0 страницы меню (Страница для ввода пароля)

    if(flag_button == 1 && page == 0){ //Опрос кнопки OK
      if(digitalRead(pin_OK) == LOW){
        num_pass++; if(num_pass > 3 && pass_number_0 == pass_0  && pass_number_1 == pass_1 && pass_number_2 == pass_2 && pass_number_3 == pass_3){
          page = 1;
          goto_ = 1;
        }

        if(num_pass > 3 && (pass_number_0 != pass_0 || pass_number_1 != pass_1 || pass_number_2 != pass_2 || pass_number_3 != pass_3)){
          pass_number_0 = 0;
          pass_number_1 = 0;
          pass_number_2 = 0;
          pass_number_3 = 0;
          num_pass = 0;
        }

        flag = 1; flag_button = 0; saveMillis = millis();
      }
    }
    //------------------------------------------ 0 --------------------------------------------
    if(flag_button == 1 && num_pass == 0){ //Опрос кнопки UP
      if(digitalRead(pin_UP) == LOW){
        pass_number_0++; if(pass_number_0 > 9){ pass_number_0 = 0;}
        flag = 1; flag_button = 0; saveMillis = millis();
      }
    }

    if(flag_button == 1 && num_pass == 0){ //Опрос кнопки DOWN
      if(digitalRead(pin_DOWN) == LOW){
        pass_number_0--; if(pass_number_0 < 0){ pass_number_0 = 9;}
        flag = 1; flag_button = 0; saveMillis = millis();
      }
    }
    //------------------------------------------ 1 ---------------------------------------------
    if(flag_button == 1 && num_pass == 1){ //Опрос кнопки UP
      if(digitalRead(pin_UP) == LOW){
        pass_number_1++; if(pass_number_1 > 9){ pass_number_1 = 0;}
        flag = 1; flag_button = 0; saveMillis = millis();
      }
    }

    if(flag_button == 1 && num_pass == 1){ //Опрос кнопки DOWN
      if(digitalRead(pin_DOWN) == LOW){
        pass_number_1--; if(pass_number_1 < 0){ pass_number_1 = 9;}
        flag = 1; flag_button = 0; saveMillis = millis();
      }
    }
    //----------------------------------------- 2 ----------------------------------------------
    if(flag_button == 1 && num_pass == 2){ //Опрос кнопки UP
      if(digitalRead(pin_UP) == LOW){
        pass_number_2++; if(pass_number_2 > 9){ pass_number_2 = 0;}
        flag = 1; flag_button = 0; saveMillis = millis();
      }
    }

    if(flag_button == 1 && num_pass == 2){ //Опрос кнопки DOWN
      if(digitalRead(pin_DOWN) == LOW){
        pass_number_2--; if(pass_number_2 < 0){ pass_number_2 = 9;}
        flag = 1; flag_button = 0; saveMillis = millis();
      }
    }
    //----------------------------------------- 3 ----------------------------------------------
    if(flag_button == 1 && num_pass == 3){ //Опрос кнопки UP
      if(digitalRead(pin_UP) == LOW){
        pass_number_3++; if(pass_number_3 > 9){ pass_number_3 = 0;}
        flag = 1; flag_button = 0; saveMillis = millis();
      }
    }

    if(flag_button == 1 && num_pass == 3){ //Опрос кнопки DOWN
      if(digitalRead(pin_DOWN) == LOW){
        pass_number_3--; if(pass_number_3 < 0){ pass_number_3 = 9;}
        flag = 1; flag_button = 0; saveMillis = millis();
      }
    }
    //---------------------------------------------------------------------------------------
    if(flag == 1){
      flag = 0;

      if(num_pass == 0){  //Блок выбора 1 значения пароля
        TFTscreen.background(0,0,0);
        TFTscreen.text("PASS:", 10, 55);
        PRINT( pass_number_0,  80, 55, 2, 12);
        PRINT( pass_number_1, 100, 55, 2, 12);
        PRINT( pass_number_2, 120, 55, 2, 12);
        PRINT( pass_number_3, 140, 55, 2, 12);

        TFTscreen.rect(76, 51, 18, 22);

      }

      if(num_pass == 1){  //Блок выбора 2 значения пароля
        TFTscreen.background(0,0,0);
        TFTscreen.text("PASS:", 10, 55);
        PRINT( pass_number_0,  80, 55, 2, 12);
        PRINT( pass_number_1, 100, 55, 2, 12);
        PRINT( pass_number_2, 120, 55, 2, 12);
        PRINT( pass_number_3, 140, 55, 2, 12);

        TFTscreen.rect(96, 51, 18, 22);

      }

      if(num_pass == 2){  //Блок выбора 3 значения пароля
        TFTscreen.background(0,0,0);
        TFTscreen.text("PASS:", 10, 55);
        PRINT( pass_number_0,  80, 55, 2, 12);
        PRINT( pass_number_1, 100, 55, 2, 12);
        PRINT( pass_number_2, 120, 55, 2, 12);
        PRINT( pass_number_3, 140, 55, 2, 12);

        TFTscreen.rect(116, 51, 18, 22);

      }

      if(num_pass == 3){  //Блок выбора 4 значения пароля
        TFTscreen.background(0,0,0);
        TFTscreen.text("PASS:", 10, 55);
        PRINT( pass_number_0,  80, 55, 2, 12);
        PRINT( pass_number_1, 100, 55, 2, 12);
        PRINT( pass_number_2, 120, 55, 2, 12);
        PRINT( pass_number_3, 140, 55, 2, 12);

        TFTscreen.rect(136, 51, 18, 22);

      }

    }
  }
  if(goto_ == 1){ goto_ = 0; flag = 1;}//Аналог функции goto (когда goto не работает)

  if(page == 1){  //Вывод на дисплей 1 страницы меню
    if(flag == 1){
      flag = 0;
      TFTscreen.background(0,0,0);
      TFTscreen.text("PAGE 1", 10, 55);
    }
  }

  if(page == 2){  //Вывод на дисплей 2 страницы меню
    if(flag == 1){
      flag = 0;
      TFTscreen.background(0,0,0);
      TFTscreen.text("PAGE 2", 10, 55);
    }
  }

  if(page == 3){  //Вывод на дисплей 3 страницы меню
    if(flag == 1){
      flag = 0;
      TFTscreen.background(0,0,0);
      TFTscreen.text("PAGE 3", 10, 55);
    }
  }
}//void loop

//Функция для вывода чисел на TFT дисплей (для симулятора UnoArduSim)
void PRINT( long text, int x, int y, int srift, int xStep){

  TFTscreen.setTextSize(srift);
  int xNext = x;
  String textStrin(text);

  if (text){

    int last = textStrin.length();

    while (s < 1) {
      while (z < last) {
        incomingString = textStrin;
        tempString = incomingString.substring(z, z2);
        val = tempString.toInt();

        if (val == 0) { TFTscreen.text("0", xNext, y);}
        if (val == 1) { TFTscreen.text("1", xNext, y);}
        if (val == 2) { TFTscreen.text("2", xNext, y);}
        if (val == 3) { TFTscreen.text("3", xNext, y);}
        if (val == 4) { TFTscreen.text("4", xNext, y);}
        if (val == 5) { TFTscreen.text("5", xNext, y);}
        if (val == 6) { TFTscreen.text("6", xNext, y);}
        if (val == 7) { TFTscreen.text("7", xNext, y);}
        if (val == 8) { TFTscreen.text("8", xNext, y);}
        if (val == 9) { TFTscreen.text("9", xNext, y);}

        xNext += xStep; z++; z2++;
        if (z == last) {
          xNext = x;
          z = 0; z2 = 1;
          return;
        }
      }
    }
  } else {
    TFTscreen.text("0", xNext, y);
  }
}

//Конец скетча




Схема подключения кнопок и SPI TFT дисплея 1.8 160х128 пикселей, к Arduino Mega 2560.

Схема подключения кнопок и SPI TFT дисплея 1.8 160х128 пикселей, к Arduino Mega 2560



Подробное видео “Лучший симулятор Arduino UnoArduSim V2.9.1 Одиннадцатая серия. Вход в меню по паролю.”


Лучший симулятор Arduino UnoArduSim V2.9.1 Одиннадцатая серия. Вход в меню по паролю.