-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsource.ino
186 lines (164 loc) · 5.02 KB
/
source.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
char S = 0;
volatile int int_times = 0;
char last_pin_state;
char pin_state;
int period_times = 100;
int duty_cycle = 30;
unsigned long start_alarm = 0;
unsigned long start_pl = 0;
unsigned long start_mod = 0;
unsigned long start_pulse = 0;
int seconds = 0; //conteggio secondi...
const unsigned long alarm_period = 5*1000000U;
const unsigned long micro_pl_period = 10000; //periodo power line 10ms in microsecondi
const int mod_period = 40; //step in cui è diviso l'intero periodo della onda. utile per modulazione
const unsigned long debug_period = 10000U;
const int mod_step = mod_period/40; // step utile per debug, incremento dutycycle
const unsigned long micro_pl_tick = micro_pl_period/mod_period;
unsigned long duty_tick = micro_pl_period - micro_pl_tick * duty_cycle;
int pout_state = LOW; //livello uscita comandoi gate: HIGH o LOW
typedef struct flickFuns_t {
void (*flickPt)(void);
void (*flickInitPt)(void);
} flickFuns_t;
typedef struct flickUtils_t {
const short flickerProbability = 3;//Probabilità di flick in parti percentuali
flickFuns_t flickFuns;
void (*periodManagePt)(void);
unsigned const long meanMainPeriod = 5*1000000U; //valore medio di main_period è 5 secondi (5*10^6 microsecondi)
unsigned long mainPeriod;
unsigned long startMainPeriod;
bool isFlickering;
} flickUtils_t;
typedef struct defaultFlick_t {
unsigned long defaultFlickPeriod = 4000000U;
unsigned long flickDCUpdate = 100000U; //10 update al secondo
short flickTimes;
short flickIndex;
short flickStep;
int flickMax = 10;
} defaultFlick_t;
flickUtils_t flickUV;
defaultFlick_t defaultFlickV;
#define PIN 2
#define POUT 3
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
//Serial.begin(115200,SERIAL_8N1);
//pinMode(LED_BUILTIN, OUTPUT);
pinMode(POUT, OUTPUT);
//digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
pinMode(PIN, INPUT_PULLUP); //set the pin to input
flickUV.startMainPeriod = micros();
duty_tick = 0;
duty_cycle = mod_period;
//duty_tick = micro_pl_period;
start_mod = micros();
flickUV.periodManagePt = randomPeriodManage;
flickUV.flickFuns.flickPt = defaultFlick;
flickUV.flickFuns.flickInitPt = defaultFlickInit;
flickUV.mainPeriod = flickUV.meanMainPeriod;
randomSeed(analogRead(0));
}
// the loop function runs over and over again forever
void loop() {
//Controllo periodo linea elettrica tramite ingresso zero crossing detector
if(digitalRead(PIN))
{
//modulate() è bloccante. Ritorna dopo che è stato triggerato il gate del triac
modulate();
}
if( flickUV.isFlickering )
{
flickUV.flickFuns.flickPt();
}else
{
if ( ( micros()-flickUV.startMainPeriod ) > flickUV.mainPeriod )
{
flickUV.periodManagePt();
}
}
}
void randomPeriodManage(void)
{
flickUV.startMainPeriod = micros();
//duty_cycle = (mod_period/4 + random(-mod_period/2,mod_period/2));
//duty_tick = micro_pl_period - (micro_pl_tick * duty_cycle);
if (random(0,100) < flickUV.flickerProbability)
{
flickUV.flickFuns.flickInitPt();
flickUV.isFlickering = true;
}
}
void dummyFun()
{
return;
}
void constPeriodManage(void)
{
flickUV.startMainPeriod = micros();
flickUV.flickFuns.flickInitPt();
flickUV.isFlickering = true;
}
void defaultFlick(void)
{
short temp;
if ( ( micros()-flickUV.startMainPeriod ) > defaultFlickV.defaultFlickPeriod )
{
duty_cycle = duty_cycle + defaultFlickV.flickStep;
if(duty_cycle <= 0)
{
duty_cycle = 0;
defaultFlickV.defaultFlickPeriod = 5000*random(1,10);
defaultFlickV.flickStep = -defaultFlickV.flickStep;
}else
{
if(duty_cycle >= mod_period)
{
duty_cycle = mod_period;
defaultFlickV.flickIndex++;
defaultFlickV.flickStep = -defaultFlickV.flickStep;
if(defaultFlickV.flickTimes == defaultFlickV.flickIndex)
{
flickUV.isFlickering = false;
temp = duty_cycle;
}
}
}
//Sovrappongo rumore
if(flickUV.isFlickering)
{
temp = duty_cycle + random(-5,5);
}else
{
temp = duty_cycle;
}
duty_tick = micro_pl_period - (micro_pl_tick * temp);
flickUV.startMainPeriod = micros();
}else
{
//duty_tick = micro_pl_period;
}
}
void defaultFlickInit(void)
{
defaultFlickV.flickTimes = random(4,9);
defaultFlickV.flickIndex = 0;
defaultFlickV.defaultFlickPeriod = 5000*random(1,3);
defaultFlickV.flickStep = -2;
}
/*
* Funzione che gestisce la modulazione di fase del carico
* Serve per, appunto, comandare il triac
*/
void modulate()
{
start_pl = micros();
//Aspetto che sia trascorso sufficiente tempo per attivare triac
while( ( micros()-start_pl ) < ( 8600 )) //penso che questo valore sia per limitare problemi con il crossing successivo
{
if(( micros()-start_pl ) > ( duty_tick )) digitalWrite(POUT, HIGH);
digitalWrite(POUT, LOW);
}
}