add support for SHT31 sensor (untested), Add PWM frequency config in system settings
This commit is contained in:
parent
5df2d0f4ab
commit
9585bec612
7 changed files with 121 additions and 21 deletions
|
@ -38,6 +38,11 @@
|
||||||
// DHT support dropped
|
// DHT support dropped
|
||||||
// https://github.com/adafruit/DHT-sensor-library
|
// https://github.com/adafruit/DHT-sensor-library
|
||||||
// #include "DHT.h"
|
// #include "DHT.h"
|
||||||
|
// SHT30/31
|
||||||
|
// https://github.com/adafruit/Adafruit_SHT31/
|
||||||
|
#include "Adafruit_SHT31.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CanGrow header files
|
* CanGrow header files
|
||||||
|
@ -80,9 +85,6 @@ void setup() {
|
||||||
// set FAN2 to off with digitalWrite LOW
|
// set FAN2 to off with digitalWrite LOW
|
||||||
analogWrite(PinFAN2, PinFAN2PWM);
|
analogWrite(PinFAN2, PinFAN2PWM);
|
||||||
|
|
||||||
// set PWM frequency to 13.37KHz
|
|
||||||
analogWriteFreq(13370);
|
|
||||||
|
|
||||||
// Start EEPROM
|
// Start EEPROM
|
||||||
EEPROM.begin(512);
|
EEPROM.begin(512);
|
||||||
|
|
||||||
|
@ -132,6 +134,22 @@ void setup() {
|
||||||
Serial.println("!! Cannot find BME280 on I2C bus. Please check connection or ID");
|
Serial.println("!! Cannot find BME280 on I2C bus. Please check connection or ID");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// initialise SHT31
|
||||||
|
Serial.println(":: initialise SHT31 sensor ::");
|
||||||
|
if (! sht31.begin(0x44)) { // Set to 0x45 for alternate i2c addr
|
||||||
|
Serial.println("Couldn't find SHT31");
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print("SHT31 Heater Enabled State: ");
|
||||||
|
if (sht31.isHeaterEnabled())
|
||||||
|
Serial.println("ENABLED");
|
||||||
|
else
|
||||||
|
Serial.println("DISABLED");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Serial.println("To wipe the EEPROM saved data, set D4 (PinWIPE) to LOW - NOW! (2 seconds left)");
|
Serial.println("To wipe the EEPROM saved data, set D4 (PinWIPE) to LOW - NOW! (2 seconds left)");
|
||||||
// wait a few seconds to let the user pull D4 down to wipe EEPROM
|
// wait a few seconds to let the user pull D4 down to wipe EEPROM
|
||||||
// and we can enjoy the boot screen meanwhile :p
|
// and we can enjoy the boot screen meanwhile :p
|
||||||
|
@ -198,12 +216,16 @@ void setup() {
|
||||||
display.display();
|
display.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
// at the end of setup, set the outputs
|
// at the end of setup, set the outputs, when configured true
|
||||||
// we do this here because otherwise on inverted
|
// we do this here because otherwise on inverted
|
||||||
// boards like CanGrow PCB v0.6 it would be turned on
|
// boards like CanGrow PCB v0.6 it would be turned on
|
||||||
pinMode(PinLED, OUTPUT);
|
if(configured == true) {
|
||||||
pinMode(PinPUMP, OUTPUT);
|
pinMode(PinLED, OUTPUT);
|
||||||
pinMode(PinFAN, OUTPUT);
|
pinMode(PinPUMP, OUTPUT);
|
||||||
|
pinMode(PinFAN, OUTPUT);
|
||||||
|
// set PWM frequency
|
||||||
|
analogWriteFreq(PWMFrequency);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,8 @@ bool UseLEDrelais;
|
||||||
bool UseFANrelais;
|
bool UseFANrelais;
|
||||||
// Which temperature sensor to use?
|
// Which temperature sensor to use?
|
||||||
byte TemperatureSensor_Type;
|
byte TemperatureSensor_Type;
|
||||||
|
// which humidity sensor to use
|
||||||
|
byte HumiditySensor_Type;
|
||||||
unsigned short MaintenanceDuration = 300;
|
unsigned short MaintenanceDuration = 300;
|
||||||
char Esp32CamIP[16];
|
char Esp32CamIP[16];
|
||||||
// PumpLastOn (long) timestamp
|
// PumpLastOn (long) timestamp
|
||||||
|
@ -112,6 +114,7 @@ unsigned long PumpLastOn;
|
||||||
bool OutputInvert;
|
bool OutputInvert;
|
||||||
unsigned short SoilmoistureWet;
|
unsigned short SoilmoistureWet;
|
||||||
unsigned short SoilmoistureDry;
|
unsigned short SoilmoistureDry;
|
||||||
|
unsigned short PWMFrequency = 13370;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -141,9 +144,9 @@ byte SunriseHour = 7;
|
||||||
byte SunriseMinute = 0;
|
byte SunriseMinute = 0;
|
||||||
// PinLEDPWM - contains the PWM value for dimming the grow light
|
// PinLEDPWM - contains the PWM value for dimming the grow light
|
||||||
// default is 255 to ensure it is just on for the case UseLEDrelais is true
|
// default is 255 to ensure it is just on for the case UseLEDrelais is true
|
||||||
byte PinLEDPWM = 0;
|
byte PinLEDPWM = 255;
|
||||||
byte PinFANPWM = 0;
|
byte PinFANPWM = 255;
|
||||||
byte PinFAN2PWM = 0;
|
byte PinFAN2PWM = 255;
|
||||||
|
|
||||||
// fade in and out sunrise and sunset?
|
// fade in and out sunrise and sunset?
|
||||||
bool SunFade;
|
bool SunFade;
|
||||||
|
|
|
@ -14,6 +14,14 @@
|
||||||
#define SEALEVELPRESSURE_HPA (1013.25)
|
#define SEALEVELPRESSURE_HPA (1013.25)
|
||||||
Adafruit_BME280 bme;
|
Adafruit_BME280 bme;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SHT30/31 Stuff
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool enableHeater = false;
|
||||||
|
Adafruit_SHT31 sht31 = Adafruit_SHT31();
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Chirp functions
|
* Chirp functions
|
||||||
|
@ -97,6 +105,7 @@ float getTemperature(byte tempSensor) {
|
||||||
* ==========
|
* ==========
|
||||||
* 1 : DHT11 temp sensor
|
* 1 : DHT11 temp sensor
|
||||||
* 2 : chirp I2C temp sensor
|
* 2 : chirp I2C temp sensor
|
||||||
|
* 3 : SHT31
|
||||||
*/
|
*/
|
||||||
|
|
||||||
float temperature = 0;
|
float temperature = 0;
|
||||||
|
@ -113,6 +122,10 @@ float getTemperature(byte tempSensor) {
|
||||||
// read temperature from chrip I2C
|
// read temperature from chrip I2C
|
||||||
temperature = readI2CRegister16bit(0x20, 5) * 0.10 ;
|
temperature = readI2CRegister16bit(0x20, 5) * 0.10 ;
|
||||||
break;
|
break;
|
||||||
|
case 3:
|
||||||
|
// read temp from SHT31
|
||||||
|
temperature = sht31.readTemperature();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// if sensor type is not recognized, return 99
|
// if sensor type is not recognized, return 99
|
||||||
temperature = 99.99;
|
temperature = 99.99;
|
||||||
|
@ -121,10 +134,30 @@ float getTemperature(byte tempSensor) {
|
||||||
return temperature;
|
return temperature;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getHumidity() {
|
float getHumidity(byte HumSensor) {
|
||||||
// dht support dropped
|
|
||||||
|
/*
|
||||||
|
* sensors:
|
||||||
|
* 1: BME280
|
||||||
|
* 2: SHT31
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float humidity;
|
||||||
|
|
||||||
|
switch(HumSensor) {
|
||||||
|
case 1:
|
||||||
|
humidity = bme.readHumidity();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
humidity = sht31.readHumidity();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
humidity = 0.0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// return dht.readHumidity();
|
// return dht.readHumidity();
|
||||||
return bme.readHumidity();
|
return humidity;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getSoilmoisture(byte moistureSensor, bool returnRAW = false) {
|
int getSoilmoisture(byte moistureSensor, bool returnRAW = false) {
|
||||||
|
|
|
@ -111,7 +111,9 @@ bool loadEEPROM() {
|
||||||
* 244 SoilmoistureWet (2 byte)
|
* 244 SoilmoistureWet (2 byte)
|
||||||
* 246 SoilmoistureDry (2 byte)
|
* 246 SoilmoistureDry (2 byte)
|
||||||
* 248 PinFAN2PWM (1 byte)
|
* 248 PinFAN2PWM (1 byte)
|
||||||
* 249 ...
|
* 249 HumiditySensor_Type (1 byte)
|
||||||
|
* 250 PWMFrequency (2 byte)
|
||||||
|
* 252 ...
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -183,6 +185,8 @@ bool loadEEPROM() {
|
||||||
EEPROM.get(244, SoilmoistureWet);
|
EEPROM.get(244, SoilmoistureWet);
|
||||||
// size is 1 byte
|
// size is 1 byte
|
||||||
EEPROM.get(246, SoilmoistureDry);
|
EEPROM.get(246, SoilmoistureDry);
|
||||||
|
// size is 1 byte
|
||||||
|
EEPROM.get(249, HumiditySensor_Type);
|
||||||
}
|
}
|
||||||
// TODO auth does not work atm
|
// TODO auth does not work atm
|
||||||
// EEPROM.get(160, WebUiUsername);
|
// EEPROM.get(160, WebUiUsername);
|
||||||
|
@ -223,6 +227,8 @@ bool loadEEPROM() {
|
||||||
EEPROM.get(242, PumpIntervalBloom);
|
EEPROM.get(242, PumpIntervalBloom);
|
||||||
// size is 1 byte
|
// size is 1 byte
|
||||||
EEPROM.get(248, PinFAN2PWM);
|
EEPROM.get(248, PinFAN2PWM);
|
||||||
|
// size is 2 byte
|
||||||
|
EEPROM.get(250, PWMFrequency);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,6 +275,11 @@ bool loadEEPROM() {
|
||||||
Serial.println(SoilmoistureWet);
|
Serial.println(SoilmoistureWet);
|
||||||
Serial.print("SoilmoistureDry: ");
|
Serial.print("SoilmoistureDry: ");
|
||||||
Serial.println(SoilmoistureDry);
|
Serial.println(SoilmoistureDry);
|
||||||
|
Serial.print("HumiditySensor_Type: ");
|
||||||
|
Serial.println(HumiditySensor_Type);
|
||||||
|
Serial.print("PWMFrequency: ");
|
||||||
|
Serial.println(PWMFrequency);
|
||||||
|
|
||||||
|
|
||||||
Serial.println("---- Grow values ----");
|
Serial.println("---- Grow values ----");
|
||||||
Serial.print("GrowName: ");
|
Serial.print("GrowName: ");
|
||||||
|
@ -547,7 +558,7 @@ void refreshSensors() {
|
||||||
byte soilmoistureAvgSampleCount = 5;
|
byte soilmoistureAvgSampleCount = 5;
|
||||||
|
|
||||||
valSoilmoisture = getSoilmoisture(MoistureSensor_Type);
|
valSoilmoisture = getSoilmoisture(MoistureSensor_Type);
|
||||||
valHumidity = getHumidity();
|
valHumidity = getHumidity(HumiditySensor_Type);
|
||||||
valTemperature = getTemperature(TemperatureSensor_Type);
|
valTemperature = getTemperature(TemperatureSensor_Type);
|
||||||
valWaterlevel = getWaterlevel();
|
valWaterlevel = getWaterlevel();
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* CanGrow_Version.h gets generated from cangrow.sh */
|
/* CanGrow_Version.h gets generated from cangrow.sh */
|
||||||
|
|
||||||
const char* CanGrowVer = "0.1-dev";
|
const char* CanGrowVer = "0.1-dev";
|
||||||
const char* CanGrowBuild = "61c7af5-20241208140924";
|
const char* CanGrowBuild = "5df2d0f-20241208233808";
|
||||||
|
|
||||||
|
|
|
@ -668,6 +668,16 @@ void WEBsystemSettings() {
|
||||||
}
|
}
|
||||||
body += "<option value='1'" + returnStrSelected(TemperatureSensor_Type, 1) + ">I2C BME280</option>\n";
|
body += "<option value='1'" + returnStrSelected(TemperatureSensor_Type, 1) + ">I2C BME280</option>\n";
|
||||||
body += "<option value='2'" + returnStrSelected(TemperatureSensor_Type, 2) + ">I2C Chirp</option>\n";
|
body += "<option value='2'" + returnStrSelected(TemperatureSensor_Type, 2) + ">I2C Chirp</option>\n";
|
||||||
|
body += "<option value='2'" + returnStrSelected(TemperatureSensor_Type, 3) + ">I2C SHT31</option>\n";
|
||||||
|
body += "</select><br>\n";
|
||||||
|
|
||||||
|
// HumiditySensor_Type byte
|
||||||
|
body += "Humidity sensor: <select id='HumiditySensor_Type' name='HumiditySensor_Type' required>\n";
|
||||||
|
if(configured == false) {
|
||||||
|
body += "<option disabled value='' selected hidden>---</option>\n";
|
||||||
|
}
|
||||||
|
body += "<option value='1'" + returnStrSelected(HumiditySensor_Type, 1) + ">I2C BME280</option>\n";
|
||||||
|
body += "<option value='2'" + returnStrSelected(HumiditySensor_Type, 2) + ">I2C SHT31</option>\n";
|
||||||
body += "</select><br>\n";
|
body += "</select><br>\n";
|
||||||
|
|
||||||
// NtpOffset int
|
// NtpOffset int
|
||||||
|
@ -679,6 +689,10 @@ void WEBsystemSettings() {
|
||||||
body += MaintenanceDuration;
|
body += MaintenanceDuration;
|
||||||
body += "' required> Seconds<br>\n";
|
body += "' required> Seconds<br>\n";
|
||||||
|
|
||||||
|
// PWMFrequency short
|
||||||
|
body += "PWM Frequency: <input type='number' name='PWMFrequency' min='0' max='20000' value='";
|
||||||
|
body += PWMFrequency;
|
||||||
|
body += "' required> Hz<br>\n";
|
||||||
|
|
||||||
body += "ESP32-Cam IP (optional): <input type='text' name='Esp32CamIP' maxlength='16' value='";
|
body += "ESP32-Cam IP (optional): <input type='text' name='Esp32CamIP' maxlength='16' value='";
|
||||||
body += Esp32CamIP;
|
body += Esp32CamIP;
|
||||||
|
@ -864,6 +878,8 @@ void POSTsystemSettings() {
|
||||||
|
|
||||||
unsigned short UseLEDrelais_old = UseLEDrelais;
|
unsigned short UseLEDrelais_old = UseLEDrelais;
|
||||||
unsigned short UseFANrelais_old = UseFANrelais;
|
unsigned short UseFANrelais_old = UseFANrelais;
|
||||||
|
unsigned short PWMFrequency_old = PWMFrequency;
|
||||||
|
|
||||||
NtpOffset = webserver.arg("NtpOffset").toInt();
|
NtpOffset = webserver.arg("NtpOffset").toInt();
|
||||||
MoistureSensor_Type = webserver.arg("MoistureSensor_Type").toInt();
|
MoistureSensor_Type = webserver.arg("MoistureSensor_Type").toInt();
|
||||||
SoilmoistureLow = webserver.arg("SoilmoistureLow").toInt();
|
SoilmoistureLow = webserver.arg("SoilmoistureLow").toInt();
|
||||||
|
@ -879,8 +895,16 @@ void POSTsystemSettings() {
|
||||||
OutputInvert = webserver.arg("OutputInvert").toInt();
|
OutputInvert = webserver.arg("OutputInvert").toInt();
|
||||||
SoilmoistureWet = webserver.arg("SoilmoistureWet").toInt();
|
SoilmoistureWet = webserver.arg("SoilmoistureWet").toInt();
|
||||||
SoilmoistureDry = webserver.arg("SoilmoistureDry").toInt();
|
SoilmoistureDry = webserver.arg("SoilmoistureDry").toInt();
|
||||||
|
HumiditySensor_Type = webserver.arg("HumiditySensor_Type").toInt();
|
||||||
|
PWMFrequency = webserver.arg("PWMFrequency").toInt();
|
||||||
|
|
||||||
configured = true;
|
// when configured is false, set it to true and ensure outputs are set
|
||||||
|
if(configured == false) {
|
||||||
|
configured = true;
|
||||||
|
pinMode(PinLED, OUTPUT);
|
||||||
|
pinMode(PinPUMP, OUTPUT);
|
||||||
|
pinMode(PinFAN, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
// size is 1 byte
|
// size is 1 byte
|
||||||
EEPROM.put(161, configured);
|
EEPROM.put(161, configured);
|
||||||
|
@ -907,6 +931,8 @@ void POSTsystemSettings() {
|
||||||
EEPROM.put(243, OutputInvert);
|
EEPROM.put(243, OutputInvert);
|
||||||
EEPROM.put(244, SoilmoistureWet);
|
EEPROM.put(244, SoilmoistureWet);
|
||||||
EEPROM.put(246, SoilmoistureDry);
|
EEPROM.put(246, SoilmoistureDry);
|
||||||
|
EEPROM.put(249, HumiditySensor_Type);
|
||||||
|
EEPROM.put(250, PWMFrequency);
|
||||||
|
|
||||||
// write data to EEPROM
|
// write data to EEPROM
|
||||||
EEPROM.commit();
|
EEPROM.commit();
|
||||||
|
@ -935,6 +961,11 @@ void POSTsystemSettings() {
|
||||||
Serial.println("UseFANrelais is 0, forcing PinFANPWM to max to prevent relais damage and ensure its turned on");
|
Serial.println("UseFANrelais is 0, forcing PinFANPWM to max to prevent relais damage and ensure its turned on");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(PWMFrequency != PWMFrequency_old) {
|
||||||
|
// if PWM freq changed, apply new settings
|
||||||
|
analogWriteFreq(PWMFrequency);
|
||||||
|
}
|
||||||
|
|
||||||
Serial.print("configured: ");
|
Serial.print("configured: ");
|
||||||
Serial.println(configured);
|
Serial.println(configured);
|
||||||
Serial.print("UseFan: ");
|
Serial.print("UseFan: ");
|
||||||
|
@ -1171,7 +1202,7 @@ void APIgetDebug() {
|
||||||
|
|
||||||
// BME280
|
// BME280
|
||||||
objSensors["bme280"]["temperature"] = getTemperature(1);
|
objSensors["bme280"]["temperature"] = getTemperature(1);
|
||||||
objSensors["bme280"]["humidity"] = getHumidity();
|
objSensors["bme280"]["humidity"] = getHumidity(1);
|
||||||
objSensors["bme280"]["preassure"] = bme.readPressure() / 100.0F;
|
objSensors["bme280"]["preassure"] = bme.readPressure() / 100.0F;
|
||||||
objSensors["bme280"]["appAltitude"] = bme.readAltitude(SEALEVELPRESSURE_HPA);
|
objSensors["bme280"]["appAltitude"] = bme.readAltitude(SEALEVELPRESSURE_HPA);
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ test -z $1 && help
|
||||||
case $1 in
|
case $1 in
|
||||||
s|setup)
|
s|setup)
|
||||||
ACLI_DIR="$(dirname $ACLI)"
|
ACLI_DIR="$(dirname $ACLI)"
|
||||||
declare -a LIBS=( "Adafruit SSD1306" "Adafruit BME280 Library" "ArduinoJson" "NTPClient" "Time" )
|
declare -a LIBS=( "Adafruit SSD1306" "Adafruit BME280 Library" "ArduinoJson" "NTPClient" "Time" "Adafruit SHT31 Library" )
|
||||||
echo ":: Setting up build environment for CanGrow Firmware."
|
echo ":: Setting up build environment for CanGrow Firmware."
|
||||||
echo " This will download the binary for arduino-cli and install"
|
echo " This will download the binary for arduino-cli and install"
|
||||||
echo " the packages for the arduino ide from the debian repository."
|
echo " the packages for the arduino ide from the debian repository."
|
||||||
|
|
Loading…
Reference in a new issue