mirror of https://github.com/jeelabs/esp-link.git
parent
5dc9c4f934
commit
3df5993c0a
@ -0,0 +1,127 @@ |
|||||||
|
#include "WebServer.h" |
||||||
|
|
||||||
|
#include <avr/io.h> |
||||||
|
|
||||||
|
#define SAMPLE_COUNT 100 |
||||||
|
#define PERIOD_COUNT (135 * SAMPLE_COUNT) |
||||||
|
|
||||||
|
uint16_t smin = 0xFFFF; |
||||||
|
uint16_t smax = 0; |
||||||
|
uint32_t savg = 0; |
||||||
|
|
||||||
|
uint16_t count; |
||||||
|
uint32_t voltage = 0; |
||||||
|
uint16_t measured_voltage = 0; |
||||||
|
|
||||||
|
#define MAX_HISTORY 3 |
||||||
|
|
||||||
|
uint8_t history_cnt = 0; |
||||||
|
uint32_t h_ts[MAX_HISTORY]; |
||||||
|
uint16_t h_min[MAX_HISTORY]; |
||||||
|
uint16_t h_max[MAX_HISTORY]; |
||||||
|
uint16_t h_avg[MAX_HISTORY]; |
||||||
|
|
||||||
|
uint16_t calibrate = 0x128; // calibrate this manually
|
||||||
|
|
||||||
|
void voltageInit() |
||||||
|
{ |
||||||
|
analogReference(DEFAULT); |
||||||
|
|
||||||
|
count = 0; |
||||||
|
} |
||||||
|
|
||||||
|
void voltageLoop() |
||||||
|
{ |
||||||
|
uint16_t adc = analogRead(A0);
|
||||||
|
|
||||||
|
if( adc < smin ) |
||||||
|
smin = adc; |
||||||
|
if( adc > smax ) |
||||||
|
smax = adc; |
||||||
|
savg += adc; |
||||||
|
|
||||||
|
voltage += adc; |
||||||
|
count++; |
||||||
|
|
||||||
|
if( (count % SAMPLE_COUNT) == 0 ) |
||||||
|
{ |
||||||
|
voltage /= SAMPLE_COUNT; |
||||||
|
measured_voltage = voltage * calibrate / 256; |
||||||
|
voltage = 0; |
||||||
|
} |
||||||
|
if( count == PERIOD_COUNT ) |
||||||
|
{ |
||||||
|
for(int8_t i=MAX_HISTORY-2; i >=0; i-- ) |
||||||
|
{ |
||||||
|
h_ts[i+1] = h_ts[i]; |
||||||
|
h_min[i+1] = h_min[i]; |
||||||
|
h_max[i+1] = h_max[i]; |
||||||
|
h_avg[i+1] = h_avg[i]; |
||||||
|
} |
||||||
|
|
||||||
|
h_ts[0] = millis(); |
||||||
|
h_min[0] = (uint32_t)smin * calibrate / 256; |
||||||
|
h_max[0] = (uint32_t)smax * calibrate / 256; |
||||||
|
h_avg[0] = (savg / PERIOD_COUNT) * calibrate / 256; |
||||||
|
|
||||||
|
smin = 0xFFFF; |
||||||
|
smax = 0; |
||||||
|
savg = 0; |
||||||
|
|
||||||
|
if( history_cnt < MAX_HISTORY ) |
||||||
|
history_cnt++; |
||||||
|
count = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void voltageHtmlCallback(WebServerCommand command, char * data, int dataLen) |
||||||
|
{ |
||||||
|
switch(command) |
||||||
|
{ |
||||||
|
case BUTTON_PRESS: |
||||||
|
// no buttons
|
||||||
|
break;
|
||||||
|
case SET_FIELD: |
||||||
|
/* TODO */ |
||||||
|
break; |
||||||
|
case LOAD: |
||||||
|
case REFRESH: |
||||||
|
{ |
||||||
|
webServer.setArgNum(2); |
||||||
|
|
||||||
|
char buf[20]; |
||||||
|
uint8_t int_part = measured_voltage / 256; |
||||||
|
uint8_t float_part = ((measured_voltage & 255) * 100) / 256; |
||||||
|
sprintf(buf, "%d.%02d V", int_part, float_part); |
||||||
|
webServer.setArgString("voltage", buf); |
||||||
|
|
||||||
|
char tab[256]; |
||||||
|
tab[0] = 0; |
||||||
|
strcat_P(tab, PSTR("[[\"Time\",\"Min\",\"AVG\",\"Max\"]")); |
||||||
|
|
||||||
|
for(uint8_t i=0; i < history_cnt; i++ ) |
||||||
|
{ |
||||||
|
uint8_t min_i = h_min[i] / 256; |
||||||
|
uint8_t min_f = ((h_min[i] & 255) * 100) / 256; |
||||||
|
uint8_t max_i = h_max[i] / 256; |
||||||
|
uint8_t max_f = ((h_max[i] & 255) * 100) / 256; |
||||||
|
uint8_t avg_i = h_avg[i] / 256; |
||||||
|
uint8_t avg_f = ((h_avg[i] & 255) * 100) / 256; |
||||||
|
|
||||||
|
sprintf(buf, ",[\"%d s\",", h_ts[i] / 1000); |
||||||
|
strcat(tab, buf); |
||||||
|
sprintf(buf, "\"%d.%02d V\",", min_i, min_f); |
||||||
|
strcat(tab, buf); |
||||||
|
sprintf(buf, "\"%d.%02d V\",", avg_i, avg_f); |
||||||
|
strcat(tab, buf); |
||||||
|
sprintf(buf, "\"%d.%02d V\"]", max_i, max_f); |
||||||
|
strcat(tab, buf); |
||||||
|
} |
||||||
|
|
||||||
|
strcat_P(tab, PSTR("]")); |
||||||
|
webServer.setArgJson("table", tab); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue