/*Saludos, estoy ensayando la ejecución multitarea con la libreria Protothreads, estoy realizando tres tareas.
- Leer la señal analogica de un fotoresistor y verka el monitor de puerto serial.
- Leer un pulsador y apagar el LED del puerto de salida 13 cuando lo presiono.
- Encender tres LEDs conectados a pines de salida de forma intermitente.
Mi problema es que cuando ejecuto la tarea 1 y 3 todo funciona bien, pero cuando ejecuto con la tarea 3, solo funciona ella, la 1 y 3 deja de funcionar. Les pregunto. Que puede estar pasando? Es un problema de la libreria? o estoy manejando interrupciones de programa sin saber?. Gracias! */
/*Este ejercicio tiene como objetivo realizar tres tareas en Arduino, Tarea 1 es leer la señal analogica de un fotoresistor |
Tarea 2 leer la pulsacion de un switch y apagar el LED de placa de Arduino | Tarea 3 activar tres LED que hagan parpadeo */
#include <pt.h> //suma la biblioteca Protothreads
struct pt hilo1; //indica que un proceso llamado hilo1 se procese de forma paralela
struct pt hilo2; //indica que un proceso llamado hilo4 se procese de forma paralela
struct pt hilo3; //indica que un proceso llamado hilo4 se procese de forma paralela
long value;
void setup()
{
PT_INIT(&hilo1); //PT_INIT es un macro para inicializar hilo1, al compilar el preprocesador arduino, toma los codigos necesarios de la biblioteca pt.h
//& es un puntero que indica el lugar donde esta guardado el valor de la estructura hilo1
PT_INIT(&hilo2);
PT_INIT(&hilo3);
Serial.begin(9600); // setup serial
}
void loop() {
tarea1(&hilo1);
tarea2(&hilo2);
tarea3(&hilo3);
}
//Tarea 1
void tarea1(struct pt *pt) {
PT_BEGIN(pt); //inicio
static long t = 0;
do {
t = millis();
PT_WAIT_WHILE(pt, (millis() - t) < 250); //Protothreads espera mientras la condicion no sea cierta
ADMUX |= B11000000; //canal ADC0
ADCSRA |= B11000111;
while (bit_is_set(ADCSRA, ADSC));
value = ADCL | (ADCH << 8);
Serial.println(value);
//delay(1000); //es un funcion que en esta multitarea no se debe usar porque pone en pausa todo el procesador mientras espera el conteo, entonces se
//reemplaza por otra estructura como por ejemplo un acumulador de tiempo
} while (true);
PT_END(pt); //fin de ejecucion
}
//Tarea 2
void tarea2(struct pt *pt) {
PT_BEGIN(pt); //inicio
pinMode(8,INPUT);
pinMode(13, OUTPUT);
do{
digitalWrite(13, digitalRead(8));
} while (true);
PT_END(pt); //fin de ejecucion
}
//Tearea 3
void tarea3(struct pt *pt) {
PT_BEGIN(pt); //inicio
static long z = 0;
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
do {
z = millis();
PT_WAIT_WHILE(pt, (millis() - z) < 900); //el tiempo de este primer wait debe ser inferior al segundo, esto porque si no hay conflicto con los LED
digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
PT_WAIT_WHILE(pt, (millis() - z) < 1000);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
} while (true);
PT_END(pt); //fin de ejecucion
}