amc:ss2025:group-g:start
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
amc:ss2025:group-g:start [2025/07/29 22:53] – [References] 29478_students.hsrw | amc:ss2025:group-g:start [2025/07/29 23:57] (current) – [Explanation Video] 29478_students.hsrw | ||
---|---|---|---|
Line 65: | Line 65: | ||
- | The prototype (Figure 3.1) successfully read the data collected from the sensors and sent it over MQTT to the Ubidots MQTT broker; the data received by the server was then available to be displayed in the dashboard (Figure 3.2). The air temperature and humidity sensor used was a DHT11 unit since it showed more accurate results than the DHT22 unit available when compared to a more expensive reference unit. The microcontroller used was the ESP32S3 connected directly to the host computer, since the more specific board did not function as intended, as will be discussed in the next chapter. | + | The prototype (Figure 3.1) successfully read the data collected from the sensors and sent it over MQTT to the Ubidots MQTT broker; the data received by the server was then available to be displayed in the dashboard (Figure 3.2). The air temperature and humidity sensor used was a DHT11 unit since it showed more accurate results than the DHT22 unit available when compared to a more expensive reference unit. The microcontroller used was the ESP32S3 connected directly to the host computer, since the more specific board did not function as intended, as will be discussed in the next chapter. |
+ | |||
+ | The code developed for it is shown below with comments where needed. | ||
{{ : | {{ : | ||
Line 72: | Line 74: | ||
{{ : | {{ : | ||
+ | < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // Defining sensor variables | ||
+ | #define DHTPIN 4 | ||
+ | #define DHTTYPE DHT11 | ||
+ | #define SOILPIN 5 | ||
+ | #define LDRPIN 6 | ||
+ | DHT dht(DHTPIN, DHTTYPE); | ||
+ | |||
+ | // Defining MQTT/ | ||
+ | #define TOKEN " | ||
+ | #define WIFINAME " | ||
+ | #define WIFIPASS " | ||
+ | #define DEVICE_LABEL " | ||
+ | #define VAR_LABEL_1 " | ||
+ | #define VAR_LABEL_2 " | ||
+ | #define VAR_LABEL_3 " | ||
+ | #define VAR_LABEL_4 " | ||
+ | Ubidots client(TOKEN); | ||
+ | bool connected = false; | ||
+ | |||
+ | // Defining sleep variables | ||
+ | #define uS_FACTOR 1000000 | ||
+ | #define PUBLISH_FREQUENCY 60 | ||
+ | RTC_DATA_ATTR int bootCount = 0; | ||
+ | |||
+ | const int airStd = 3550; | ||
+ | const int waterStd = 1560; | ||
+ | int soilMoistPerc = 0; | ||
+ | int soilMoist = 0; | ||
+ | int hum = 0; | ||
+ | float tempC = 0; | ||
+ | int light = 0; | ||
+ | int lightPerc = 0; | ||
+ | const int minLight = 0; | ||
+ | const int maxLight = 3409; | ||
+ | |||
+ | |||
+ | // Auxiliary Function for Ubidots connection | ||
+ | void callback(char *topic, byte *payload, unsigned int length) | ||
+ | Serial.print(" | ||
+ | Serial.print(topic); | ||
+ | Serial.print(" | ||
+ | for (int i = 0; i < length; i++) { | ||
+ | Serial.print((char)payload[i]); | ||
+ | } | ||
+ | Serial.println(); | ||
+ | } | ||
+ | |||
+ | void soilMoistPrint(int soil_moisture, | ||
+ | soilMoistPerc = map(soil_moisture, | ||
+ | |||
+ | if (soilMoistPerc < 0) { | ||
+ | soilMoistPerc = 0; | ||
+ | } | ||
+ | else if (soilMoistPerc > 100) { | ||
+ | soilMoistPerc = 100; | ||
+ | } | ||
+ | Serial.print(" | ||
+ | Serial.print(soilMoistPerc); | ||
+ | Serial.println(" | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | void dhtOutPrint(int humidity, float temperature_C) { | ||
+ | if (isnan(humidity) | isnan(temperature_C)) { | ||
+ | Serial.println(" | ||
+ | } | ||
+ | else { | ||
+ | Serial.print(" | ||
+ | Serial.print(humidity); | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.print(" | ||
+ | Serial.println(temperature_C); | ||
+ | |||
+ | } | ||
+ | | ||
+ | } | ||
+ | |||
+ | void lightOutPrint(int light, int minimum, int maximum) | ||
+ | lightPerc = map(light, minimum, maximum, 0, 100); | ||
+ | Serial.print(" | ||
+ | Serial.print(lightPerc); | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | void setup() { | ||
+ | // put your setup code here, to run once: | ||
+ | Serial.begin(115200); | ||
+ | delay(1000); | ||
+ | dht.begin(); | ||
+ | |||
+ | ++bootCount; | ||
+ | Serial.println(" | ||
+ | esp_sleep_enable_timer_wakeup(PUBLISH_FREQUENCY * uS_FACTOR); | ||
+ | |||
+ | client.setDebug(true); | ||
+ | client.wifiConnection(WIFINAME, | ||
+ | client.begin(callback); | ||
+ | |||
+ | if (!connected) | ||
+ | Serial.println(" | ||
+ | connected = client.connect(); | ||
+ | } | ||
+ | | ||
+ | Serial.println(connected); | ||
+ | |||
+ | light = analogRead(LDRPIN); | ||
+ | // | ||
+ | | ||
+ | hum = dht.readHumidity(); | ||
+ | tempC = dht.readTemperature(); | ||
+ | // | ||
+ | |||
+ | soilMoist = analogRead(SOILPIN); | ||
+ | // | ||
+ | | ||
+ | if (connected) { | ||
+ | client.add(VAR_LABEL_1, | ||
+ | client.add(VAR_LABEL_2, | ||
+ | client.add(VAR_LABEL_3, | ||
+ | client.add(VAR_LABEL_4, | ||
+ | client.ubidotsPublish(DEVICE_LABEL); | ||
+ | client.loop(); | ||
+ | } | ||
+ | |||
+ | Serial.println(" | ||
+ | Serial.flush(); | ||
+ | esp_deep_sleep_start(); | ||
+ | |||
+ | } | ||
+ | void loop() { | ||
+ | // put your main code here, to run repeatedly: | ||
+ | | ||
+ | } | ||
+ | </ | ||
====== 4. Discussion ====== | ====== 4. Discussion ====== | ||
'' | '' | ||
Line 119: | Line 261: | ||
* Enhanced Dashboard: Add mobile compatibility, | * Enhanced Dashboard: Add mobile compatibility, | ||
* Enhanced Functionality: | * Enhanced Functionality: | ||
+ | |||
+ | ====== Explanation Video ====== | ||
+ | |||
+ | The videos showing the explanation and demo are zipped below. Also included is the schematic file showing how everything is connected. Uploaded here for the size of the zipped file is still too large for Moodle. | ||
+ | |||
+ | {{ : | ||
====== References ====== | ====== References ====== |
amc/ss2025/group-g/start.1753822402.txt.gz · Last modified: 2025/07/29 22:53 by 29478_students.hsrw