Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //либы
- #include <Bounce.h>
- #include <MsTimer2.h>
- #include <LiquidCrystal.h>
- //кнопки (входы)
- #define ENABLE_B A5 // кнопка включить выключить двигатель
- #define DIRECTION_B A4 // кнопка реверс
- #define UP_SPEED_B A3 // + скорость
- #define DOWN_SPEED_B A2 // -скорость
- //выходы (идут на входы L297)
- #define HALF_FULL_B A1 // шаг/полушаг
- #define ENABLE_P 6 //пин включения
- #define CLOCK_P 13 //клок пин
- #define DIRECTION_P 0 //пин направление
- #define HALF_FULL_P 1 //шаг полушаг
- // начальные данные
- int enable_var = LOW; // двигатель отключен
- int direction_var = LOW; // по часовой
- int speed = 10; // скорость
- int half_full_var = HIGH; // полушаговый режим
- //инициализация объектов для дебоунсера
- Bounce bouncer = Bounce( ENABLE_B, 5 );
- Bounce bouncer1 = Bounce( DIRECTION_B, 5 );
- Bounce bouncer2 = Bounce( UP_SPEED_B, 5 );
- Bounce bouncer3 = Bounce( DOWN_SPEED_B, 5 );
- Bounce bouncer4 = Bounce( HALF_FULL_B, 5 );
- LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //инициализация дисплея
- //переменные для хранения символов
- byte symb_L[8] = { //символ Л
- 0x7, 0x9, 0x9, 0x9, 0x9, 0x9, 0x11, 0x0};
- byte symb_P[8] = { //символ П
- 0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0};
- byte symb_U[8] = { //символ У
- 0x11, 0x11, 0x11, 0xF, 0x1, 0x1, 0xE, 0x0};
- byte symb_m[8] = { //символ м
- 0x0, 0x0, 0x11, 0x1B, 0x15, 0x11, 0x11, 0x0};
- byte symb_b[8] = { //символ б
- 0x1, 0xE, 0x10, 0x1E, 0x11, 0x11, 0xE, 0x0};
- byte symb_i[8] = { //символ и
- 0x0, 0x0, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0};
- byte symb_n[8] = { //символ н
- 0x0, 0x0, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x0};
- void setup() {
- // объявление кнопок входами для МК
- pinMode(ENABLE_B, INPUT);
- pinMode(DIRECTION_B, INPUT);
- pinMode(UP_SPEED_B, INPUT);
- pinMode(DOWN_SPEED_B, INPUT);
- pinMode(HALF_FULL_B, INPUT);
- // объявление пинов выходами
- pinMode(CLOCK_P, OUTPUT);
- pinMode(ENABLE_P, OUTPUT);
- pinMode(DIRECTION_P, OUTPUT);
- pinMode(HALF_FULL_P,OUTPUT);
- // ввывод начальных данных
- digitalWrite(ENABLE_P, enable_var);
- digitalWrite(CLOCK_P, HIGH);
- digitalWrite(DIRECTION_P, direction_var);
- digitalWrite(HALF_FULL_P, half_full_var);
- // Serial.begin(9600); // для отладки
- // MsTimer2::set(speed, flash); // объявление таймера
- // MsTimer2::start(); // запуска таймера
- lcd.begin(16, 2); //объявление размера дисплея
- //создание новых символов
- lcd.createChar(1, symb_L);
- lcd.createChar(2, symb_P);
- lcd.createChar(3, symb_U);
- lcd.createChar(4, symb_m);
- lcd.createChar(5, symb_b);
- lcd.createChar(6, symb_i);
- lcd.createChar(7, symb_n);
- upd_lcd(); //обновить дисплей
- }
- void loop() {
- // чтение кнопок
- // чтение кнопки ENABLE
- if ( bouncer.update() ) {
- if ( bouncer.read() == HIGH) {
- enable_var = !enable_var;
- digitalWrite(ENABLE_P, enable_var);
- update_speed(); //обновить таймер скорости
- upd_lcd(); //обновить дисплей
- }
- }
- // чтение кнопки DIRECTION
- if ( bouncer1.update() ) {
- if ( bouncer1.read() == HIGH) {
- direction_var = !direction_var;
- digitalWrite(DIRECTION_P, direction_var);
- upd_lcd(); //обновить дисплей
- }
- }
- // Чтение кнопки +
- if ( bouncer2.update() ) {
- if ( bouncer2.read() == HIGH) {
- speed = speed + 1;
- update_speed(); //обновить таймер скорости
- upd_lcd(); //обновить дисплей
- }
- }
- // чтение кнопки -
- if ( bouncer3.update() ) {
- if ( bouncer3.read() == HIGH) {
- speed = speed - 1;
- update_speed(); //обновить таймер скорости
- upd_lcd(); //обновить дисплей
- }
- }
- // чтение кнопки HALF_FULL
- if ( bouncer4.update() ) {
- if ( bouncer4.read() == HIGH) {
- half_full_var = !half_full_var;
- digitalWrite(HALF_FULL_P, half_full_var);
- upd_lcd(); //обновить дисплей
- }
- }
- }
- void flash() // импульс шага
- {
- digitalWrite(CLOCK_P, LOW);
- delayMicroseconds(1);
- digitalWrite(CLOCK_P, HIGH);
- // Serial.println(speed); //вывод скорости в порт
- }
- void update_speed()//обновление таймера скорости
- {
- speed = constrain(speed, 4, 50); //удержание в пределах 4-200
- if (enable_var == 1) //если ВКЛ то обновляем таймер
- {
- MsTimer2::stop(); //остановка таймера
- MsTimer2::set(speed, flash); //установка нового промежутка
- MsTimer2::start(); //запуск таймера
- }
- else MsTimer2::stop();
- }
- void print_VKL() //вывод надписи ВКЛ
- {
- lcd.print("BK");
- lcd.write(1);
- lcd.print(" ");
- }
- void print_OTKL() //вывод написи ОТКЛ
- {
- lcd.print("OTK");
- lcd.write(1);
- lcd.print(" ");
- }
- void print_ms() //вывод частоты
- {
- if ((speed / 10) < 1) lcd.print(" "); // если число не 2х значное вывести пробел
- lcd.print(speed); //вывести частоту
- lcd.write(4);
- lcd.print("c ");
- if (speed == 4) lcd.print("!"); // если максимальная скорость вывести !
- else lcd.print(" ");
- }
- void print_POLU() //вывод ПОЛУ
- {
- lcd.write(2);
- lcd.print("O");
- lcd.write(1);
- lcd.write(3);
- }
- void print_POLN() //вывод ПОЛН
- {
- lcd.write(2);
- lcd.print("O");
- lcd.write(1);
- lcd.write("H");
- }
- void print_dir_cw() //вывод >>
- {
- lcd.print(">>");
- }
- void print_dir_ccw() //вывод <<
- {
- lcd.print("<<");
- }
- void print_obmin() //вывод скорости об/мин
- {
- float pspeed = 0; //переменная для хранение об/мин
- byte kf = 0; //кф шага/полушага
- if ( half_full_var == 0) kf = 2;
- else kf = 1;
- lcd.setCursor(0, 1); //установка курсора на 2ю строку
- pspeed = (kf * 150) / (float)speed; //высчитываем скорость
- if ((pspeed / 10) < 1) lcd.print(" "); //если число не 2х значное выводим пробел
- lcd.print(pspeed); //выводим скорость
- lcd.print(" ");
- lcd.print("o");
- lcd.write(5);
- lcd.print("/");
- lcd.write(4);
- lcd.write(6);
- lcd.write(7);
- lcd.print(" ");
- }
- void upd_lcd() //функция обновления дисплея
- {
- lcd.setCursor(0,0); //установка курсора в начало дисплея
- if (enable_var == 1) print_VKL(); //если двигатель включен вывзываем функцию вывода ВКЛ
- else print_OTKL(); // иначе выводим ВЫКЛ
- if ( half_full_var == 1) print_POLU(); // если включен режим полушага вызываем функцию вывода ПОЛУ
- else print_POLN(); //иначе выводим ПОЛН
- lcd.print(" ");
- print_ms(); // вызываем вывод частоты
- print_obmin(); //вызываем вывод об/мин
- if ( direction_var == 0) print_dir_cw(); // отображаем направление
- else print_dir_ccw();
- }
Advertisement
Add Comment
Please, Sign In to add comment