//Importamos las librerias necesarias
//Estudiante:Melany Fuentes
#include <Servo.h>//controlar el servomotor
#include <Wire.h>//comunicacion I2C
#include <LiquidCrystal_I2C.h>//controlar la pantalla LCD
#include <Arduino_FreeRTOS.h>
#include <task.h>//Para la gestion de tareas
//Intervalo de tiempo en que se ejecutaran las tareas
#define TICK 50
Servo myservo;
LiquidCrystal_I2C lcd(0x27, 16, 2);//usamos la direccion 0x27 que es la predeterminada
const int potm_pin = A0;//pin del potenciometro
const int th_min_Servo = 0;
const int th_max_Servo = 180;
bool blink = false;//se usara para alternar el estado del parpadeo en la pantalla LCD
//definir los patrones de caracteres personalizados para la pantalla lcd
byte character1[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 };
byte character2[8] = { B11111, B10001, B10001, B10001, B10001, B10001, B10001, B11111 };
void servoTask(void *pvParameters) {
while (1) {
int pot_value = analogRead(potm_pin);//le el valor del potenciometro
int theta = map(pot_value, 0, 1023, th_min_Servo, th_max_Servo);
myservo.write(theta);//mueve el servo y lo fija al valor de theta
vTaskDelay(pdMS_TO_TICKS(50));
}
}
//tarea para controlar el parpadeo
void parpadeoTask(void *pvParameters) {
while (1) {
blink = !blink;
vTaskDelay(pdMS_TO_TICKS(500));
}
}
//tarea para actualizar la pantalla LCD
void LCDTask(void *pvParameters) {
while (1) {
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
int length_bar = map(myservo.read(), th_min_Servo, th_max_Servo, 0, 16);
for (int i = 1; i < length_bar; i++) {
lcd.write((uint8_t)0);
}
for (int i = length_bar; i < 16; i++) {
lcd.print(" ");
}
lcd.setCursor(0, 1);
if (blink) {
lcd.write((uint8_t)1);
} else {
lcd.print(' ');
}
vTaskDelay(pdMS_TO_TICKS(50));
}
}
void setup() {
lcd.init();
lcd.backlight();
lcd.createChar(0, character1);
lcd.createChar(1, character2);
myservo.attach(9);
//creacion de tareas
xTaskCreate(servoTask, "ServoTask", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(parpadeoTask, "ParpadeoTask", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
xTaskCreate(LCDTask, "LCDTask", configMINIMAL_STACK_SIZE, NULL, 3, NULL);
vTaskStartScheduler();//inicia el planificador de tareas
}
void loop() {
// Este bucle no se ejecutará, ya que el control se pasa al planificador de tareas
}