Scrittura codice per impianto birra cerco collaboratori Monza/Milano

MrLofraz:
Vedo con piacerere che la discussione si è animata!
Quindi mi state dicendo che se lo stesso sketch lo si prova con caldaie e riscaldatori diversi da quelli utilizzati nei test, il controllo non funziona o quantomeno da dei risultati diversi?

Assolutamente SI, non potrebbe essere diversamente.
Ma non ti preoccupare compà, che qualcosa di buono lo tiriamo fuori.

ho già messo giù un idea di come gestire il relè, sotto con critiche e commenti

#include <avr/interrupt.h>

#define cycleLength 4
#define computeDelay

volatile byte cycleCounter ;
volatile byte pid =0;
byte lastCounter =255;

byte pidValue;
boolean coilStatus;

ISR(TIMER1_COMPA_vect)
{
	cycleCounter++;
	if (cycleCounter == cycleLength )
	{
		cycleCounter = 0;
		pid +=10;
		if(pid==100)
		{
			pid=0;
		}
	}
}


void setup()
{
	Serial.begin(57600);
	SetupInterrupt();
}


void loop()
{
	if (lastCounter != cycleCounter)
	{
		lastCounter = cycleCounter;
		ManageCoil();
		Serial.print("pidValue :");
		Serial.print(pidValue);
		Serial.print(" cycleCounter :");
		Serial.print(cycleCounter);
		Serial.print(" coilStatus :");
		Serial.println(coilStatus);
	}
	pidValue = ComputePid();
	pidValue = map(pidValue, 0, 100, 0, cycleLength + 1);
}

byte ComputePid()
{
	return pid;
}

void ManageCoil()
{
	if (pidValue > cycleCounter)
	{
		if (!coilStatus)
		{
			coilStatus = true;
		}
	}
	else
	{
		coilStatus = false;
	}

}

void SetupInterrupt()
{
	cli(); // disable global interrupts
	TCCR1A = 0; // set entire TCCR1A register to 0
	TCCR1B = 0; // same for TCCR1B
	// set compare match register to desired timer count:
	OCR1A = 15624;
	// turn on CTC mode:
	TCCR1B |= (1 << WGM12);
	// Set CS10 and CS12 bits for 1024 prescaler:
	TCCR1B |= (1 << CS10);
	TCCR1B |= (1 << CS12);
	// enable timer compare interrupt:
	TIMSK1 |= (1 << OCIE1A);
	// enable global interrupts:
	sei();
}

Il codice così com'è non sò se sull'ide arduino compila, visto che io uso ECLIPSE e l'ho aggiustato a manina per postarlo.

Ho settato un timer che tramite interrupt mi dà un evento ogni secondo con la quale vado ad alimentare un contatore.
Ad ogni impulso di interrupt vado ad incrementare il contatore (da 0 a 3, 4 passaggi) ed ogni volta che il contatore cambia ( lastCounter != cycleCounter) viene avviata la gestione del relè (ManageCoil).
Per simulare il tutto ho messo il valore pid in maniera fissa, parte da 0 e viene sommato di 10 ad ogni azzeramento del contatore(questo per verificare la logica della durata con la quale il relè deve rimanere eccitato in base al valore)
Il valore restituito da ComputePid varia da 0 a 100 (% percentuale) e viene poi mappato in valori da 0 a 4 (totale 5 combinazioni, 0% sempre spento, 25% acceso 1 secondo su 4,50% acceso 2 secondi su 4, 75% acceso 3 secondi su 4,100% acceso per tutto il periodo)