Buonasera,
sto scrivendo del codice per far funzionare una lavastoviglie con Arduino. Ci sono 8 programmi ognuno dei quali ha caratteristiche diverse (prelavaggio sì o no, numero di risciacqui, suddivisione del lavaggio principale ecc. ecc.), ma siccome tutti si riferiscono ad una struttura comune ho ddeciso di creare una struct chiamata Cycle
Ora, il problema è che non riesco ad attribuire ai termini della struct i valori che desidero. Prendiamo l'esempio di cycleArray[0], è un programma dove scarica per 1 minuto, carica per 1.5 minuti (tempi indicativi, sono gestiti da pressostato), lava per 10 minuti e scarica per 1 minuto. Totale 13.5 minuti, o 810000 millisecondi.
Ma per qualche motivo (sicuramente banale, ma mi ci sono incartato) la scrittura
cycleArray[0].prewashDuration1 = 10;
non funziona. Infatti se vado a stampare questa voce mi restituisce 0 anzichè 10. Dove sbaglio?
Inoltre se nel loop vado a scrivere
void loop(){
calculateTime(0);
}
mi viene restituita soltanto la somma dei tempi già espressi (intendo 1,1.5 e 1, totale 3.5), a conferma che questo "assegnamento" non funziona
Qui di seguito trovate il codice completo (è un file header), se riusciste ad aiutarmi ve ne sarei grato
#ifndef cycleproperties_h
#define cycleproperties_h
#define numOfPrograms 8
#define K 60000 //convert from minutes to millis
#define heatK 2.5 //increase of temperature every minute
#define inletWaterTemp 10 //°C
/*
PROGRAM CYCLES ORDER
1: RINSE AND HOLD
2: INTENSIVE 70°C
3: NORMAL 65°C
4: ECO 55°C
5: 1h 65°C
6: GLASSWARE 45°C
7: QUICK 45°C
8: PLATEWARMER
*/
typedef struct Cycle {
byte startPhase = 0;
bool heatedPrewash = 0;
byte prewashTemp = inletWaterTemp ;
byte prewashDuration1 = 0; //in minutes
byte prewashDuration2 = 0;
byte washTemp = inletWaterTemp;
byte washTime1 = 0; //in minutes //cold wash
byte washTime2 = 0; //in minutes //wash at 45°C
byte washTime3 = 0; //in minutes //wash at temp 2 (eg. 55°C)
byte washTime4 = 0; // in minutes //wash at final temp (eg. 65°C)
bool secondHeating = 0; //reheat water yes or no
byte secondHeatingTemp = inletWaterTemp;
bool thirdHeating = 0;
byte thirdHeatingTemp = inletWaterTemp;
bool withRinse1 = 0;
bool heatedRinse1 = 0;
byte rinse1Duration = 0;
bool withRinse2 = 0;
bool heatedRinse2 = 0;
byte rinse2Duration = 0;
bool heatedRinse3 = 0;
byte rinse3Duration = 0;
bool rinse3Temp = inletWaterTemp;
byte dryingDuration = 0;
byte endPhase = 27;
};
Cycle cycleArray[numOfPrograms];
void assignParameters() {
//PREWASH / RINSE AND HOLD / SOAK PROGRAM
cycleArray[0].startPhase = 0;
cycleArray[0].heatedPrewash = false;
cycleArray[0].prewashDuration1 = 10;//minutes
cycleArray[0].endPhase = 6;//last phase run before ending the cycle (prewash only)
//1h 65°C
cycleArray[4].startPhase = 6;//first phase of the cycle (prewash skipped)
cycleArray[4].washTemp = 45;
cycleArray[4].washTime1 = 2; //cold water
cycleArray[4].washTime2 = 4; //at 45°C
cycleArray[4].secondHeating = true;
cycleArray[4].secondHeatingTemp = 65;
cycleArray[4].washTime3 = 1; //at 65°C
cycleArray[4].withRinse1 = true;
cycleArray[4].heatedRinse1 = true;
cycleArray[4].rinse1Duration = 5; //minutes
cycleArray[4].heatedRinse3 = true;
cycleArray[4].rinse3Temp = 55;
cycleArray[4].rinse3Duration = 2; //minutes
cycleArray[4].dryingDuration = 5;
cycleArray[4].endPhase = 27;//last phase run before ending the cycle (no drying)
//QUICK 45°C
cycleArray[6].startPhase = 6;//first phase of the cycle (prewash skipped)
cycleArray[6].washTemp = 45;
cycleArray[6].washTime2 = 2;//at 45°C
cycleArray[6].withRinse1 = true;
cycleArray[6].rinse1Duration = 4;//minutes
cycleArray[6].heatedRinse3 = true;
cycleArray[6].rinse3Temp = 50;//minutes
cycleArray[6].endPhase = 25;//last phase run before ending the cycle (no drying)
}
/* FUNCTIONS AND TIME CALCULATION */
long timeToHeat(byte temp) {
return (K * (temp - inletWaterTemp) / heatK);
}
long timeArray[27] = {K, 1.5 * K , cycleArray[progIndex].prewashDuration1 * K, cycleArray[progIndex].heatedPrewash * timeToHeat(cycleArray[progIndex].prewashTemp), cycleArray[progIndex].prewashDuration2 * K, //prewash
K, 1.5 * K, cycleArray[progIndex].washTime1 * K, timeToHeat(45), cycleArray[progIndex].washTime2 * K, cycleArray[progIndex].secondHeating * timeToHeat(cycleArray[progIndex].secondHeatingTemp - 45 ),
cycleArray[progIndex].washTime3 * K, cycleArray[progIndex].thirdHeating * timeToHeat(cycleArray[progIndex].thirdHeatingTemp - cycleArray[progIndex].secondHeatingTemp),
cycleArray[progIndex].washTime4 * K, 2.5 * K, //mainwash
1.5 * K, cycleArray[progIndex].rinse1Duration * K, K, //first rinse
1.5 * K, cycleArray[progIndex].rinse2Duration * K, K, //second rinse
1.5 * K, timeToHeat(cycleArray[progIndex].rinse3Temp), cycleArray[progIndex].rinse3Duration * K, K, //third and final rinse
cycleArray[progIndex].dryingDuration * K, K //drying
};
long calculateTime(byte progIndex) {
long totalTime = 0;
assignParameters();
for (int i = cycleArray[progIndex].startPhase; i < cycleArray[progIndex].endPhase; i++) {
totalTime += timeArray[i];
Serial.println("Time array value pos ");
Serial.print (i);
Serial.print ("= ");
Serial.println(timeArray[i]);
}
Serial.println(totalTime);
return totalTime;
}
#endif