-
Notifications
You must be signed in to change notification settings - Fork 0
/
dev-notes-funhouse.txt
229 lines (221 loc) · 9.49 KB
/
dev-notes-funhouse.txt
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
Adafruit Funhouse microcontroller board
To initialize with the self test code:
Design goal: replace netatmo with programmable, better capability.
Specifications:
Inputs and Outputs:
Controls:
local:
[x] Slider: use to control TFT display brightness
3 Push buttons
3 Touch
Web adafruit dashboard: Don't really see a use case for web remote control of the funhouse
Data inputs:
What:
Internal sensors:
[x] temperature
[x] humidity
[x] barometer
[x] light level
add on sensors:
[x] PIR
Adafruit SGP30 Air Quality Sensor Breakout - VOC and eCO2 - STEMMA QT / Qwiic
https://www.adafruit.com/product/3709
[x] VOC
[x] CO2:
adafruit IO
[no] Local Weather and forecast inputs??? use pushbuttons for menu? select local weather? Why?
Data Outputs:
[x] Print to Internal TFT display
adafruit dashboard
[x] temperature
[x] cpu temp?
[x] humidity
[x] barometer
[x] light level
...
[x] change update rate from 20 times / hour??
[x] plot
Status Outputs:
Speaker / buzzer ???
[x] Five mini DotStar LEDs
[x] adafruit dashboard
Processing:
[no] Use PIR to activate TFT display. Set to off after delay?
[no] Use light sensor to control TFT brightness
[x] Decide on power conservation:
two modes?
no worries unles battery powered
Use small power bank like with zoom H6?
[no] I/F with Raspberry Pis. Just display web page on Pi.
1/4/22
The basics are working
LED usage
Individually control dotstar LEDs like this:
funhouse.peripherals.dotstars[2] = (16, 16, 16)
Funhouse has six LEDs. Usage:
[x] main LED: on when uploading: funhouse.peripherals.led = True
Use dotstars in alpha order:
[n/a] barometer: no LED
[x] dots[0] - CO2: color varies with level, blue - green - yellow - red
[x] dots[1] - humidity: orange (low) - green (OK) - red (high)
[n/a] light level no LED
[x] dots[2] - PIR: white
[NO] fades with time?
[x] dots[3] - temperature: color varies with level, blue - green - yellow - red
[x] dots[4] - VOC: color varies with level, blue - green - yellow - red
libraries used so far:
adafruit_ahtx0.mpy adafruit_io
adafruit_bitmap_font adafruit_minimqtt
adafruit_display_text adafruit_portalbase
adafruit_dotstar.mpy adafruit_register
adafruit_dps310.mpy adafruit_requests.mpy
adafruit_fakerequests.mpy simpleio.mpy
adafruit_funhouse
disk space used so far: /dev/disk8s1 941Ki 302Ki 639Ki 33% 512 0 100% /Volumes/CIRCUITPY
Next:
[x] Add a function for humidity and temperature LEDs
[] Code clean up
[x] Consolodate constants
[x] try except
test for or protect against non-existent sensors
[x] SGP30
[no] PIR - returns zero if not connected
[x] standalone test sgp 30
[x] add sgp 30 CO2 and VOC
[x] read sensors
[x] update LED colors based on measurements
[x] twelve hour calibration
Future:
Modes?
[x] nightlight???
on motion detect:
turn on led[2] for one cycle
if it's dark and brightness is zero: turn all dotstar LEDs on full bright for one cycle
[x] auto TFT / LED brightness
Away mode:
immediate notification of motion detect to Raspberry Pi
slow email notification via IFTT
[x] add cpu temperature: https://learn.adafruit.com/adafruit-funhouse/cpu-temperature
1/6/22
[x] integrate / test / debug SGP30
works standalone
now works integrated!
this info was the key: https://circuitpython.readthedocs.io/projects/funhouse/en/latest/
1/10/22
Used ~25% of the solar charge USB battery pack in 10 hours, so ~40 hour run time, + any solar pick up.
[x] Figure out sensor calibration
[x] hold down button on restart to put in calibration mode
push up button to upload cal data to IO
record cal values every hour
[x] to IO
[x] to file on Funhouse
[x] stop displaying co2 and voc values on text dashboard
then update the source code to set a new baseline with:
sgp30.set_iaq_baseline(co2eq_base, tvoc_base
twelve hour run results:
2022/01/10 10:16:29AM tvoc_base: 37358
2022/01/10 10:16:28AM co2eq_base: 36348
2022/01/10 8:15:06AM tvoc_base: 37198
2022/01/10 8:15:06AM co2eq_base: 36339
2022/01/10 7:33:37AM tvoc_base: 37142
2022/01/10 7:33:36AM co2eq_base: 36336
2022/01/10 6:58:33AM tvoc_base: 37110
2022/01/10 6:58:33AM co2eq_base: 36335
2022/01/10 6:10:49AM tvoc_base: 37110
2022/01/10 6:10:48AM co2eq_base: 36336
2022/01/10 5:35:49AM tvoc_base: 37110
2022/01/10 5:35:49AM co2eq_base: 36337
2022/01/09 9:45:48PM tvoc_base: 37128
2022/01/09 9:45:47PM co2eq_base: 36442
tvoc: 37358 = 0x91EE
co2: 36348 = 0x8DFC
[x] Add offset values for co2 and voc
[x] re-orient the sgp30 board so that the sensor (chip side) faces down
[x] try / except to determine whether sgp30 present
[NO] try / except to determine whether PIR present: it returns no detect if no PIR
modes?:
[x] On start up: hold down sel button to calibrate
cal mode operates normally, except will add cal readings hourly IO text feed
exception handles absense of SGP30 add on board
While running:
expceptions handle network errors
[x] sensor values posted to IO feeds:
eCO2
humidity
PIR
temperature
TVOC
barometric pressure
light level
cpu temperature
[x] also post system info text feed to IO
[x] dotstar colors indicate reading levels: controlled by constants
eCO2
humidity
PIR
temperature
TVOC
[x] Raw sensor readings are adjusted with offset and slope calibration values
[x] slider will control brightness (not very well in low power mode)
[x] Hold up button to shift to normal mode
forces IO update when pressed
0.2 s sleep
brightness
defaults to 0.25
control with slider
60 s IO update
[x] Hold down button to shift to low power (normal)
forces an IO update when pressed
1.0 s sleep
brightness
defaults to 0.0
slider disables
update every 5 minutes?
hold a button to go to normal?
1/12/22
[x] re-test cal mode
[x] Test status messages to the text feed
[x] test wifi try / except (rename secrets file)
1/14/22
[x] make compensation more sophisticated: offset and slope
1/15/22
[x] update dashboard limits to match code
1/18/22
[x] add constant in code to control whether to adjust raw values
[x] read CO2 each loop. 1/s read makes sgp30 more accurate?
[x] re-factor push_to_IO_queue - simplify
powered on with new sw version at ~9:36am and switched to fast update (so co2 is /s)
1/19/22
[x] LED on while busy = sleeping or io update
[x] revised print / add_to_io_feed
1/20/22
co2 sensor went squirelly. Better after reboot
1/23/22
[x] use select button to toggle night light mode?
[x] redo calibration and adjustments: they aren't very close
[x] Get SGP serial number into IO text feed?
[x] Updating readme
[x] added generic secrets.py to git
[x] added a tone to exception processing
1/24/22
[x] test / fix exception handling
[x] Format readme
1/25/22
[x] refactor io_queue - text_queue
function -> class
number messages so we know if any are missing
[x] readme fixes
[NO] Use cpu temp to model a dynamic offset?
1/27/22
[x] slider control logic changed: only processes changes. more responsive?
[x] check for presense of secrets file at startup. if missing, stop
[x] add funhouse id to secrets file so multiple funhouse's can share a single io_queue
[x] Freeze io_queue if size is > 2048
# Version 0.1: 1/27/22
[] change barometer to value - rising / falling?
[] decide on file writes. would need for fully auto re-cal w/o internet
Normally the file system is read only. See this link:
https://learn.adafruit.com/cpu-temperature-logging-with-circuit-python/writing-to-the-filesystem
with open("sgp30_cal_data.txt", "a") as f:
f.write(co2_base_string)
f.write(tvoc_base_string)