1// Libraries
2#include <Arduino_FreeRTOS.h>
3#include <ItemSubMenu.h>
4#include <ItemToggle.h>
5#include <LcdMenu.h>
6#include <MenuScreen.h>
7#include <display/LiquidCrystal_I2CAdapter.h>
8#include <input/KeyboardAdapter.h>
9#include <renderer/CharacterDisplayRenderer.h>
10
11// 2x20 LCD Display
12#define LCD_ROWS 4
13#define LCD_COLS 20
14
15float temperature1;
16float temperature2;
17float temperature3;
18
19bool relay1State, relay2State, relay3State;
20
21// Relay 1 Toggle
22void toggleRelay1(bool isOn) {
23 printLog(F("relay1State"));
24}
25
26// Relay 2 Toggle
27void toggleRelay2(bool isOn) {
28 printLog(F("relay2State"));
29}
30
31// Relay 3 Toggle
32void toggleRelay3(bool isOn) {
33 printLog(F("relay3State"));
34}
35
36LiquidCrystal_I2C lcd(0x27, LCD_COLS, LCD_ROWS);
37LiquidCrystal_I2CAdapter lcdAdapter(&lcd);
38CharacterDisplayRenderer renderer(&lcdAdapter, LCD_COLS, LCD_ROWS);
39LcdMenu menu(renderer);
40KeyboardAdapter keyboard(&menu, &Serial);
41
42extern MenuScreen* relayScreen;
43extern MenuScreen* tempScreen;
44
45// clang-format off
46MENU_SCREEN(mainScreen, mainItems,
47 ITEM_BASIC("Relay Test"),
48 ITEM_SUBMENU("Temp. Observing", tempScreen),
49 ITEM_BASIC("Hello World"),
50 ITEM_BASIC("I'm World"));
51// clang-format on
52
53// Sub Menu 1: Relays
54// clang-format off
55MENU_SCREEN(relayScreen, relayItems,
56 ITEM_TOGGLE("Relay 1", toggleRelay1),
57 ITEM_TOGGLE("Relay 2", toggleRelay2),
58 ITEM_TOGGLE("Relay 3", toggleRelay3));
59// clang-format on
60
61// Sub Menu 2: Temperature Values
62// clang-format off
63MENU_SCREEN(tempScreen, tempItems,
64 ITEM_BASIC(""),
65 ITEM_BASIC(""),
66 ITEM_BASIC(""));
67// clang-format on
68
69// RTOS func. to measure temperature value
70static void tempMeas(void* pvParameters) {
71 (void)pvParameters;
72 for (;;) {
73 //-------------------BEGIN: TEST WITH RANDOM------------------//
74 temperature1 = random(1, 1000) / 100.0; // Generate random float
75 temperature2 = random(1, 2000) / 100.0; // Generate random float
76 temperature3 = random(1, 3000) / 100.0; // Generate random float
77 //-------------------END: TEST WITH RANDOM--------------------//
78
79 char buffer1[8];
80 tempItems[0]->setText(dtostrf(temperature1, 5, 2, buffer1));
81
82 char buffer2[8];
83 tempItems[1]->setText(dtostrf(temperature2, 5, 2, buffer2));
84
85 char buffer3[8];
86 tempItems[2]->setText(dtostrf(temperature3, 5, 2, buffer3));
87
88 if (menu.getScreen() == tempScreen) {
89 menu.refresh();
90 }
91 vTaskDelay(5000 / portTICK_PERIOD_MS); // wait for five seconds
92 }
93}
94
95// RTOS func to read serial input from keyboard
96static void keyPad(void* pvParameters) {
97 (void)pvParameters; // Unused parameter
98
99 for (;;) {
100 keyboard.observe();
101 vTaskDelay(1);
102 }
103}
104
105void setup() {
106 Serial.begin(9600);
107 // LCD activation
108 renderer.begin();
109 menu.setScreen(mainScreen);
110 // Run RTOS func.
111 xTaskCreate(keyPad, "keyPad", 128, NULL, tskIDLE_PRIORITY + 2, NULL);
112 xTaskCreate(tempMeas, "tempMeas", 128, NULL, tskIDLE_PRIORITY + 1, NULL);
113 // Setup random seed
114 pinMode(A0, INPUT);
115 randomSeed(analogRead(A0));
116}
117
118void loop() {
119 renderer.updateTimer();
120}