]> git.friedersdorff.com Git - max/power_meter.git/blob - power_meter.ino
Work in progress
[max/power_meter.git] / power_meter.ino
1 #include <LightChrono.h>
2 #include <Chrono.h>
3
4 const int digits[] = {9, 10, 11, 12};
5 const int segments[] = {2, 8, 4, 5, 6, 7, 3};
6
7 const bool one[7] = {false, true, true, false, false, false, false};
8 const bool two[7] = {true, true, false, true, true, false, true};
9 const bool three[7] = {true, true, true, true, false, false, true};
10 const bool four[7] = {false, true, true, false, false, true, true};
11 const bool five[7] = {true, false, true, true, false, true, true};
12 const bool six[7] = {true, false, true, true, true, true, true};
13 const bool seven[7] = {true, true, true, false, false, false, false};
14 const bool eight[7] = {true, true, true, true, true, true, true};
15 const bool nine[7] = {true, true, true, true, false, true, true};
16 const bool zero[7] = {true, true, true, true, true, true, false};
17
18 Chrono timer;
19
20 float photosensor_voltage = 0;
21
22
23 void writeDigit(char d, char val, bool dec) {
24     const bool *segs;
25     switch (val) {
26         case 0:
27             segs = zero;
28             break;
29         case 1:
30             segs = one;
31             break;
32         case 2:
33             segs = two;
34             break;
35         case 3:
36             segs = three;
37             break;
38         case 4:
39             segs = four;
40             break;
41         case 5:
42             segs = five;
43             break;
44         case 6:
45             segs = six;
46             break;
47         case 7:
48             segs = seven;
49             break;
50         case 8:
51             segs = eight;
52             break;
53         case 9:
54             segs = nine;
55             break;
56     }
57     for (int i = 0; i < 7; ++i) {
58         if (segs[i]) {
59             digitalWrite(segments[i], HIGH);
60         } else {
61             digitalWrite(segments[i], LOW);
62         }
63     }
64     if (dec) {
65       digitalWrite(segments[7], HIGH);
66     }
67     digitalWrite(digits[d], LOW);
68     delay(1);
69     digitalWrite(digits[d], HIGH);
70     digitalWrite(segments[7], LOW);
71 }
72
73 void showNumber(float number) {
74     int n = number;
75     writeDigit(0, (n/1000U) % 10, false);
76     writeDigit(1, (n/100U) % 10, false);
77     writeDigit(2, (n/10U) % 10, false);
78     writeDigit(3, n % 10, false);
79 }
80
81 void setup() {
82     // put your setup code here, to run once:
83     Serial.begin(9600);
84
85     for (int i = 0; i < 4; ++i) {
86         pinMode(digits[i], OUTPUT);
87         digitalWrite(digits[i], HIGH);
88     }
89     for (int i = 0; i < 7; ++i) {
90         pinMode(segments[i], OUTPUT);
91         digitalWrite(segments[i], LOW);
92     }
93 }
94
95 void loop() {
96   if (timer.hasPassed(100)) {
97     timer.restart();
98     photosensor_voltage = readMinVoltage(A5);
99   }
100   showNumber(photosensor_voltage);
101     
102 }
103
104 float readMinVoltage(int pin) {
105   float minvolts = 5000;
106   float volts = 0;
107   for (int i = 0; i < 100; ++i) {
108      volts = analogRead(A7) * (4.8/1.023);
109      if (volts < minvolts) {
110       minvolts = volts;
111      }
112      delay(0.2);
113   }
114   return minvolts;
115 }