config.public.h 9.19 KB
Newer Older
1
2
3
#ifndef CONFIG_H_INCLUDED
#  define CONFIG_H_INCLUDED

4
5
6
7
8
9
10
11
12
13
14
15
/***      _                         _
 *       / \   _ __ ___  _ __   ___| |
 *      / _ \ | '_ ` _ \| '_ \ / _ \ |
 *     / ___ \| | | | | | |_) |  __/ |
 *    /_/ __\_\_| |_| |_| .__/_\___|_|
 *       / ___|___  _ __|_/ _(_) __ _
 *      | |   / _ \| '_ \| |_| |/ _` |
 *      | |__| (_) | | | |  _| | (_| |
 *       \____\___/|_| |_|_| |_|\__, |
 *                              |___/
 ***/

Eric Duminil's avatar
Eric Duminil committed
16
17
// This file is a config template, and can be copied to config.h.
// Please don't save any important password in this template.
Eric Duminil's avatar
Eric Duminil committed
18
19
20
21
22
23
// IMPORTANT: Parameters defined in config.h are only default values, and are applied if:
//   * the ampel is flashed for the first time
//   * or 'reset_config' command is called
//   * or AMPEL_CONFIG_VERSION has been changed.
// Once those default values have been applied, uploading the firmware with a modified config.h will not update the ampel configuration!
// Every parameter can be modified and saved later via the web-config.
24
25
// Some of those parameters can also be modified via commands in the Serial monitor :
//    e.g. 'wifi 0' to turn WiFi off, or 'csv 60' to log data in csv every minute.
Eric Duminil's avatar
Eric Duminil committed
26
27
28
29
30
31
32
33
34
/***
 * AMPEL
 */
// You can rename the Ampel if you want.
// This name will be used for CSV files and the mDNS address.
// You'll get a new CSV file after renaming, which can be convenient, e.g. after moving
// the ampel to another room.
// If left empty, the name will be ESPxxxxxx, where xxxxxx represent the last half of the MAC address.
#  define AMPEL_NAME ""
35

Eric Duminil's avatar
Eric Duminil committed
36
37
38
39
40
// This password will be used for Access Point (without username), and for web-server available at http://local_ip with user 'admin', without quotes.
// If left empty, the password will have to be set during the first configuration, via access point.
// In order to be set successfully, it should have at least 8 characters.
#  define AMPEL_PASSWORD ""

Eric Duminil's avatar
Eric Duminil committed
41
42
43
// AMPEL_CONFIG_VERSION should be defined, and have exactly 3 characters.
// If you modify this string, every parameter saved on the Ampel will be replaced by the ones in config.h.
// AMPEL_CONFIG_VERSION should also be updated if the configuration structure is modified.
44
45
// The structure of the Ampel configuration has been modified 11 times, so it's called "a11" for now.
#  define AMPEL_CONFIG_VERSION "a11"
Eric Duminil's avatar
Eric Duminil committed
46

47
48
49
50
/**
 * SERVICES
 */

51
// Define the default for corresponding services. They can be enabled/disabled later in the web-config.
Eric Duminil's avatar
Eric Duminil committed
52
#  define AMPEL_WIFI    true   // Should ESP connect to WiFi? Web configuration will not be available when set to false. Use "wifi 1" command to set to true.
53
54
55
#  define AMPEL_MQTT    true   // Should data be sent over MQTT? (AMPEL_WIFI should be enabled too)
#  define AMPEL_CSV     true   // Should data be logged as CSV, on the ESP flash memory?
#  define AMPEL_LORAWAN false  // Should data be sent over LoRaWAN? (Requires ESP32 + LoRa modem, and "MCCI LoRaWAN LMIC library")
56
57
58
59
60

/**
 * WIFI
 */

Eric Duminil's avatar
Eric Duminil committed
61
62
63
// SSID and PASSWORD need to be defined, but can be empty.
#  define WIFI_SSID     ""
#  define WIFI_PASSWORD ""
64
// How long should the Ampel try to connect to WIFI_SSID?
Eric Duminil's avatar
Eric Duminil committed
65
#  define WIFI_TIMEOUT  30 // [s]
66
67
68
// If the Ampel cannot connect to WIFI_SSID, it will start an Access Point for ACCESS_POINT_TIMEOUT seconds.
// If someone connects to this Access Point, the Ampel will stay in this mode until everybody logs out.
// If nobody connects to the Access Point before ACCESS_POINT_TIMEOUT seconds, the Ampel will try to connect WIFI_SSID again.
69
#  define ACCESS_POINT_TIMEOUT  60 // [s]
70
71
72
73
74
75

/**
 * Sensor
 */

// How often should measurement be performed, and displayed?
76
77
78
//WARNING: On some sensors, measurements become very unreliable when timestep is set to 2s.
//NOTE: 10s or longer should be fine in order to get reliable results.
//NOTE: SCD30 timer does not seem to be very precise. Time variations may occur.
79
80
81
82
#  define MEASUREMENT_TIMESTEP 60 // [s] Value between 2 and 1800 (range for SCD30 sensor)

// How often should measurements be appended to CSV ?
// Set to 0 if you want to send values after each measurement
83
// WARNING: Writing too often might damage the ESP memory
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#  define CSV_INTERVAL 300 // [s]

// Residual heat from CO2 sensor seems to be high enough to change the temperature reading. How much should it be offset?
// NOTE: Sign isn't relevant. The returned temperature will always be shifted down.
#  define TEMPERATURE_OFFSET -3 // [K]

// Altitude above sea level
// Used for CO2 calibration
// here: Stuttgart, Schellingstr. 24. (Source: Google Earth)
#  define ALTITUDE_ABOVE_SEA_LEVEL 260 // [m]

// The reference CO2 concentration has to be within the range 400 ppm ≤ cref(CO2) ≤ 2000 ppm.
// Used for CO2 calibration
// here : measured concentration in Stuttgart
#  define ATMOSPHERIC_CO2_CONCENTRATION 425 // [ppm]

// Should the sensor try to calibrate itself?
// Sensirion recommends 7 days of continuous readings with at least 1 hour a day of 'fresh air' for self-calibration to complete.
102
#  define AUTO_CALIBRATE_SENSOR false // [true / false]
103
104
105
106
107
108

/**
 * LEDs
 */

// LED brightness, which can vary between min and max brightness ("LED breathing")
Eric Duminil's avatar
Eric Duminil committed
109
// MAX_BRIGHTNESS must be defined, and should be between 0 and 255.
110
#  define MAX_BRIGHTNESS 255
Eric Duminil's avatar
Eric Duminil committed
111
// MIN_BRIGHTNESS, if defined, should be between 0 and MAX_BRIGHTNESS - 1
Eric Duminil's avatar
Eric Duminil committed
112
// If MIN_BRIGHTNESS is set to MAX_BRIGHTNESS, breathing is disabled.
113
#  define MIN_BRIGHTNESS 60
Eric Duminil's avatar
Eric Duminil committed
114
// How many LEDs in the ring? 12 and 16 are currently supported.
115
#  define LED_COUNT 12
116
117

/**
118
 * MQTT
119
120
121
 */

/*
122
 * If AMPEL_MQTT is enabled, co2ampel will publish data every MQTT_SENDING_INTERVAL seconds.
123
124
125
 * An MQTT subscriber can then get the data from the corresponding broker, either encrypted or unencrypted:
 *
 *  ❯ mosquitto_sub -h 'test.mosquitto.org' -p 8883 -t 'CO2sensors/#' --cafile mosquitto.org.crt -v
126
127
 *  CO2sensors/ESPd03cc5 {"time":"2020-12-13 13:14:37+01", "co2":571, "temp":18.9, "rh":50.9}
 *  CO2sensors/ESPd03cc5 {"time":"2020-12-13 13:14:48+01", "co2":573, "temp":18.9, "rh":50.2}
128
129
130
 *  ...
 *
 *  ❯ mosquitto_sub -h 'test.mosquitto.org' -t 'CO2sensors/#' -v
131
132
 *  CO2sensors/ESPd03cc5 {"time":"2020-12-13 13:15:09+01", "co2":568, "temp":18.9, "rh":50.1}
 *  CO2sensors/ESPd03cc5 {"time":"2020-12-13 13:15:20+01", "co2":572, "temp":18.9, "rh":50.3}
133
134
135
136
137
138
139
140
141
142
143
 *  ...
 */

/*
 * Allow sensor to be configured over MQTT? Very useful for debugging. For example:
 *   mosquitto_pub -h 'test.mosquitto.org' -t 'CO2sensors/ESPe08dc9/control' -m 'timer 30'
 *   mosquitto_pub -h 'test.mosquitto.org' -t 'CO2sensors/ESPe08dc9/control' -m 'calibrate'
 *   mosquitto_pub -h 'test.mosquitto.org' -t 'CO2sensors/ESPe08dc9/control' -m 'reset'
 */
#  define ALLOW_MQTT_COMMANDS false

Eric Duminil's avatar
Eric Duminil committed
144
// How often should measurements be sent to MQTT server?
145
146
// Set to 0 if you want to send values after each measurement
// #  define MQTT_SENDING_INTERVAL MEASUREMENT_TIMESTEP * 5 // [s]
Eric Duminil's avatar
Eric Duminil committed
147
#  define MQTT_SENDING_INTERVAL 300 // [s]
148
149
#  define MQTT_SERVER "test.mosquitto.org"  // MQTT server URL or IP address
#  define MQTT_PORT 8883
Eric Duminil's avatar
Eric Duminil committed
150
#  define MQTT_ENCRYPTED true // Set to false for unencrypted MQTT (e.g. with port 1883).
151
152
#  define MQTT_USER ""
#  define MQTT_PASSWORD ""
153
#  define MQTT_TOPIC_PREFIX "CO2sensors/" // ESPxxxxxx will be added to the prefix, so complete topic will be "CO2sensors/ESPxxxxxx"
154

155
156
157
158
/**
 * LoRaWAN
 */

Eric Duminil's avatar
Eric Duminil committed
159
// 1) Requires "MCCI LoRaWAN LMIC library", which will be automatically used with PlatformIO but should be added in "Arduino IDE".
160
161
162
163
// 2) Region and transceiver type should be specified in:
//     * Arduino/libraries/MCCI_LoRaWAN_LMIC_library/project_config/lmic_project_config.h for Arduino IDE
//     * platformio.ini for PlatformIO
//    See https://github.com/mcci-catena/arduino-lmic#configuration for more information
Eric Duminil's avatar
Eric Duminil committed
164
165
// 3) It has been tested with "TTGO ESP32 SX1276 LoRa 868" and will only work with an ESP32 + LoRa modem
// 4) In order to use LoRaWAN, a gateway should be close to the co2ampel, and an account, an application and a device should be registered,
166
//      e.g. on https://www.thethingsindustries.com/docs/integrations/
Eric Duminil's avatar
Note    
Eric Duminil committed
167
//      with "Europe 863-870 MHz (SF9 for RX2 - recommended)", "MAC v1.0.3"
Eric Duminil's avatar
Eric Duminil committed
168
// 5) The corresponding keys should be defined in LORAWAN_DEVICE_EUI, LORAWAN_APPLICATION_EUI and LORAWAN_APPLICATION_KEY
169
// How often should measurements be sent over LoRaWAN?
Eric Duminil's avatar
Notes    
Eric Duminil committed
170
#  define LORAWAN_SENDING_INTERVAL 300 // [s] This value should not be too low. See https://www.thethingsnetwork.org/docs/lorawan/duty-cycle.html#maximum-duty-cycle
Eric Duminil's avatar
Eric Duminil committed
171

172
173
174
175
// WARNING: If AMPEL_LORAWAN is true, you need to modify the 3 following constants
// They are written as hexadecimal strings, and will be parsed in the correct order.

// This EUI must be in big-endian format, so most-significant-byte first.
Eric Duminil's avatar
Eric Duminil committed
176
177
// You can copy the string from TheThingsNetwork as-is, without reversing the bytes.
// For TheThingsNetwork issued EUIs the string should start with "70B3D5..."
178
#  define LORAWAN_DEVICE_EUI      "70B3D57ED004CB17"
Eric Duminil's avatar
Eric Duminil committed
179
// This should also be in big-endian format, and can be copied as is from TheThingsNetwork.
180
#  define LORAWAN_APPLICATION_EUI "0102030405060708"
Eric Duminil's avatar
Eric Duminil committed
181
// This should also be in big-endian format, and can be copied as is from TheThingsNetwork.
182
#  define LORAWAN_APPLICATION_KEY "9D06308E20B974919DA6404E063BE01D"
183

184
185
186
187
188
/**
 * NTP
 */

#  define NTP_SERVER "pool.ntp.org"
Eric Duminil's avatar
Eric Duminil committed
189
190
#  define UTC_OFFSET 1 // [h] +1 for Paris/Berlin, -5 for NYC
#  define DAYLIGHT_SAVING_TIME false // true in summer, false in winter
191
192

#endif