#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#define TRIG_PIN 14
#define ECHO_PIN 12
#define ANALOG_PIN 34 // GPIO 34 for analog input
LiquidCrystal_I2C LCD(0x27, 16, 2);
const float nominalResistance = 10000; // 10k Ohm nominal resistance at 25 degrees C
const float nominalTemperature = 25; // nominal temperature value (in Celsius)
const float bCoefficient = 3950; // Beta coefficient of the thermistor (usually 3000-4000)
const int seriesResistor = 10000; // 10k Ohm series resistor
volatile long distance = 0;
volatile float temperatureC = 0;
void measureDistance(void *parameter) {
static long lastStartTime = 0; // Static variable to store the last start time
while (true) {
long startTime = millis();
if (lastStartTime != 0) {
long periodTime = startTime - lastStartTime;
Serial.print("Distance Task Period Time: ");
Serial.println(periodTime);
}
lastStartTime = startTime;
// Measure distance
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
distance = (duration / 2) / 29.1;
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void measureTemperature(void *parameter) {
static long lastStartTime = 0; // Static variable to store the last start time
while (true) {
long startTime = millis();
if (lastStartTime != 0) {
long periodTime = startTime - lastStartTime;
Serial.print("Temperature Task Period Time: ");
Serial.println(periodTime);
}
lastStartTime = startTime;
// Measure temperature
int analogValue = analogRead(ANALOG_PIN);
float resistance = seriesResistor / (4095.0 / analogValue - 1);
float temperatureK = 1.0 / (1.0 / (nominalTemperature + 273.15) + 1.0 / bCoefficient * log(resistance / nominalResistance));
temperatureC = temperatureK - 273.15;
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void updateLCD(void *parameter) {
static long lastStartTime = 0; // Static variable to store the last start time
LCD.init();
LCD.backlight();
while (true) {
long startTime = millis();
if (lastStartTime != 0) {
long periodTime = startTime - lastStartTime;
Serial.print("LCD Task Period Time: ");
Serial.println(periodTime);
}
lastStartTime = startTime;
// Update LCD
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Distance:");
LCD.print(distance);
LCD.print(" cm");
LCD.setCursor(0, 1);
LCD.print("Temp:");
LCD.print(temperatureC);
LCD.print(" C");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
xTaskCreate(measureDistance, "Measure Distance", 10000, NULL, 2, NULL);
xTaskCreate(measureTemperature, "Measure Temperature", 10000, NULL, 1, NULL);
xTaskCreate(updateLCD, "Update LCD", 10000, NULL, 3, NULL);
}
void loop() {
// Nothing to do here
}