Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // modo LINEARE: variazioni sempre uguali per ogni step (prova a valutare la differenza commentando uno dei due metodi)
- /*
- Con 50HZ di frequenza abbiamo che il periodo dura 20ms, quindi avrò un passaggio èper lo zero ogni 10mS -> 10000uS
- Il ritardo per attivare il TRIAC dovrà quindi essere compreso tra 0 e 10000uS; 0uS passa tutta la sinusoide quindi max potenza al carico
- Siccome ho deciso di avere la regolazione in 100 passi discreti e 10uS di delay ci saranno sempre per attivare il TRIAC
- ho che ogni STEP deve corrispondere ad una variazione in uS di (10000uS -10uS) / 100 = 99.9 uS
- */
- // modo PSEUDO-LOGARITMICO: variazioni diverse per ogni step secondo la curva simil CIE1931
- /*
- Secondo la curva CIE1931 la Luminosità (in inglese brightness: cioè la luce "percepita" nel range 0%-100% )
- dipende dalla Luminanza (in inglese luminance: grandezza misurabile, cioè quella che andiamo ad impostare noi)
- secondo le seguenti formule:
- Brightness = 116 * Luminance ^ (1/3) - 16 for luminance levels above 0.008856
- Brightness = 902.3 * Luminance for luminance levels at or below 0.008856
- Nella formula la luminanza varia nel range 0-1 ed in tutti gli esempi che si trovano online
- viene ricavata ed usata la formula inversa per determinare Luminance in funzione di Brightness
- (solitamente gli esempi fanno riferimento al classico led di esempio da accendere con la tecnica PWM)
- Nel nostro caso invece, siccome di fatto dobbiamo impostare quanto tempo rimane spento il TRIAC,
- se facciamo la stessa cosa avremmo un funzionamento con un andamento al contrario di come dovrebbe essere
- Questa variazione dovrebbe essere quindi simil-logaritmica
- Purtroppo, visti i limiti di risorse di Arduino usare formule con potenze, logaritimi etc etc non è il massimo.
- E' più conveniente usare una tabella di lookup predefinita di valori calcolati in precedenza
- (Io ad esempio ho usato uno script python per creare l'array)
- */
- // Tabella generata con lo script python https://pastebin.com/dHML7NMu
- // Per testarlo si può usare anche il tool online https://www.jdoodle.com/python-programming-online#
- // CIE1931 correction table
- // Automatically generated
- const unsigned int cie_table[] = {
- 0, 256, 508, 755, 998, 1237, 1471, 1702, 1928, 2150,
- 2367, 2581, 2791, 2996, 3198, 3396, 3590, 3780, 3966, 4149,
- 4328, 4503, 4674, 4842, 5006, 5167, 5324, 5478, 5628, 5775,
- 5919, 6059, 6197, 6330, 6461, 6589, 6713, 6834, 6953, 7068,
- 7180, 7290, 7396, 7500, 7601, 7699, 7795, 7887, 7978, 8065,
- 8150, 8232, 8312, 8390, 8465, 8537, 8608, 8676, 8741, 8805,
- 8866, 8925, 8982, 9037, 9090, 9141, 9190, 9237, 9282, 9326,
- 9367, 9407, 9445, 9481, 9516, 9549, 9580, 9610, 9639, 9666,
- 9691, 9716, 9738, 9760, 9780, 9799, 9817, 9834, 9850, 9864,
- 9878, 9890, 9901, 9912, 9924, 9935, 9946, 9957, 9968, 9979,
- 9990
- };
- const int AC_LOAD = 3; // Output to Opto Triac pin
- const int ZERO_CROSS = 2;
- #define STEP 99.9
- #define TRIAC_DELAY 10
- unsigned int dimtime = 0;
- // Dimming level (0-100%) 0 = OFF, 100 = ON
- unsigned int dimlevel = 0;
- unsigned int dimlevel_old = 0;
- void setup(){
- Serial.begin(115200);
- pinMode(AC_LOAD, OUTPUT); // Set AC Load pin as output
- pinMode(ZERO_CROSS, INPUT_PULLUP);
- attachInterrupt(digitalPinToInterrupt(ZERO_CROSS), zero_crosss_int, RISING);
- }
- //the interrupt function must take no parameters and return nothing
- void zero_crosss_int(){
- delayMicroseconds(dimtime); // Aspetta il tempo impostato prima di attivare il TRIAC
- digitalWrite(AC_LOAD, HIGH); // Attivazione TRIAC
- delayMicroseconds(TRIAC_DELAY); // E' necessario mantenere per un po' alta l'uscita per far funzionare il TRIAC
- digitalWrite(AC_LOAD, LOW); // Resetta l'uscita
- }
- void loop() {
- /*
- Impostiamo il livello di luminosità usando un potenziometro. Il valore che leggo dall'analogica varia nel range 0-1023,
- va quindi scalato nel range che abbiamo deciso di usare e pe farlo usiamo map()
- Da notare che ho invertito il "verso" altrimenti il pot funzionerebbe al contrario.
- */
- dimlevel = map(analogRead(A0), 0, 1023, 99, 0);
- // E' inutile fare le conversioni ad ogni ciclo di loop, facciamo solo se è cambiato il valore del potenziometro
- if(dimlevel != dimlevel_old){
- dimlevel_old = dimlevel;
- // Determiniamo il tempo da aspettare prima di accendere il TRIAC
- // modo PSEUDO-LOGARITMICO: variazioni diverse per ogni step secondo la curva simil CIE1931
- dimtime = cie_table[dimlevel];
- // modo LINEARE: variazioni sempre uguali per ogni step (prova a valutare la differenza commentando uno dei due metodi)
- //dimtime = STEP * dimlevel;
- Serial.print(dimlevel);
- Serial.print(": ");
- Serial.println(dimtime);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement