mirror of
https://github.com/airgradienthq/arduino.git
synced 2025-06-28 17:20:57 +02:00
Compare commits
22 Commits
Author | SHA1 | Date | |
---|---|---|---|
2e62abe2d7 | |||
7569b114bf | |||
3c1d0a862f | |||
4d883af77e | |||
e9224a5de0 | |||
af0fbadd80 | |||
79f6c040c7 | |||
f262866148 | |||
78a2a78020 | |||
3fc7e4b55e | |||
5857388c2d | |||
5770b41fd4 | |||
d85d890878 | |||
9fbd31d0c8 | |||
c5b7c43293 | |||
7550ef7b0c | |||
805546b78e | |||
59880f4be5 | |||
ee7837a471 | |||
ebbf0adf2f | |||
d9551dc560 | |||
f35bc4feaa |
@ -224,7 +224,7 @@ static void failedHandler(String msg) {
|
|||||||
static void executeCo2Calibration(void) {
|
static void executeCo2Calibration(void) {
|
||||||
/** Count down for co2CalibCountdown secs */
|
/** Count down for co2CalibCountdown secs */
|
||||||
for (int i = 0; i < SENSOR_CO2_CALIB_COUNTDOWN_MAX; i++) {
|
for (int i = 0; i < SENSOR_CO2_CALIB_COUNTDOWN_MAX; i++) {
|
||||||
displayShowText("CO2 calib", "after",
|
displayShowText("CO2 calib.", "after",
|
||||||
String(SENSOR_CO2_CALIB_COUNTDOWN_MAX - i) + " sec");
|
String(SENSOR_CO2_CALIB_COUNTDOWN_MAX - i) + " sec");
|
||||||
delay(1000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
@ -232,16 +232,16 @@ static void executeCo2Calibration(void) {
|
|||||||
if (ag.s8.setBaselineCalibration()) {
|
if (ag.s8.setBaselineCalibration()) {
|
||||||
displayShowText("Calib", "success", "");
|
displayShowText("Calib", "success", "");
|
||||||
delay(1000);
|
delay(1000);
|
||||||
displayShowText("Wait for", "finish", "...");
|
displayShowText("Wait to", "complete", "...");
|
||||||
int count = 0;
|
int count = 0;
|
||||||
while (ag.s8.isBaseLineCalibrationDone() == false) {
|
while (ag.s8.isBaseLineCalibrationDone() == false) {
|
||||||
delay(1000);
|
delay(1000);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
displayShowText("Finish", "after", String(count) + " sec");
|
displayShowText("Finished", "after", String(count) + " sec");
|
||||||
delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
|
delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
|
||||||
} else {
|
} else {
|
||||||
displayShowText("Calib", "failure!!!", "");
|
displayShowText("Calibration", "failure", "");
|
||||||
delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
|
delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,8 +152,6 @@ void setup() {
|
|||||||
}
|
}
|
||||||
Serial.println("Detected " + ag->getBoardName());
|
Serial.println("Detected " + ag->getBoardName());
|
||||||
|
|
||||||
/** Init sensor */
|
|
||||||
boardInit();
|
|
||||||
configuration.setAirGradient(ag);
|
configuration.setAirGradient(ag);
|
||||||
oledDisplay.setAirGradient(ag);
|
oledDisplay.setAirGradient(ag);
|
||||||
stateMachine.setAirGradient(ag);
|
stateMachine.setAirGradient(ag);
|
||||||
@ -162,11 +160,13 @@ void setup() {
|
|||||||
openMetrics.setAirGradient(ag);
|
openMetrics.setAirGradient(ag);
|
||||||
localServer.setAirGraident(ag);
|
localServer.setAirGraident(ag);
|
||||||
|
|
||||||
|
/** Init sensor */
|
||||||
|
boardInit();
|
||||||
|
|
||||||
/** Connecting wifi */
|
/** Connecting wifi */
|
||||||
bool connectToWifi = false;
|
bool connectToWifi = false;
|
||||||
if (ag->isOne()) {
|
if (ag->isOne()) {
|
||||||
if (ledBarButtonTest) {
|
if (ledBarButtonTest) {
|
||||||
stateMachine.executeLedBarPowerUpTest();
|
|
||||||
if (ag->button.getState() == PushButton::BUTTON_PRESSED) {
|
if (ag->button.getState() == PushButton::BUTTON_PRESSED) {
|
||||||
WiFi.begin("airgradient", "cleanair");
|
WiFi.begin("airgradient", "cleanair");
|
||||||
Serial.println("WiFi Credential reset to factory defaults");
|
Serial.println("WiFi Credential reset to factory defaults");
|
||||||
@ -219,15 +219,20 @@ void setup() {
|
|||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
// ota not supported
|
// ota not supported
|
||||||
#else
|
#else
|
||||||
// otaHandler.updateFirmwareIfOutdated(ag->deviceId());
|
otaHandler.updateFirmwareIfOutdated(ag->deviceId());
|
||||||
|
|
||||||
|
/** Update first OTA */
|
||||||
|
measurements.otaBootCount = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
apiClient.fetchServerConfiguration();
|
apiClient.fetchServerConfiguration();
|
||||||
configSchedule.update();
|
configSchedule.update();
|
||||||
if (apiClient.isFetchConfigureFailed()) {
|
if (apiClient.isFetchConfigureFailed()) {
|
||||||
if (ag->isOne()) {
|
if (ag->isOne()) {
|
||||||
stateMachine.displayHandle(
|
if (apiClient.isNotAvailableOnDashboard()) {
|
||||||
AgStateMachineWiFiOkServerOkSensorConfigFailed);
|
stateMachine.displayHandle(
|
||||||
|
AgStateMachineWiFiOkServerOkSensorConfigFailed);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
stateMachine.handleLeds(
|
stateMachine.handleLeds(
|
||||||
AgStateMachineWiFiOkServerOkSensorConfigFailed);
|
AgStateMachineWiFiOkServerOkSensorConfigFailed);
|
||||||
@ -235,6 +240,9 @@ void setup() {
|
|||||||
} else {
|
} else {
|
||||||
ledBarEnabledUpdate();
|
ledBarEnabledUpdate();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
oledDisplay.showRebooting();
|
||||||
|
delay(2500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -459,9 +467,10 @@ static void ledBarEnabledUpdate(void) {
|
|||||||
if ((brightness == 0) || (configuration.getLedBarMode() == LedBarModeOff)) {
|
if ((brightness == 0) || (configuration.getLedBarMode() == LedBarModeOff)) {
|
||||||
ag->ledBar.setEnable(false);
|
ag->ledBar.setEnable(false);
|
||||||
} else {
|
} else {
|
||||||
ag->ledBar.setBrighness(brightness);
|
ag->ledBar.setBrightness(brightness);
|
||||||
ag->ledBar.setEnable(configuration.getLedBarMode() != LedBarModeOff);
|
ag->ledBar.setEnable(configuration.getLedBarMode() != LedBarModeOff);
|
||||||
}
|
}
|
||||||
|
ag->ledBar.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -615,6 +624,23 @@ static void oneIndoorInit(void) {
|
|||||||
ag->button.begin();
|
ag->button.begin();
|
||||||
ag->watchdog.begin();
|
ag->watchdog.begin();
|
||||||
|
|
||||||
|
/** Run LED test on start up if button pressed */
|
||||||
|
oledDisplay.setText("Press now for", "LED test", "");
|
||||||
|
ledBarButtonTest = false;
|
||||||
|
uint32_t stime = millis();
|
||||||
|
while (true) {
|
||||||
|
if (ag->button.getState() == ag->button.BUTTON_PRESSED) {
|
||||||
|
ledBarButtonTest = true;
|
||||||
|
stateMachine.executeLedBarPowerUpTest();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
delay(1);
|
||||||
|
uint32_t ms = (uint32_t)(millis() - stime);
|
||||||
|
if (ms >= 3000) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Init sensor SGP41 */
|
/** Init sensor SGP41 */
|
||||||
if (sgp41Init() == false) {
|
if (sgp41Init() == false) {
|
||||||
dispSensorNotFound("SGP41");
|
dispSensorNotFound("SGP41");
|
||||||
@ -641,22 +667,6 @@ static void oneIndoorInit(void) {
|
|||||||
|
|
||||||
dispSensorNotFound("PMS");
|
dispSensorNotFound("PMS");
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Run LED test on start up */
|
|
||||||
oledDisplay.setText("Press now for", "LED test", "");
|
|
||||||
ledBarButtonTest = false;
|
|
||||||
uint32_t stime = millis();
|
|
||||||
while (true) {
|
|
||||||
if (ag->button.getState() == ag->button.BUTTON_PRESSED) {
|
|
||||||
ledBarButtonTest = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
delay(1);
|
|
||||||
uint32_t ms = (uint32_t)(millis() - stime);
|
|
||||||
if (ms >= 3000) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
static void openAirInit(void) {
|
static void openAirInit(void) {
|
||||||
configuration.hasSensorSHT = false;
|
configuration.hasSensorSHT = false;
|
||||||
@ -804,10 +814,6 @@ static void configUpdateHandle() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ag->isOne()) {
|
|
||||||
ledBarEnabledUpdate();
|
|
||||||
stateMachine.executeLedBarTest();
|
|
||||||
}
|
|
||||||
stateMachine.executeCo2Calibration();
|
stateMachine.executeCo2Calibration();
|
||||||
|
|
||||||
String mqttUri = configuration.getMqttBrokerUri();
|
String mqttUri = configuration.getMqttBrokerUri();
|
||||||
@ -843,15 +849,36 @@ static void configUpdateHandle() {
|
|||||||
|
|
||||||
if (ag->isOne()) {
|
if (ag->isOne()) {
|
||||||
if (configuration.isLedBarBrightnessChanged()) {
|
if (configuration.isLedBarBrightnessChanged()) {
|
||||||
ag->ledBar.setBrighness(configuration.getLedBarBrightness());
|
if (configuration.getLedBarBrightness() == 0) {
|
||||||
Serial.println("Set 'LedBarBrightness' brightness: " +
|
ag->ledBar.setEnable(false);
|
||||||
String(configuration.getLedBarBrightness()));
|
} else {
|
||||||
|
if (configuration.getLedBarMode() != LedBarMode::LedBarModeOff) {
|
||||||
|
ag->ledBar.setEnable(true);
|
||||||
|
}
|
||||||
|
ag->ledBar.setBrightness(configuration.getLedBarBrightness());
|
||||||
|
}
|
||||||
|
ag->ledBar.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (configuration.isLedBarModeChanged()) {
|
||||||
|
if (configuration.getLedBarBrightness() == 0) {
|
||||||
|
ag->ledBar.setEnable(false);
|
||||||
|
} else {
|
||||||
|
if(configuration.getLedBarMode() == LedBarMode::LedBarModeOff) {
|
||||||
|
ag->ledBar.setEnable(false);
|
||||||
|
} else {
|
||||||
|
ag->ledBar.setEnable(true);
|
||||||
|
ag->ledBar.setBrightness(configuration.getLedBarBrightness());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ag->ledBar.show();
|
||||||
|
}
|
||||||
|
|
||||||
if (configuration.isDisplayBrightnessChanged()) {
|
if (configuration.isDisplayBrightnessChanged()) {
|
||||||
oledDisplay.setBrightness(configuration.getDisplayBrightness());
|
oledDisplay.setBrightness(configuration.getDisplayBrightness());
|
||||||
Serial.println("Set 'DisplayBrightness' brightness: " +
|
|
||||||
String(configuration.getDisplayBrightness()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stateMachine.executeLedBarTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
fwNewVersion = configuration.newFirmwareVersion();
|
fwNewVersion = configuration.newFirmwareVersion();
|
||||||
@ -861,7 +888,9 @@ static void configUpdateHandle() {
|
|||||||
doOta = true;
|
doOta = true;
|
||||||
Serial.println("First OTA");
|
Serial.println("First OTA");
|
||||||
} else {
|
} else {
|
||||||
if ((measurements.bootCount - measurements.otaBootCount) >= 30) {
|
/** Only check for update each 1h*/
|
||||||
|
const float otaBootCount = 60.0f / (SERVER_SYNC_INTERVAL / 60000.0f);
|
||||||
|
if ((measurements.bootCount - measurements.otaBootCount) >= (int)otaBootCount) {
|
||||||
doOta = true;
|
doOta = true;
|
||||||
} else {
|
} else {
|
||||||
Serial.println(
|
Serial.println(
|
||||||
|
@ -69,11 +69,17 @@ bool AgApiClient::fetchServerConfiguration(void) {
|
|||||||
if (retCode != 200) {
|
if (retCode != 200) {
|
||||||
client.end();
|
client.end();
|
||||||
getConfigFailed = true;
|
getConfigFailed = true;
|
||||||
|
|
||||||
|
/** Return code 400 mean device not setup on cloud. */
|
||||||
|
if (retCode == 400) {
|
||||||
|
notAvailableOnDashboard = true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** clear failed */
|
/** clear failed */
|
||||||
getConfigFailed = false;
|
getConfigFailed = false;
|
||||||
|
notAvailableOnDashboard = false;
|
||||||
|
|
||||||
/** Get response string */
|
/** Get response string */
|
||||||
String respContent = client.getString();
|
String respContent = client.getString();
|
||||||
@ -144,6 +150,17 @@ bool AgApiClient::isFetchConfigureFailed(void) { return getConfigFailed; }
|
|||||||
*/
|
*/
|
||||||
bool AgApiClient::isPostToServerFailed(void) { return postToServerFailed; }
|
bool AgApiClient::isPostToServerFailed(void) { return postToServerFailed; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get status device has available on dashboard or not. should get after
|
||||||
|
* fetch configuration return failed
|
||||||
|
*
|
||||||
|
* @return true
|
||||||
|
* @return false
|
||||||
|
*/
|
||||||
|
bool AgApiClient::isNotAvailableOnDashboard(void) {
|
||||||
|
return notAvailableOnDashboard;
|
||||||
|
}
|
||||||
|
|
||||||
void AgApiClient::setAirGradient(AirGradient *ag) { this->ag = ag; }
|
void AgApiClient::setAirGradient(AirGradient *ag) { this->ag = ag; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,6 +23,7 @@ private:
|
|||||||
|
|
||||||
bool getConfigFailed;
|
bool getConfigFailed;
|
||||||
bool postToServerFailed;
|
bool postToServerFailed;
|
||||||
|
bool notAvailableOnDashboard = false; // Device not setup on Airgradient cloud dashboard.
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AgApiClient(Stream &stream, Configuration &config);
|
AgApiClient(Stream &stream, Configuration &config);
|
||||||
@ -33,6 +34,7 @@ public:
|
|||||||
bool postToServer(String data);
|
bool postToServer(String data);
|
||||||
bool isFetchConfigureFailed(void);
|
bool isFetchConfigureFailed(void);
|
||||||
bool isPostToServerFailed(void);
|
bool isPostToServerFailed(void);
|
||||||
|
bool isNotAvailableOnDashboard(void);
|
||||||
void setAirGradient(AirGradient *ag);
|
void setAirGradient(AirGradient *ag);
|
||||||
bool sendPing(int rssi, int bootCount);
|
bool sendPing(int rssi, int bootCount);
|
||||||
};
|
};
|
||||||
|
@ -372,6 +372,7 @@ bool Configuration::parse(String data, bool isLocal) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_ledBarModeChanged = false;
|
||||||
if (JSON.typeof_(root[jprop_ledBarMode]) == "string") {
|
if (JSON.typeof_(root[jprop_ledBarMode]) == "string") {
|
||||||
String mode = root[jprop_ledBarMode];
|
String mode = root[jprop_ledBarMode];
|
||||||
if (mode == getLedBarModeName(LedBarMode::LedBarModeCO2) ||
|
if (mode == getLedBarModeName(LedBarMode::LedBarModeCO2) ||
|
||||||
@ -380,6 +381,7 @@ bool Configuration::parse(String data, bool isLocal) {
|
|||||||
String oldMode = jconfig[jprop_ledBarMode];
|
String oldMode = jconfig[jprop_ledBarMode];
|
||||||
if (mode != oldMode) {
|
if (mode != oldMode) {
|
||||||
jconfig[jprop_ledBarMode] = mode;
|
jconfig[jprop_ledBarMode] = mode;
|
||||||
|
_ledBarModeChanged = true;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -559,6 +561,7 @@ bool Configuration::parse(String data, bool isLocal) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ledBarBrightnessChanged = false;
|
||||||
if (JSON.typeof_(root[jprop_ledBarBrightness]) == "number") {
|
if (JSON.typeof_(root[jprop_ledBarBrightness]) == "number") {
|
||||||
int value = root[jprop_ledBarBrightness];
|
int value = root[jprop_ledBarBrightness];
|
||||||
int oldValue = jconfig[jprop_ledBarBrightness];
|
int oldValue = jconfig[jprop_ledBarBrightness];
|
||||||
@ -628,7 +631,6 @@ bool Configuration::parse(String data, bool isLocal) {
|
|||||||
saveConfig();
|
saveConfig();
|
||||||
printConfig();
|
printConfig();
|
||||||
} else {
|
} else {
|
||||||
logInfo("Update ignored due to local unofficial changes");
|
|
||||||
if (ledBarTestRequested || co2CalibrationRequested) {
|
if (ledBarTestRequested || co2CalibrationRequested) {
|
||||||
udpated = true;
|
udpated = true;
|
||||||
}
|
}
|
||||||
@ -1148,6 +1150,12 @@ void Configuration::setOfflineModeWithoutSave(bool offline) {
|
|||||||
_offlineMode = offline;
|
_offlineMode = offline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Configuration::isLedBarModeChanged(void) {
|
||||||
|
bool changed = _ledBarModeChanged;
|
||||||
|
_ledBarModeChanged = false;
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
bool Configuration::isDisplayBrightnessChanged(void) {
|
bool Configuration::isDisplayBrightnessChanged(void) {
|
||||||
bool changed = displayBrightnessChanged;
|
bool changed = displayBrightnessChanged;
|
||||||
displayBrightnessChanged = false;
|
displayBrightnessChanged = false;
|
||||||
|
@ -18,6 +18,7 @@ private:
|
|||||||
bool displayBrightnessChanged = false;
|
bool displayBrightnessChanged = false;
|
||||||
String otaNewFirmwareVersion;
|
String otaNewFirmwareVersion;
|
||||||
bool _offlineMode = false;
|
bool _offlineMode = false;
|
||||||
|
bool _ledBarModeChanged = false;
|
||||||
|
|
||||||
AirGradient* ag;
|
AirGradient* ag;
|
||||||
|
|
||||||
@ -80,6 +81,7 @@ public:
|
|||||||
bool isOfflineMode(void);
|
bool isOfflineMode(void);
|
||||||
void setOfflineMode(bool offline);
|
void setOfflineMode(bool offline);
|
||||||
void setOfflineModeWithoutSave(bool offline);
|
void setOfflineModeWithoutSave(bool offline);
|
||||||
|
bool isLedBarModeChanged(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /** _AG_CONFIG_H_ */
|
#endif /** _AG_CONFIG_H_ */
|
||||||
|
@ -384,3 +384,13 @@ void OledDisplay::showNewFirmwareFailed(void) {
|
|||||||
setCentralText(60, String("Retry after 24h"));
|
setCentralText(60, String("Retry after 24h"));
|
||||||
} while (DISP()->nextPage());
|
} while (DISP()->nextPage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OledDisplay::showRebooting(void) {
|
||||||
|
DISP()->firstPage();
|
||||||
|
do {
|
||||||
|
DISP()->setFont(u8g2_font_t0_16_tf);
|
||||||
|
// setCentralText(20, "Firmware Update");
|
||||||
|
setCentralText(40, "Rebooting...");
|
||||||
|
// setCentralText(60, String("Retry after 24h"));
|
||||||
|
} while (DISP()->nextPage());
|
||||||
|
}
|
||||||
|
@ -40,6 +40,7 @@ public:
|
|||||||
void showNewFirmwareUpdating(String percent);
|
void showNewFirmwareUpdating(String percent);
|
||||||
void showNewFirmwareSuccess(String count);
|
void showNewFirmwareSuccess(String count);
|
||||||
void showNewFirmwareFailed(void);
|
void showNewFirmwareFailed(void);
|
||||||
|
void showRebooting(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /** _AG_OLED_DISPLAY_H_ */
|
#endif /** _AG_OLED_DISPLAY_H_ */
|
||||||
|
@ -173,7 +173,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
|
|||||||
root["noxRaw"] = this->NOxRaw;
|
root["noxRaw"] = this->NOxRaw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
root["bootCount"] = bootCount;
|
root["boot"] = bootCount;
|
||||||
|
|
||||||
if (localServer) {
|
if (localServer) {
|
||||||
root["ledMode"] = config->getLedBarModeName();
|
root["ledMode"] = config->getLedBarModeName();
|
||||||
|
@ -64,7 +64,7 @@ void LedBar::setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum) {
|
|||||||
*
|
*
|
||||||
* @param brightness Brightness (0 - 100)%
|
* @param brightness Brightness (0 - 100)%
|
||||||
*/
|
*/
|
||||||
void LedBar::setBrighness(uint8_t brightness) {
|
void LedBar::setBrightness(uint8_t brightness) {
|
||||||
if (this->isBegin() == false) {
|
if (this->isBegin() == false) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ public:
|
|||||||
void begin(void);
|
void begin(void);
|
||||||
void setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum);
|
void setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum);
|
||||||
void setColor(uint8_t red, uint8_t green, uint8_t blue);
|
void setColor(uint8_t red, uint8_t green, uint8_t blue);
|
||||||
void setBrighness(uint8_t brightness);
|
void setBrightness(uint8_t brightness);
|
||||||
int getNumberOfLeds(void);
|
int getNumberOfLeds(void);
|
||||||
void show(void);
|
void show(void);
|
||||||
void clear(void);
|
void clear(void);
|
||||||
|
Reference in New Issue
Block a user