Меню для дисплея LCD 1602 на базе Arduino Nano. Контроль и управление нагрузками.

Здравствуйте! Один из подписчиков попросил сделать пример меню, для Arduino, которое должно отображаться, на 2 рядном 16 символьном I2C LCD дисплее.

Чтобы при помощи кнопок, можно было перемещаться по меню, управлять например светодиодами и какой-то простенькой программой.

Menu I2C LCD 1602 for Arduino Nano

Основой проекта является плата Arduino Nano, и I2C LCD дисплей, также использую 4 кнопки, 5 маломощных светодиодов, 5 сопротивлений на 500 ом, макетную плату, и соединительные провода.

Menu I2C LCD 1602 for Arduino Nano

Загрузите этот скетч на плату.


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


  1. #include "LiquidCrystal_I2C.h"
  2. LiquidCrystal_I2C lcd(0x3f,16,2);
  3. const int button_OK = 14; //A0
  4. const int button_EXIT = 15; //A1
  5. const int button_UP = 16; //A2
  6. const int button_DOWN = 17; //A3
  7. int buttonState_OK = 0;
  8. int buttonState_EXIT = 0;
  9. int buttonState_UP = 0;
  10. int buttonState_DOWN = 0;
  11. int i=0, j=0, k=0;
  12. String onoff_0, onoff_1, onoff_2, onoff_3, onoff_4, onoff_x;
  13. const int Led0=0;
  14. const int Led1=1;
  15. const int Led2=2;
  16. const int Led3=3;
  17. const int Led4=4;
  18. int StateLed0=0;
  19. int StateLed1=0;
  20. int StateLed2=0;
  21. int StateLed3=0;
  22. int StateLed4=0;
  23. int ledState4=0;
  24. int StateLed4cycle = 0;
  25. unsigned long previousMillis = 0;
  26. const long interval = 1000;
  27. void setup() {
  28. lcd.init();
  29. lcd.setBacklight(HIGH);
  30. pinMode(button_OK, INPUT_PULLUP);
  31. pinMode(button_EXIT, INPUT_PULLUP);
  32. pinMode(button_UP, INPUT_PULLUP);
  33. pinMode(button_DOWN, INPUT_PULLUP);
  34. pinMode(Led0, OUTPUT); digitalWrite(Led0, LOW);
  35. pinMode(Led1, OUTPUT); digitalWrite(Led1, LOW);
  36. pinMode(Led2, OUTPUT); digitalWrite(Led2, LOW);
  37. pinMode(Led3, OUTPUT); digitalWrite(Led3, LOW);
  38. pinMode(Led4, OUTPUT); digitalWrite(Led4, LOW);
  39. }
  40. void blink4();
  41. void loop(){
  42. StateLed0=digitalRead(Led0);
  43. StateLed1=digitalRead(Led1);
  44. StateLed2=digitalRead(Led2);
  45. StateLed3=digitalRead(Led3);
  46. StateLed4=digitalRead(Led4);
  47. lcd.setCursor(1,0);
  48. lcd.print("Led controller");
  49. lcd.setCursor(1,1);
  50. lcd.print("Prog");
  51. lcd.setCursor(6,1);
  52. lcd.print(StateLed0);
  53. lcd.setCursor(8,1);
  54. lcd.print(StateLed1);
  55. lcd.setCursor(10,1);
  56. lcd.print(StateLed2);
  57. lcd.setCursor(12,1);
  58. lcd.print(StateLed3);
  59. lcd.setCursor(14,1);
  60. lcd.print(StateLed4);
  61. buttonState_OK = digitalRead(button_OK);
  62. if(buttonState_OK == LOW){
  63. delay(300); i=1; lcd.clear();
  64. while(i > 0) {
  65. if(StateLed0==0){ onoff_0 = "OFF";}else{ onoff_0 = "ON";}
  66. if(StateLed1==0){ onoff_1 = "OFF";}else{ onoff_1 = "ON";}
  67. if(StateLed2==0){ onoff_2 = "OFF";}else{ onoff_2 = "ON";}
  68. if(StateLed3==0){ onoff_3 = "OFF";}else{ onoff_3 = "ON";}
  69. if(StateLed4cycle==0){ onoff_4 = "OFF";}else{ onoff_4 = "ON";}
  70. lcd.setCursor(6,0);
  71. lcd.print("Menu:");
  72. lcd.setCursor(0,1);
  73. lcd.print("Program");
  74. lcd.setCursor(9,1);
  75. lcd.print(j);
  76. lcd.setCursor(11,1);
  77. lcd.print(onoff_x);
  78. buttonState_OK = digitalRead(button_OK);
  79. if(buttonState_OK == LOW){ delay(300); k++; if(k>1){ k=0;} lcd.clear();}
  80. buttonState_EXIT = digitalRead(button_EXIT);
  81. if(buttonState_EXIT == LOW){ i=0; lcd.clear();}
  82. buttonState_UP = digitalRead(button_UP);
  83. if(buttonState_UP == LOW){ j--; delay(300); if(j<0){ j=4;} lcd.clear();}
  84. buttonState_DOWN = digitalRead(button_DOWN);
  85. if(buttonState_DOWN == LOW){ j++; delay(300); if(j>4){ j=0;} lcd.clear();}
  86. if(j==0){ onoff_x=onoff_0;
  87. while(k==1) { onoff_x=onoff_0;
  88. lcd.setCursor(6,0);
  89. lcd.print("Edit:");
  90. lcd.setCursor(1,1);
  91. lcd.print("Led Pin");
  92. lcd.setCursor(9,1);
  93. lcd.print(j);
  94. lcd.setCursor(11,1);
  95. lcd.print(onoff_x);
  96. if(StateLed0==0){ onoff_0 = "OFF";}else{ onoff_0 = "ON ";}
  97. buttonState_OK = digitalRead(button_OK);
  98. if(buttonState_OK == LOW){ k=0; delay(300); }
  99. buttonState_EXIT = digitalRead(button_EXIT);
  100. if(buttonState_EXIT == LOW){ k=0; delay(300);}
  101. buttonState_UP = digitalRead(button_UP);
  102. if(buttonState_UP == LOW){ delay(300); StateLed0++; if(StateLed0>1){ StateLed0=0;}}
  103. buttonState_DOWN = digitalRead(button_DOWN);
  104. if(buttonState_DOWN == LOW){ delay(300); StateLed0++; if(StateLed0>1){ StateLed0=0;}}
  105. digitalWrite(Led0, StateLed0);
  106. blink4();
  107. }}
  108. if(j==1){ onoff_x=onoff_1;
  109. while(k==1) { onoff_x=onoff_1;
  110. lcd.setCursor(6,0);
  111. lcd.print("Edit:");
  112. lcd.setCursor(1,1);
  113. lcd.print("Led Pin");
  114. lcd.setCursor(9,1);
  115. lcd.print(j);
  116. lcd.setCursor(11,1);
  117. lcd.print(onoff_x);
  118. if(StateLed1==0){ onoff_1 = "OFF";}else{ onoff_1 = "ON ";}
  119. buttonState_OK = digitalRead(button_OK);
  120. if(buttonState_OK == LOW){ k=0; delay(300); }
  121. buttonState_EXIT = digitalRead(button_EXIT);
  122. if(buttonState_EXIT == LOW){ k=0; delay(300);}
  123. buttonState_UP = digitalRead(button_UP);
  124. if(buttonState_UP == LOW){ delay(300); StateLed1++; if(StateLed1>1){ StateLed1=0;}}
  125. buttonState_DOWN = digitalRead(button_DOWN);
  126. if(buttonState_DOWN == LOW){ delay(300); StateLed1++; if(StateLed1>1){ StateLed1=0;}}
  127. digitalWrite(Led1, StateLed1);
  128. blink4();
  129. }}
  130. if(j==2){ onoff_x=onoff_2;
  131. while(k==1) { onoff_x=onoff_2;
  132. lcd.setCursor(6,0);
  133. lcd.print("Edit:");
  134. lcd.setCursor(1,1);
  135. lcd.print("Led Pin");
  136. lcd.setCursor(9,1);
  137. lcd.print(j);
  138. lcd.setCursor(11,1);
  139. lcd.print(onoff_x);
  140. if(StateLed2==0){ onoff_2 = "OFF";}else{ onoff_2 = "ON ";}
  141. buttonState_OK = digitalRead(button_OK);
  142. if(buttonState_OK == LOW){ k=0; delay(300); }
  143. buttonState_EXIT = digitalRead(button_EXIT);
  144. if(buttonState_EXIT == LOW){ k=0; delay(300);}
  145. buttonState_UP = digitalRead(button_UP);
  146. if(buttonState_UP == LOW){ delay(300); StateLed2++; if(StateLed2>1){ StateLed2=0;}}
  147. buttonState_DOWN = digitalRead(button_DOWN);
  148. if(buttonState_DOWN == LOW){ delay(300); StateLed2++; if(StateLed2>1){ StateLed2=0;}}
  149. digitalWrite(Led2, StateLed2);
  150. blink4();
  151. }}
  152. if(j==3){ onoff_x=onoff_3;
  153. while(k==1) { onoff_x=onoff_3;
  154. lcd.setCursor(6,0);
  155. lcd.print("Edit:");
  156. lcd.setCursor(1,1);
  157. lcd.print("Led Pin");
  158. lcd.setCursor(9,1);
  159. lcd.print(j);
  160. lcd.setCursor(11,1);
  161. lcd.print(onoff_x);
  162. if(StateLed3==0){ onoff_3 = "OFF";}else{ onoff_3 = "ON ";}
  163. buttonState_OK = digitalRead(button_OK);
  164. if(buttonState_OK == LOW){ k=0; delay(300); }
  165. buttonState_EXIT = digitalRead(button_EXIT);
  166. if(buttonState_EXIT == LOW){ k=0; delay(300); }
  167. buttonState_UP = digitalRead(button_UP);
  168. if(buttonState_UP == LOW){ delay(300); StateLed3++; if(StateLed3>1){ StateLed3=0;}}
  169. buttonState_DOWN = digitalRead(button_DOWN);
  170. if(buttonState_DOWN == LOW){ delay(300); StateLed3++; if(StateLed3>1){ StateLed3=0;}}
  171. digitalWrite(Led3, StateLed3);
  172. blink4();
  173. }}
  174. if(j==4){ onoff_x=onoff_4;
  175. while(k==1) { onoff_x=onoff_4;
  176. lcd.setCursor(6,0);
  177. lcd.print("Edit:");
  178. lcd.setCursor(0,1);
  179. lcd.print("Blink Pin");
  180. lcd.setCursor(10,1);
  181. lcd.print(j);
  182. lcd.setCursor(12,1);
  183. lcd.print(onoff_x);
  184. if(StateLed4==0){ onoff_4 = "OFF";}else{ onoff_4 = "ON ";}
  185. buttonState_OK = digitalRead(button_OK);
  186. if(buttonState_OK == LOW){ k=0; delay(300); lcd.clear();}
  187. buttonState_EXIT = digitalRead(button_EXIT);
  188. if(buttonState_EXIT == LOW){ k=0; delay(300); lcd.clear();}
  189. buttonState_UP = digitalRead(button_UP);
  190. if(buttonState_UP == LOW){ delay(300); StateLed4++; StateLed4cycle++;
  191. if(StateLed4>1){ StateLed4=0;}if(StateLed4cycle>1){ StateLed4cycle=0;}}
  192. buttonState_DOWN = digitalRead(button_DOWN);
  193. if(buttonState_DOWN == LOW){ delay(300); StateLed4++; StateLed4cycle++;
  194. if(StateLed4>1){ StateLed4=0;}if(StateLed4cycle>1){ StateLed4cycle=0;}}
  195. blink4();
  196. }}
  197. blink4();
  198. }
  199. blink4();
  200. }
  201. blink4();
  202. }
  203. void blink4(){
  204. if (StateLed4cycle == 1){
  205. unsigned long currentMillis = millis();
  206. if (currentMillis - previousMillis >= interval) {
  207. previousMillis = currentMillis;
  208. if (ledState4 == LOW) { ledState4 = HIGH;} else { ledState4 = LOW;}
  209. digitalWrite(Led4, ledState4);
  210. }}else{ digitalWrite(Led4, LOW);}
  211. }

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




И соберите все, как показано на этой схеме.

Схема Menu I2C LCD 1602 for Arduino Nano

Проверяем, подключаем питание, и тестируем меню.

Удачных экспериментов!.

Видео "Меню для дисплея LCD 1602 на базе Arduino Nano. Контроль и управление нагрузками."


Menu I2C LCD 1602 for Arduino Nano