#include <TaskScheduler.h>
#include <Wire.h> // para comunicação I2C com o LCD
#include <LiquidCrystal_I2C.h> // biblioteca para LCD 20x4 I2C
#include <Stepper.h> // biblioteca para motor de passo
// Definições de pinos e constantes
const int ledPin = 12; // pino do LED
const int sensorPin = A0; // pino do sensor de infravermelho
const int stepperPin1 = 2; // pino 1 do motor de passo
const int stepperPin2 = 3; // pino 2 do motor de passo
const int stepperPin3 = 4; // pino 3 do motor de passo
const int stepperPin4 = 5; // pino 4 do motor de passo
const long intervaloLed = 1600; // intervalo de tempo para piscar o LED (1,6 segundos)
const long intervaloSensoreamento = 500; // intervalo de tempo para consultar o sensor (500ms)
const int tempoMotorPasso = 90000; // tempo que o motor de passo deve funcionar (1,5 minutos)
// Instância do LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Instância do motor de passo
Stepper stepper(2048, stepperPin1, stepperPin3, stepperPin2, stepperPin4); // configuração para um motor de passo com 2048 passos por revolução
// Tarefa 1: piscar o LED
void piscarLed() {
static unsigned long anterior = 0;
if (millis() - anterior >= intervaloLed) {
anterior = millis();
digitalWrite(ledPin, !digitalRead(ledPin));
}
}
// Tarefa 2: exibir texto no LCD
void exibirTextoLCD() {
lcd.setCursor(0, 0);
lcd.print("POPULACAO MUNDIAL");
}
// Tarefa 3: consultar sensor e acionar motor de passo se necessário
void consultarSensor() {
static unsigned long anterior = 0;
if (millis() - anterior >= intervaloSensoreamento) {
anterior = millis();
int valorSensor = analogRead(sensorPin);
if (valorSensor > 500) { // ajuste o valor de acordo com a sensibilidade do sensor
stepper.setSpeed(10); // configuração da velocidade do motor de passo
unsigned long inicio = millis();
while (millis() - inicio < tempoMotorPasso) {
stepper.step(1);
}
}
}
}
// Agendamento das tarefas
Scheduler runner;
Task tarefa1(10, TASK_FOREVER, &piscarLed); // agendar a tarefa 1 para ser executada a cada 10ms
Task tarefa2(1000, TASK_FOREVER, &exibirTextoLCD); // agendar a tarefa 2 para ser executada a cada 1s
Task tarefa3(5, TASK_FOREVER, &consultarSensor); // agendar a tarefa 3 para ser executada a cada 5ms
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
lcd.init(); // inicializar o LCD
lcd.backlight(); // ligar o backlight do LCD
runner.addTask(tarefa1);
runner.addTask(tarefa2);
runner.addTask(tarefa3);
}
void loop() {
runner.execute();
}