Gbox 4.20
Grow box automation and monitoring - <a href='https://sites.google.com/site/growboxguy/'>https://sites.google.com/site/growboxguy/</a>
 
Loading...
Searching...
No Matches
LedPage.ino
Go to the documentation of this file.
1#include <ELClientWebServer.h>
2
3// the PIN to flash
4#define LED_PIN 13
5
6int8_t blinking = 0; // whether LED is blinking
7uint8_t blinking_duty = 2; // blinking duty
8int8_t blinking_frequency = 10; // blinking frequency
9
10uint32_t blinking_next_ts = 0; // the next timestamp to blink
11uint16_t blinking_phase = 100; // blinking phase
12uint16_t blinking_period = 200; // blinking period (2000 / frequency)
13
14#define MAX_LOGS 5
15uint32_t log_ts[MAX_LOGS]; // log timestamp
16uint8_t log_msg[MAX_LOGS]; // log message
17uint8_t log_ptr = 0; // log pointer
18
28
29// LED loop code
30void ledLoop()
31{
32 if( blinking ) // if blinking is enabled
33 {
34 if( blinking_next_ts <= millis() )
35 {
36 digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // blink LED
39 }
40 }
41}
42
43// adds a new log message
44void ledAddLog(uint8_t msg)
45{
46 // check if max log is reached
47 if( log_ptr >= MAX_LOGS )
48 log_ptr = MAX_LOGS - 1;
49
50 // move logs back with one and delete the oldest log
51 for(int8_t i=log_ptr-1; i >= 0; i--)
52 {
53 log_ts[i+1] = log_ts[i];
54 log_msg[i+1] = log_msg[i];
55 }
56
57 log_msg[0] = msg; // log message
58 log_ts[0] = millis(); // log timestamp
59 log_ptr++; // a new log was added
60}
61
62// create log messages to string
64{
65 String str = "[";
66
67 for(uint8_t i=0; i < log_ptr; i++)
68 {
69 if( i != 0 )
70 str += ',';
71
72 str += '\"';
73 str += (log_ts[i] / 1000);
74 str += "s: ";
75
76 switch(log_msg[i]) // log message
77 {
78 case LOG_DUTY_25_75:
79 str += F("set duty to 25%-75%");
80 break;
81 case LOG_DUTY_50_50:
82 str += F("set duty to 50%-50%");
83 break;
84 case LOG_DUTY_75_25:
85 str += F("set duty to 75%-25%");
86 break;
87 case LOG_SET_LED_ON:
88 str += F("set led on");
89 break;
91 str += F("set led blinking");
92 break;
93 case LOG_SET_LED_OFF:
94 str += F("set led off");
95 break;
96 default:
97 str += F("set frequency to ");
98 str += (int)log_msg[i];
99 str += F(" Hz");
100 break;
101 }
102 str += '\"';
103 }
104 str += ']';
105
106 return str;
107}
108
109// called at button pressing
110void ledButtonPressCb(const char * button)
111{
112 String btn = button;
113 if( btn == F("btn_on") )
114 {
115 if( blinking || digitalRead(LED_PIN) == false )
117 blinking = 0;
118 digitalWrite(LED_PIN, true);
119 }
120 else if( btn == F("btn_off") )
121 {
122 if( blinking || digitalRead(LED_PIN) == true )
124 blinking = 0;
125 digitalWrite(LED_PIN, false);
126 }
127 else if( btn == F("btn_blink") )
128 {
129 if( !blinking )
131 blinking = 1;
132 blinking_next_ts = millis() + blinking_phase;
133 }
134}
135
136// setting the value of a field
137//
138// handle data as fast as possible
139// - huge HTML forms can arrive in multiple packets
140// - if this method is slow, UART receive buffer may overrun
141void ledSetFieldCb(const char * field)
142{
143 String fld = field;
144 if( fld == F("frequency") )
145 {
146 int8_t oldf = blinking_frequency;
147 blinking_frequency = webServer.getArgInt();
148
151
152 if( oldf != blinking_frequency )
153 {
155 if( blinking )
156 digitalWrite(LED_PIN, false);
157 }
158 }
159 else if( fld == F("duty") )
160 {
161 int8_t oldp = blinking_duty;
162 String arg = webServer.getArgString();
163
164 if( arg == F("25_75") )
165 blinking_duty = 1;
166 else if( arg == F("50_50") )
167 blinking_duty = 2;
168 else if( arg == F("75_25") )
169 blinking_duty = 3;
170
171 if( blinking )
172 digitalWrite(LED_PIN, false);
173
175
176 if( oldp != blinking_duty )
178 }
179}
180
181// called at page refreshing
182void ledRefreshCb(const char * url)
183{
184 if( blinking )
185 webServer.setArgString(F("text"), F("LED is blinking"));
186 else
187 webServer.setArgString(F("text"), digitalRead(LED_PIN) ? F("LED is turned on") : F("LED is turned off"));
188
189 String log = ledHistoryToLog();
190 webServer.setArgJson(F("led_history"), log.begin());
191}
192
193// called at page loading
194void ledLoadCb(const char * url)
195{
196 webServer.setArgInt(F("frequency"), blinking_frequency);
197
198 switch(blinking_duty)
199 {
200 case 1:
201 webServer.setArgString(F("duty"), F("25_75"));
202 break;
203 case 2:
204 webServer.setArgString(F("duty"), F("50_50"));
205 break;
206 case 3:
207 webServer.setArgString(F("duty"), F("75_25"));
208 break;
209 }
210
211 ledRefreshCb( url );
212}
213
214// LED setup code
216{
217 // set mode to output and turn LED off
218 pinMode(LED_PIN, OUTPUT);
219 digitalWrite(LED_PIN, false);
220
221 URLHandler *ledHandler = webServer.createURLHandler(F("/LED.html.json"));
222 ledHandler->buttonCb.attach(ledButtonPressCb);
223 ledHandler->setFieldCb.attach(ledSetFieldCb);
224 ledHandler->loadCb.attach(ledLoadCb);
225 ledHandler->refreshCb.attach(ledRefreshCb);
226}
227
Definitions for ELClientWebServer.
uint32_t log_ts[MAX_LOGS]
Definition LedPage.ino:15
uint8_t log_ptr
Definition LedPage.ino:17
uint16_t blinking_period
Definition LedPage.ino:12
uint8_t log_msg[MAX_LOGS]
Definition LedPage.ino:16
void ledLoadCb(const char *url)
Definition LedPage.ino:194
void ledLoop()
Definition LedPage.ino:30
void ledSetFieldCb(const char *field)
Definition LedPage.ino:141
int8_t blinking_frequency
Definition LedPage.ino:8
LogMessage
Definition LedPage.ino:20
@ LOG_DUTY_75_25
Definition LedPage.ino:23
@ LOG_SET_LED_ON
Definition LedPage.ino:24
@ LOG_SET_LED_BLINKING
Definition LedPage.ino:25
@ LOG_SET_LED_OFF
Definition LedPage.ino:26
@ LOG_DUTY_50_50
Definition LedPage.ino:22
@ LOG_DUTY_25_75
Definition LedPage.ino:21
#define MAX_LOGS
Definition LedPage.ino:14
void ledRefreshCb(const char *url)
Definition LedPage.ino:182
String ledHistoryToLog()
Definition LedPage.ino:63
uint16_t blinking_phase
Definition LedPage.ino:11
void ledButtonPressCb(const char *button)
Definition LedPage.ino:110
void ledInit()
Definition LedPage.ino:215
#define LED_PIN
Definition LedPage.ino:4
uint8_t blinking_duty
Definition LedPage.ino:7
void ledAddLog(uint8_t msg)
Definition LedPage.ino:44
uint32_t blinking_next_ts
Definition LedPage.ino:10
int8_t blinking
Definition LedPage.ino:6
void attach(T *item, retT(T::*method)(argT))
Definition FP.h:147
FP< void, char * > setFieldCb
callback for setting a field from a HTML form
FP< void, char * > loadCb
Callback for HTML page loading.
FP< void, char * > buttonCb
callback for a HTML button press
FP< void, char * > refreshCb
Callback for HTML page refresh.