Guest User

Untitled

a guest
Jan 27th, 2013
464
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.70 KB | None | 0 0
  1. //либы
  2. #include <Bounce.h>
  3. #include <MsTimer2.h>
  4. #include <LiquidCrystal.h>
  5. //кнопки (входы)
  6. #define ENABLE_B A5   // кнопка включить выключить двигатель
  7. #define DIRECTION_B A4 // кнопка реверс
  8. #define UP_SPEED_B A3 // + скорость
  9. #define DOWN_SPEED_B A2 // -скорость
  10. //выходы (идут на входы L297)
  11. #define HALF_FULL_B A1 // шаг/полушаг
  12. #define ENABLE_P 6 //пин включения
  13. #define CLOCK_P 13 //клок пин
  14. #define DIRECTION_P 0 //пин направление
  15. #define HALF_FULL_P 1 //шаг полушаг
  16.  
  17. // начальные данные
  18. int enable_var = LOW; // двигатель отключен
  19. int direction_var = LOW; // по часовой
  20. int speed = 10; // скорость
  21. int half_full_var = HIGH; // полушаговый режим
  22.  
  23. //инициализация объектов для дебоунсера
  24. Bounce bouncer = Bounce( ENABLE_B, 5 );
  25. Bounce bouncer1 = Bounce( DIRECTION_B, 5 );
  26. Bounce bouncer2 = Bounce( UP_SPEED_B, 5 );
  27. Bounce bouncer3 = Bounce( DOWN_SPEED_B, 5 );
  28. Bounce bouncer4 = Bounce( HALF_FULL_B, 5 );
  29.  
  30. LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //инициализация дисплея
  31. //переменные для хранения символов
  32. byte symb_L[8] = {     //символ Л
  33.   0x7, 0x9, 0x9, 0x9, 0x9, 0x9, 0x11, 0x0};
  34. byte symb_P[8] = {     //символ П
  35.   0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0};
  36. byte symb_U[8] = {     //символ У
  37.   0x11, 0x11, 0x11, 0xF, 0x1, 0x1, 0xE, 0x0};
  38. byte symb_m[8] = {     //символ м
  39.   0x0, 0x0, 0x11, 0x1B, 0x15, 0x11, 0x11, 0x0};
  40. byte symb_b[8] = {     //символ б
  41.   0x1, 0xE, 0x10, 0x1E, 0x11, 0x11, 0xE, 0x0};
  42. byte symb_i[8] = {     //символ и
  43.   0x0, 0x0, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0};
  44. byte symb_n[8] = {    //символ н
  45.   0x0, 0x0, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x0};
  46.  
  47. void setup() {
  48.   // объявление кнопок входами для МК
  49.   pinMode(ENABLE_B, INPUT);
  50.   pinMode(DIRECTION_B, INPUT);
  51.   pinMode(UP_SPEED_B, INPUT);
  52.   pinMode(DOWN_SPEED_B, INPUT);
  53.   pinMode(HALF_FULL_B, INPUT);
  54.  
  55.   // объявление пинов выходами
  56.   pinMode(CLOCK_P, OUTPUT);
  57.   pinMode(ENABLE_P, OUTPUT);
  58.   pinMode(DIRECTION_P, OUTPUT);
  59.   pinMode(HALF_FULL_P,OUTPUT);
  60.  
  61.   // ввывод начальных данных
  62.   digitalWrite(ENABLE_P, enable_var);
  63.   digitalWrite(CLOCK_P, HIGH);
  64.   digitalWrite(DIRECTION_P, direction_var);
  65.   digitalWrite(HALF_FULL_P, half_full_var);
  66.  
  67. //  Serial.begin(9600); // для отладки
  68.  
  69.   //  MsTimer2::set(speed, flash); // объявление таймера
  70.   // MsTimer2::start(); // запуска таймера
  71.  
  72.   lcd.begin(16, 2); //объявление размера дисплея
  73.   //создание новых символов
  74.   lcd.createChar(1, symb_L);
  75.   lcd.createChar(2, symb_P);
  76.   lcd.createChar(3, symb_U);
  77.   lcd.createChar(4, symb_m);
  78.   lcd.createChar(5, symb_b);
  79.   lcd.createChar(6, symb_i);
  80.   lcd.createChar(7, symb_n);
  81.   upd_lcd();  //обновить дисплей
  82. }
  83.  
  84. void loop() {
  85.   // чтение кнопок
  86.   // чтение кнопки ENABLE
  87.   if ( bouncer.update() ) {  
  88.     if ( bouncer.read() == HIGH) {
  89.       enable_var = !enable_var;
  90.       digitalWrite(ENABLE_P, enable_var);
  91.       update_speed(); //обновить таймер скорости
  92.       upd_lcd();  //обновить дисплей
  93.     }
  94.   }
  95.   // чтение кнопки DIRECTION
  96.   if ( bouncer1.update() ) {
  97.     if ( bouncer1.read() == HIGH) {
  98.       direction_var = !direction_var;
  99.       digitalWrite(DIRECTION_P, direction_var);
  100.       upd_lcd(); //обновить дисплей
  101.     }
  102.   }
  103.   // Чтение кнопки +
  104.   if ( bouncer2.update() ) {
  105.     if ( bouncer2.read() == HIGH) {
  106.       speed = speed + 1;
  107.       update_speed(); //обновить таймер скорости
  108.       upd_lcd();  //обновить дисплей
  109.     }
  110.   }
  111.   // чтение кнопки -
  112.   if ( bouncer3.update() ) {
  113.     if ( bouncer3.read() == HIGH) {
  114.       speed = speed - 1;
  115.       update_speed(); //обновить таймер скорости
  116.       upd_lcd();  //обновить дисплей
  117.     }
  118.   }
  119.   // чтение кнопки HALF_FULL
  120.   if ( bouncer4.update() ) {
  121.     if ( bouncer4.read() == HIGH) {
  122.       half_full_var = !half_full_var;
  123.       digitalWrite(HALF_FULL_P, half_full_var);
  124.       upd_lcd(); //обновить дисплей
  125.     }
  126.   }
  127. }
  128.  
  129. void flash() // импульс шага
  130. {
  131.   digitalWrite(CLOCK_P, LOW);
  132.   delayMicroseconds(1);
  133.   digitalWrite(CLOCK_P, HIGH);
  134.   //  Serial.println(speed); //вывод скорости в порт
  135. }
  136. void update_speed()//обновление таймера скорости
  137. {
  138.   speed = constrain(speed, 4, 50); //удержание в пределах 4-200
  139.   if (enable_var == 1) //если ВКЛ то обновляем таймер
  140.   {
  141.     MsTimer2::stop(); //остановка таймера
  142.     MsTimer2::set(speed, flash); //установка нового промежутка
  143.     MsTimer2::start();  //запуск таймера
  144.   }
  145.   else MsTimer2::stop();
  146. }
  147. void print_VKL() //вывод надписи ВКЛ
  148. {  
  149.   lcd.print("BK");
  150.   lcd.write(1);
  151.   lcd.print("  ");
  152. }
  153. void print_OTKL()  //вывод написи ОТКЛ
  154. {  
  155.   lcd.print("OTK");
  156.   lcd.write(1);
  157.   lcd.print(" ");
  158. }
  159. void print_ms()  //вывод частоты
  160. {
  161.   if ((speed / 10) < 1) lcd.print(" "); // если число не 2х значное вывести пробел
  162.   lcd.print(speed); //вывести частоту
  163.   lcd.write(4);
  164.   lcd.print("c ");
  165.   if (speed == 4) lcd.print("!"); // если максимальная скорость вывести !
  166.   else lcd.print(" ");
  167. }
  168. void print_POLU() //вывод ПОЛУ
  169. {
  170.   lcd.write(2);
  171.   lcd.print("O");
  172.   lcd.write(1);
  173.   lcd.write(3);
  174. }
  175. void print_POLN() //вывод ПОЛН
  176. {
  177.   lcd.write(2);
  178.   lcd.print("O");
  179.   lcd.write(1);
  180.   lcd.write("H");
  181. }
  182. void print_dir_cw()  //вывод >>
  183. {
  184.   lcd.print(">>");
  185. }
  186. void print_dir_ccw() //вывод <<
  187. {
  188.   lcd.print("<<");
  189. }
  190. void print_obmin() //вывод скорости об/мин
  191. {
  192.   float pspeed = 0; //переменная для хранение об/мин
  193.   byte kf = 0;  //кф шага/полушага
  194.   if ( half_full_var == 0) kf = 2;
  195.   else kf = 1;
  196.   lcd.setCursor(0, 1); //установка курсора на 2ю строку
  197.   pspeed = (kf * 150) / (float)speed;  //высчитываем скорость
  198.   if ((pspeed / 10) < 1) lcd.print(" "); //если число не 2х значное выводим пробел
  199.   lcd.print(pspeed); //выводим скорость
  200.   lcd.print(" ");
  201.   lcd.print("o");
  202.   lcd.write(5);
  203.   lcd.print("/");
  204.   lcd.write(4);
  205.   lcd.write(6);
  206.   lcd.write(7);
  207.   lcd.print(" ");  
  208. }
  209. void upd_lcd()  //функция обновления дисплея
  210. {
  211.   lcd.setCursor(0,0); //установка курсора в начало дисплея
  212.   if (enable_var == 1)  print_VKL(); //если двигатель включен вывзываем функцию вывода ВКЛ
  213.   else print_OTKL();   // иначе выводим ВЫКЛ
  214.   if ( half_full_var == 1) print_POLU(); // если включен режим полушага вызываем функцию вывода ПОЛУ
  215.   else print_POLN(); //иначе выводим ПОЛН
  216.   lcd.print(" ");
  217.   print_ms(); // вызываем вывод частоты
  218.   print_obmin(); //вызываем вывод об/мин
  219.   if ( direction_var == 0) print_dir_cw(); // отображаем направление
  220.   else print_dir_ccw();
  221. }
Advertisement
Add Comment
Please, Sign In to add comment