Click to order
Total: 
Как к Вам обращаться?
Ваш Email
Телефон для связи
Текст задания:
Написать программу "Мигание светодиодом". Программа должна осуществлять переключение светодиодом - светодиод включен 1 секунду/светодиод выключен 1 секунду. Также необходимо поэкспериментировать с функцией задержки, выяснить минимальное время переключения, видимое человеческим глазом. Дополнительно: выполнить переключение светодиода со случайной задержкой.

Понадобится:



Решение:

Можно ли быстрей?


#include 
#define _LCD_TYPE 2
#include 
#include 

void count_pulse(); // Для счета имупульсо от монетоприемника CH-926
int detectButton(); //Детектирует нажатую кнопку на LCD Keypad Shield
void display_print(); 

LCD_1602_RUS lcd(8, 9, 4, 5, 6, 7); //Для LCD Keypad Shield

#define BTN_RIGHT  11
#define BTN_LEFT   12
#define BTN_UP     13 //Для увеличения суммы руками, если монета не пройдет 
#define BTN_DOWN   14 //Для вычитания суммы руками, если что-то взяли из копилки
#define BTN_SELECT 15 //Кнопка сброса суммы, если копилка разорена
#define BTN_NONE   16

#define MONEY_PIN 3 //Номер пина, подключенного к монетоприемнику CH-926
#define TIME_ALL_PULSE 500// макс. время приема монеты

int pulse = 0; //Количество импульсов, полученных от монетоприемника

unsigned long timeCount = 0; //Для сохранения времени импульса

unsigned long btn_Up_Timer = 0;
unsigned long btn_Down_Timer = 0;

unsigned long btn_select_press = 0; 

unsigned long display_timer = 0;
bool display_flag = 0; 

int nominals[4] = {1, 2, 5, 10}; // Массив хранит номиналы наших монет
unsigned long sum; // Сумма всех денег в копилке

int keyAnalog = analogRead(A0); //Для определения какая кнопка была нажата Для LCD Keypad Shield

void setup()
{
  EEPROM.get(0,sum);
  lcd.begin(16, 2);
  display_print();

  pinMode(MONEY_PIN, INPUT_PULLUP);
  attachInterrupt(1, count_pulse, FALLING);
  pulse = 0;
}

void loop()
{
  int button = detectButton();

  switch (button) {
    case BTN_UP:
      if (millis() - btn_Up_Timer > 50) {     //Антидребезг кнопки
        sum ++;
        EEPROM.put(0,sum);
        display_flag = true;
      }
      btn_Up_Timer = millis();
      break;

    case BTN_DOWN:
      if (millis() - btn_Down_Timer > 50) {  //Антидребезг кнопки
        sum --;
        EEPROM.put(0,sum);
        display_flag = true;
      }
      btn_Down_Timer = millis();
      break;

    case BTN_SELECT:
      if (btn_select_press > 29999) { //Проверка на удержание
        sum = 0;
        EEPROM.put(0,sum);
        lcd.clear();
        display_print();
        btn_select_press = 0;
        display_flag = true;
      }
      btn_select_press++;
      break;
    default:
      btn_select_press = 0;
      break;
  }

  if (display_flag) { //Обновляем Дисплей
    display_print();
    display_flag = false;
  }  

   
  // Если прошло максимальное время для приема монеты
  if (pulse > 0 && millis() - timeCount > TIME_ALL_PULSE)
  {
    sum += nominals[pulse - 1];
    EEPROM.put(0,sum);
    pulse = 0;
    display_flag = true;
  }
}

//Обработка прерывания монетоприемника. Получаем количество импульсов
void count_pulse()
{
  detachInterrupt(1);
  delay(10);
  if (!digitalRead(MONEY_PIN))
  {
    pulse++;
    if (pulse == 1)
      timeCount = millis();
  }
  attachInterrupt(1,count_pulse,FALLING);
}

int detectButton() {
  int keyAnalog =  analogRead(A0);
  if (keyAnalog < 100) {
    // Значение меньше 100 – нажата кнопка right
    return BTN_RIGHT;
  } else if (keyAnalog < 200) {
    // Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP
    return BTN_UP;
  } else if (keyAnalog < 400) {
    // Значение больше 200, но меньше 400 – нажата кнопка DOWN
    return BTN_DOWN;
  } else if (keyAnalog < 600) {
    // Значение больше 400, но меньше 600 – нажата кнопка LEFT
    return BTN_LEFT;
  } else if (keyAnalog < 800) {
    // Значение больше 600, но меньше 800 – нажата кнопка SELECT
    return BTN_SELECT;
  } else {
    // Все остальные значения (до 1023) будут означать, что нажатий не было
    return BTN_NONE;
  }
}
void display_print() {
  lcd.setCursor(0, 0);
  lcd.print("На шаурму");

  lcd.setCursor(5, 1);
  lcd.print(String(sum)+" руб.");
  pulse = 0;
}