RTOS

  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}