ESP32 HiGrow V1.0 (Plant Spike)

Last Updated on 18. October 2026 by SuffocationLink status: OK

Das HiGrow (oder auch HighGrow) Board ist unter seinem vollen Namen „ESP32 DHT11 WIFI Bluetooth Soil Temperature Humidity Sensor18650“ beim schnellen Ali erhältlich. Es soll zur Pflanzenüberwachung dienen und basiert auf einem ESP32 Wroom. Das Board kann Luftfeuchtigkeit, Temperatur, Licht sowie Erdfeuchte messen. Einige Pins sind nach außen geführt, so dass weitere Sensoren hinzugefügt werden können. Der Lichtsensor scheint bei meiner Version nicht vorhanden zu sein. Es gibt noch andere ähnliche Boards, zum Beispiel von TTGO. Im weiteren Verlauf werde ich das Board auch als Stock oder Spieß bezeichnen, denn so sieht es aus ;).

Zum Thema HighGrow ist auch dieser kurze Wikipediaeintrag ganz nett, den ich euch nicht vorenthalten möchte:

https://de.wikipedia.org/wiki/HighGrowLink status: OK

Facts

HiGrow ESP32 V1.0
ProcessorESP32-WROOM
USBMicro-USB
Abmessungen195 × 30 × 25 mm
Weitere BausteineDHT11 (Temperatur/Luftfeuchte), Bodenfeuchtesensor, Akkuhalter 18650, Laderegler TP5400 (teils TP5410)
Hi Grow - Die wichtigsten Teile beschriftet
Hi Grow – Die wichtigsten Teile beschriftet

What is installed

Am USB angeschlossen, blinkt die blaue LED. Der erste Blick im Terminal zeigt nur die Standardausgabe des ESP Wroom. Der Stock scheint keine programmierte Funktion zu haben und ist auch nicht mit MicroPython geflasht.

Higrow Sensor Blick auf die aufgespielte Software
Higrow Sensor: A look at the installed software

A bootloader has been installed. When switching on whilst holding down the boot button, the blue LED no longer flashes.

Areas of application

  • For observing plants
  • Room climate recording
  • An access point for every plant 😉
  • Als Testplattform für Kurse (gibt ein paar Negativbeispiele im Netz)

Views

Programming

I’m using a ready-made MQTT programme. This allows me to carry out a few quick tests and saves time.

Here is the link to the originalLink status: OK

Libraries

Für das Programm werden ein paar Bibliotheken benötigt, diese sind im Folgenden aufgelistet.

MQTT Client

MQTT wird hier nicht neu erfunden, sondern es wird die folgende Bibliothek verwendet.

https://github.com/knolleary/pubsubclientLink status: OK

PubSubClient Bibliothek
PubSubClient library

DHT11 Sensor Library

The DHT11Link status: OK und DHT22 Luftfeuchte- und Temperatursensor ist weit verbreitet, auch hier gibt es unterschiedliche Implementierungen, das gewählte Programm verwendet die folgende:

https://github.com/adafruit/DHT-sensor-libraryLink status: OK

DHT Bibliothek
DHT Library

AdafruitLink status: OK hat irgendwann mal eine Basis für all ihre Sensorimplementierungen geschaffen, diese nennt sich Unified SensorLib. Sie wird auch für den DHT11 Sensor benötigt.

https://github.com/adafruit/Adafruit_SensorLink status: OK

Adafruit Unified Sensor Bibliothek
Adafruit Unified Sensor Library

Test programme

Das Testprogramm kann von GitHub heruntergeladen werden. Ich habe noch ein paar andere Änderungen am Code vorgenommen, deswegen hier mein Fork. In der Datei credentials.h müssen noch SSID, WIFI Passwort und MQTT Broker und die Titel eingetragen werden.

Source code credentials.h (GitHubLink status: OK)

// This file contains credentials to access several services
#ifndef CREDENTIALS_H
#define CREDENTIALS_H
// WiFi
const char* mySSID = "YOUR_SSID";
const char* myPW = "YOUR_PASSWORD";

// MQTT (CloudMQTT)
const char* BROKER = "192.168.1.10";
uint16_t    BRPORT = 1883;
const char* BRUSER = "YOUR_MQTT_USER";
const char* BRPWD  = "YOUR_MQTT_PASSWORD";
const char* CLIENTID = "HiGrow2";
const char* hostname = "HiGrowBuero";



//#define DHTTYPE DHT21   // DHT 21 (AM2301)
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
#define uS_TO_S_FACTOR 1000000
//#define LILYGO

#ifdef LILYGO
  #define DHTTYPE DHT11  // DHT12
  #define I2C_SDA             25
  #define I2C_SCL             26
  #define DHT_PIN             16 //22  // 16
  #define BAT_ADC             33
  #define SALT_PIN            34
  #define SOIL_PIN            32
  #define BOOT_PIN            0
  #define POWER_CTRL          4
  #define USER_BUTTON         35
  #define DS18B20_PIN         21                  //18b20 data pin
  #define TEMP_CALIBRATION -7.7 // calibrate the temp sensor to the correct temperature
#else 

  #define DHTTYPE DHT11
  #define I2C_SDA             25
  #define I2C_SCL             26
  #define DHT_PIN             22
  //#define BAT_ADC             33
  #define SALT_PIN            34
  #define SOIL_PIN            32
  #define BOOT_PIN            0
  #define POWER_CTRL          4
 // #define USER_BUTTON         35
  #define DS18B20_PIN         21                  //18b20 data pin
  #define TEMP_CALIBRATION -4.3          // calibrate the temp sensor to the correct temperature

#endif

#define OB_BH1750_ADDRESS       (0x23)
#define OB_BME280_ADDRESS       (0x77)

#define SOIL_MIN 1500
#define SOIL_MAX 4000


//maximum is 400 days
// uint64_t  DEEPSLEEP_SECONDS = 10; // 10 seconds
uint64_t DEEPSLEEP_SECONDS = 1800; // 30 min
// uint64_t  DEEPSLEEP_SECONDS = 180; // 3 min
// uint64_t  DEEPSLEEP_SECONDS = 3600; // 60 min number to big
// uint64_t  DEEPSLEEP_SECONDS = 7200; // every two hours
// uint64_t  DEEPSLEEP_SECONDS = 3600*12; // twice a day
// uint64_t  DEEPSLEEP_SECONDS = 3600*24; // once a day

/** define some mqtt things */

/*** define topics */
#define FLOOR "EG"
#define ROOM  "Büro"
//#define ROOM  "Diele"
//#define ROOM  "Wohnen"
#define PLANT "Bogenhanf"
//#define PLANT "Yucca"
//#define PLANT "Benjamini"
//#define PLANT "Gummibaum"
#define TEMP  "Temperatur"
#define HUMI  "Luftfeuchte"
#define SOIL  "Bodenfeuchte"
#define SALT  "Salz"
#define LIGHT "Helligkeit"
#define BAT   "Battery"

/*** define what values should be send Doccument out the unwanted */
#define SINGLE 0x00
#define JSON  0x01

#ifdef SINGLE 
  #define TEMP_TOPIC   FLOOR "/" ROOM "/" PLANT "/"  TEMP
  #define HUMI_TOPIC   FLOOR "/" ROOM "/"  PLANT "/" HUMI
  #define SOIL_TOPIC   FLOOR "/" ROOM "/"  PLANT "/" SOIL
  #define SALT_TOPIC   FLOOR "/" ROOM "/"  PLANT "/" SALT
  #define LIGHT_TOPIC  FLOOR "/" ROOM "/"  PLANT "/" LIGHT
  #define BAT_TOPIC    FLOOR "/" ROOM "/"  PLANT "/" BAT
#endif

#ifdef JSON
  #define JSON_TOPIC  FLOOR "/" ROOM "/"  PLANT "/json" 
  #define JSON_TOPIC_TEMPLATE  "[{\"" TEMP "\": %f,\"" HUMI "\":%f,\"" SOIL "\":%i,\"" SALT "\":%i,\"" LIGHT "\":%i,\"" BAT "\":%1.2f}]"
  
#endif

#endif // #define CREDENTIALS_H

You can find the original here:

GitHub Link Link status: OKzLink status: OKHiGrowEsp32MqttLink status: OK

Directly as a zip via DownGitLink status: OK

Auf die Einrichtung des Brokers gehe ich an dieser Stelle nicht näher ein, sollte noch kein Broker vorhanden sein, gibt es unterschiedliche Möglichkeiten, an einen zu kommen:

  • There are so-called web brokers where you can register online and often use the broker for free. Examples include HiveMQLink status: OK, DIY projectsLink status: Unknown and here's another Top 10 listLink status: Unknown.
  • Eigener Broker – exemplarisch sei hier auf den Mosquitto in Verbindung mit dem PI verwiesen (Here's the setup)Link status: OK
  • Home automation broker. I am using IP-SymconLink status: Unknown For home automation, many other systems now also offer MQTT connections.

Nun noch compilieren und auf den Spieß schreiben und dann hoffen, dass was beim Broker ankommt.

HiGrow - Arduino Gui Programmiereinstellungen
HiGrow – Arduino Gui Programmiereinstellungen

The root of the problem lies here yet again. It won't work without the button. First, initiate the writing process. Then, hold down the boot button and briefly press the reset (EN) button. The ESP will now start in boot mode. After a few seconds, the boot button can be released. The writing process should now start.

Auch auf meinem Broker werden die Werte vom Spieß jetzt angezeigt und können weiter verarbeitet werden.

IP-Symcon MQTT Broker - Werte vom ESP Stock
IP-Symcon MQTT Broker – Werte vom ESP Stock

Über die Zeit schwankt es schön, mal schauen, was man daraus machen kann.

HiGrow Auswertung über eine Stunde

Long-term test (updated)

Drei Pflanzen (Benjamini, Bogen Hanf (Kein THC), Areca Palme). Die Sensoren messen und legen sich dann 30Min/1h/2h schlafen. Die Sensoren senden ihre Werte an den Homeserver und dieser speichert sie. Alle Akkus haben um die 2400Ah.

  • 14.10.2020 11:30 Test with Benjamini started, sends every 30 minutes.
  • 15.10.2020 23:03 Still receiving messages
  • 16.10.2020 13:29 Benjamini is still sending.
  • 16.10.2020 18:23 The Benjamine continues to run, the hemp bow now sends every hour and the Areca palm every two hours.
  • 17.10.2020 13:04 Alle Sensoren laufen noch, Tabelle aktualisiert
  • 19.10.2020 09:25 Heute Morgen um 4 Uhr ist der letzte Messwert vom Benjamini gekommen. Somit hat dieser weniger als 5 Tage durchgehalten.
  • 20.10.2020 ~21:30 The Arc Hemp sensor has failed
  • 21.10.2020 ~04:00 The sensor for the Areca palm has failed.

Evaluation

Die Palme hält etwas länger durch, aber nicht signifikant, siehe Tabelle. Somit haben wir unspektakuläre 5 Tage. Alleine am ESP32 scheint es zumindest nicht zu liegen:

  • The ESP consumes a maximum of 180mA during normal operation with Wi-Fi.
  • In DeepSleep mode, it only consumes <10 uA.

Assuming a cycle of 2 hours of DeepSleep and 10 seconds of measuring/sending, the calculation works out as follows:

Consumption per cycle under load
= 10s * 180mAh/3600(s)
= 10s * 180mAh/3600
= 10s * 0.022mAh
= 0.22 mAh

Consumption per cycle on standby
= 2h * 0.10mA
0.02mAh

Total consumption per cycle
0.22mAh + 0.02mAh
0.24mAh

With a 2400mAh battery

Cycles = 2400mAh / 0.24mAh = 10000c
Hours = 10000z / 2.002h/z = 4995h
Days = 4995h / 24h/Day = 208 days

Das sind 203 Tage mehr als der beste Test, somit muss der Hauptverbrauch an anderer Stelle liegen.

Für den DHT 11 habe ich ebenfalls Daten gefunden, deshalb möchte ich überprüfen, ob diese verantwortlich sein könnte.

  • Standby max 150µA
  • Last 2.5mA

Consumption per cycle under load
10s * 2.5mAh / 60min * 60s
= 10s * 2.5mAh/3600
= 10s * 0.000694mAh
= 0.0069 mAh

Consumption per cycle on standby
= 2h * 0.15mAh
0.3mAh

Total consumption per cycle ESP32 + DHT11
= 0.5469mAh
= 0.55mAh

With a 2400mAh battery

Cycles = 2400mAh / 0.55mAh = 4,363 cycles
Hours = 4.363z/ 2.002h/z = 2160h
Days = 4995h / 24h/Day = 90 Days

Mit DHT11 Sensor sind es nur noch etwas weniger als die Hälfte der Tage. Rechnet man die 90 Tage verbleibend minus die wirklich gemessene Zeit, verbleiben 85 Tage, die der Boden-Feuchtesensor und die restliche Peripherie verbrauchen.

#TestPlantMessageStarted Read# measured values#Tage
1Benjamini30 mins.14.10.2020 11:3019.10.2020 03:40224Less than 5
2Bow Hemp1st St.16.10.2020 18:1020.10.2020 21:30994
3Areca palm2 St. 16.10.2020 18:2321.10.2020 04:0052Less than 5
Overview of trial period

Die Werte der Feuchtesensoren scheinen mir auch nicht ganz schlüssig, wenn ich sie mit denen im Internet vergleiche. Evtl. mache ich hierzu nochmal eine Versuchsreihe mal sehen.

Problems

Hoher Stromverbrauch selbst in der Sleep Phase.

Im Netz klagen einige Benutzer über den hohen Stromverbrauch während des Tiefschlafs (deep sleep). Meine Tests haben das bestätigt, allerdings liegt es meiner Meinung nach an den Sensoren.

Ich habe noch einen Fehler im Code gefunden, wenn man die Sleepzeit zu hoch setzt, geschieht ein Überlauf der int Variablen und er schläft nicht ein. Bitte int durch uint64_t tauschen, dann klappts:

// int DEEPSLEEP_SECONDS = 1800; // 30 min // alt
uint64_t DEEPSLEEP_SECONDS = 1800; // 30 min // new

Miscellaneous

3D models for the casing

To package the cane, there are some 3D models on Thingiverse:

https://www.thingiverse.com/thing:3333221Link status: OK

https://www.thingiverse.com/thing:2791829Link status: OK

https://www.thingiverse.com/thing:3491667Link status: OK

https://www.thingiverse.com/thing:3209270Link status: OK

Die ersten beiden Modelle habe ich mal gedruckt. Der Ausdruck erfolgte mit den folgenden Druckparametern:

DescriptionWorth
PrinterEnder 5
MaterialPLA
Printing temperature210
Bed temperature60
Nozzle 0,4
Layer height0,2
Shell thickness0,8
Print speed95
SupportEverywhere
UndergroundRaft
3D printing parameters

Der Ausdruck verlief ohne Probleme, das Endprodukt musste ich etwas mit dem Skalpell nachbearbeiten, aber nichts was aus dem Rahmen fällt. Den Tropfen Deckel bräuchte ich persönlich nicht und werde ihn weglassen. Zum Montieren habe ich 4st 2×15 Spax und 1st *2×2,5 Blechschrauben verwendet. Das Board selbst passt gut in das Gehäuse. Hier noch ein paar Bilder :

Der zweite Ausdruck war auch ok, hier fehlt mir allerdings das Schraubenloch zur Befestigung des Deckels. Bilder habe ich mir jetzt mal gespart.

Conclusion

Nette Idee mit dem Pflanzensensor. Der ESP32 ist Stand der Technik, das gesamte Board hat ein paar Sensoren, was auch ganz nett für Einsteiger sein kann. Was mich am Stock ärgert ist die Knöpfchendrückerei beim Programmieren. Da waren wir schon mal weiter. Wenn man den Berichten im Internet glaubt (und das tue ich an dieser Stelle), dann kann der Stock die Nähe von Feuchtigkeit nicht ertragen und die Lötpunkte blühen relativ schnell auf. Somit ist an einen Langzeiteinsatz ohne zusätzliche Behandlung, zum Beispiel durch Epoxid Harz, nicht zu denken. Ein Außeneinsatz fällt damit auch flach.

Der Spannungsteiler, um die Spannung des Akkus zu messen, fehlt. Den Lichtsensor solls erst ab Version 2 geben. Der Stock ist eine nette Idee, aber nicht besonders gut ausgeführt. Ich habe mir noch ein paar einzelne Bodenfeuchte Sensoren und eine Variante des HiGrow von LilyGo bestellt, diese werde ich bei Gelegenheit noch testen.

Related Posts

Sources

https://www.diymore.cc/Link status: OK

Post on IOT NewbieLink status: OK

CK Blog Post About the SensorLink status: OK

CK Blog Post on Data Collection with the SensorLink status: OK

Github Project HiGrowESP32MQTTLink status: OK

Re-release of the MQTT projectLink status: Broken

Github other project by lucafabbriLink status: OK

Post on FlashgamerLink status: OK

Instructables postLink status: OK

Nice contribution on Wikipedia about the game HighGrow 😉Link status: OK

Contribution to Deep Sleep Time ESP826Link status: OK6Link status: OK Link status: OK

DateChangeAuthor
19.10.2026Fakten-Tabelle durch Datenblock aus dem Modell ersetztSuffocation
15.10.2026Beispielcode als Code-Block eingefügt (Einbettung über gist-it.appspot.com funktionierte nicht mehr)Suffocation
04.10.2026Rechtschreibung korrigiert: Tippfehler, Kommas, Groß-/Kleinschreibung, GrammatikSuffocation
03.10.2026Log-Liste eingefügtSuffocation
13.10.2020Post createdSuffocation
Changelog

10 thoughts on “ESP32 HiGrow V1.0 (Pflanzenspieß)”

  1. Hello Stefan,
    I've now also had my first experiences with the stick from Ali, and it's sufficient for experimenting.
    I have the code from draeger-it.blog and am sending it to the „ThingSpeak“ page. .
    Unfortunately, I'm not getting reasonable times with an 18650 battery either. With a stated 8800 mAh, it's kaput after about 200 cycles. When I measure the current the stick draws in standby mode, I have about 20 mA on the multimeter. In transmission status, the current is 170 mA.

    Greetings from Halle/Sa

    Siegfried

  2. Hello,

    after some error messages (wrong board, I had selected an ESP32 Wrover module instead of an ESP32 DEV Module as above)
    No error messages are now appearing in the COM log.
    But no further data is displayed there for me either.

    It doesn't get any better than this.
    11:00:57.393 -> …..ets Jun 8 2016 00:22:57
    11:01:02.603 ->
    11:01:02.603 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    11:01:02.603 -> configsip: 0, SPIWP:0xee
    11:01:02.603 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    11:01:02.603 -> mode:DIO, clock div:1
    11:01:02.603 -> load:0x3fff0018,len:4
    11:01:02.603 -> load:0x3fff001c,len:1216
    11:01:02.603 -> ho 0 tail 12 room 4
    11:01:02.603 -> load:0x40078000,len:10944
    11:01:02.603 -> load:0x40080400,len:6388
    11:01:02.603 -> entry 0x400806b4
    11:01:02.882 -> [WIFI] Connecting to No_Name
    11:01:03.068 -> xx:xx:xx:xx:xx:18
    11:01:04.094 -> ………….
    (MAC removed)

    Shouldn't values be displayed there as well?
    My Fritzbox can't find the IP address I entered either. (SSID and WPA2 password are correct though)
    I wanted to use it with iOBroker (I already have MQTT installed there, but there is no connection).

    1. Hello Corcon,

      It looks like the Wi-Fi connection isn't working.
      Let's check in the Fritzbox to see if 2.4GHz is enabled. If necessary, try disabling 5GHz. The encryption is WPA2. Try choosing a short password and test with that.

      Perhaps try using some code that just establishes the Wi-Fi connection and see if that works. You can find an example here:
      https://www.fambach.net/esp32-nodemcu/ or one of the example programs for the ESP32.

      Hope that helps, regards Stefan

  3. Hello,

    After some „hurdles“, I managed to compile the code and flash it onto the plant skewer.
    I have adjusted the WLAN SSID and password.
    But shouldn't I see the Wi-Fi connection on the Fritzbox now?
    As for MQTT, I wanted to use iobroker, but I'm not getting a connection there either.
    How can I test if the spit is working at all?

  4. Hello Stefan,

    Everything runs on a RaspPi and the DietPi operating system for me. https://dietpi.com, It has a lot of built-in software for installation, including Docker: https://dietpi.com/docs/software.

    If you want, I'll gladly send you my Node-RED, InfluxDB, Grafana „workflow“.

    Sorry, yes I mean to keep it awake for longer, about 60 seconds, as I'd like it to wake up twice a day (uint64_t DEEPSLEEP_SECONDS = 3600*12;) and have enough time for watering and measurement. I can't find the setting to adjust the „awake“ time.

    I've inverted the light level map because the graph in Grafana is showing a low value when it's sunny.

    Greetings
    Ian

    1. Hello Ian,

      is always before line 75 in the loop function. Before the deep sleep start is where you would need to get involved. The deep sleep start is unfortunately after the console output and therefore easily overlooked.

      Hello
      Stefan

      1. Hello Stefan,

        Sorry, one more question. How can I set it to read the sensor data multiple times during the „wake“ phase?

        Because in my irrigation system I would like to irrigate as follows in a 1-minute irrigation time:

        Wait up
        Sensor reading: dry > water > wait
        Sensor reading: dry > water > wait
        Sensor reading: dry > water > wait
        Sensor reading: wet > no water > waiting
        Sensor reading: wet > no water > waiting
        etc.
        Deep sleep

        Greetings
        Ian

  5. Hello Ian,

    Glad it's working out for you. With InfluxDB and Grafana, you're already much further along than I am. I've only just made my first attempts with Docker.

    I don't know the module, but it's very interesting. Basically, it only needs two resistors connected as a voltage divider to an analogue port. It also annoys me a bit that the voltage or battery level aren't measured at the same time. On a few circuit diagrams there's a measurement connection for the charging IC, perhaps it just needs a bridge, but I'm not very good with electronics.

    I'm not sure what you mean by the 60 seconds, of course you can keep the module awake for longer, for example, to switch a pin, is that what you mean?

    The easiest way would be to put it before line 75, before the output and the sleep command (by the way, terrible programming style 😉).

    Hello
    Stefan

  6. Hello Stefan,
    Thank you very much for this great project. I have a HiGrow and couldn't do anything with it, now it's running great with node-red, influxDB and Grafana.

    A question, would it be possible to integrate a GY219 Current Power Supply Sensor via I2C with MQTT. I am interested in monitoring the battery voltage.

    Another question, would it be possible to determine the time after deep sleep? I would like to integrate it with my irrigation system and it needs about 60 seconds to be switched on.

    Many greetings
    Ian

Leave a Reply

Your email address will not be published. Required fields are marked *