#include <pthread.h> // permette l'utilizzo dei thread posix
int led_pin_1 = 12; // dichiarazione, 12=pin al quale è collegato il led
int led_pin_2 = 18;
int btn_pin_1 = 4;
bool btn_reset = false;
pthread_t t1_led, t2_led; // dichiarazione variabili che contengono i thread
// i thread contengono la stack, ID e registri del processore
// problema thread posix = può avere in input una sola variabile
// abbiamo fatto la struttura per poter passare più variabili al thread
typedef struct {
int pin;
int time;
} led_t;
// funzione che deve essere chiamata dal thread posix e deve chiamarsi esattamente cosi
void * blink(void* p) {
led_t* myled = (led_t*)p; // (led_t*) = casting
int pin = myled->pin; // la freccetta perchè myled è un puntatore della struct
int time = myled->time;
while (!btn_reset) {
digitalWrite(pin,!digitalRead(pin));
delay(time); // this speeds up the simulation
}
digitalWrite(pin, LOW);
return NULL;
}
// funzione di sistema che viene chiamata all'inizio
void setup() {
led_t led1;
led1.pin = led_pin_1;
led1.time = 1000;
pinMode(led1.pin,OUTPUT);
// creazione thread(variabile, opzioni varie, funzione da chiamare, passiamo una variabile come parametro alla funzione)
if (pthread_create(&t1_led,NULL,blink,(void*)&led1)) {
Serial.println("ERRORE CREAZIONE THREAD!!");
}
led_t led2;
led2.pin = led_pin_2;
led2.time = 2000;
pinMode(led2.pin,OUTPUT); // setta il pin del led ad OUTPUT (il led è OUTPUT)
if (pthread_create(&t2_led,NULL,blink,(void*)&led2)) {
Serial.println("ERRORE CREAZIONE THREAD!!");
}
pinMode(btn_pin_1,INPUT);
Serial.begin(115200);
Serial.println("Hello, ESP32!");
}
// funzione che viene chiamata in continuazione
void loop() {
delay(100); // this speeds up the simulation
if(digitalRead(btn_pin_1) == HIGH) {
Serial.print("Button state : ");
Serial.println(digitalRead(btn_pin_1));
btn_reset = true;
}
}