Sensors are for learning
The gas sensor and the soil sensor give learning readings, not certified safety readings. Never use the gas sensor as a real gas or smoke alarm.
Setup guide and technical manual
Get your board on Wi-Fi in six steps, pick a dashboard and fix common problems, with no coding. Programmers will find the full API in Part 2.
For owners, teachers, parents and students. Everything here is done in a web browser, with no code. No kit yet? See how to get one.
Have these things ready. Tick each one off as you go.
Guest networks often stop devices on them from talking to each other. IT staff call this "client isolation". Ask them to turn it off for the board, or use another network.
Match each part to its photo before you plug it in. Each one goes into the socket with the same name printed on the board.
Boards come in purple or green. Both colours are the same MakerBuddy IoT Kit V1.0 design.
For pin numbers and wiring diagrams, see where each part plugs in.
Do this once for each board, and again if the board moves to a new Wi-Fi network. Pick your device first, then follow the six steps. Your ticks are saved in this browser.
The board saves its name in small letters and numbers, up to 32 characters. Spaces and other symbols become a dash. This lets other devices find it as the name followed by .local.
Hold the button
Hold the board's push button for 10 seconds. You can do this in the first 3 seconds after switching on, or at any time while the board runs.
Watch the screen
It counts down "WiFi Reset: 10 seconds", then shows "WiFi Reset!" and "Restarting...".
Set it up again
The board restarts in setup mode. Go back to step 2 of the setup.
The reset clears only the saved Wi-Fi name and password, and sets the screen back to its normal display. The board's name, its rules and its soil settings stay saved.
The board tries 3 times, about 10 seconds each. Then its screen shows "Not Connected to" and the network name, and it turns its Wi-Fi off. It does not go back to setup mode by itself. Check the network against the Wi-Fi rules, then hold the button for 10 seconds and set it up again.
A dashboard is the screen where you see readings and control the board. Pick the one that matches your device. They all control the board the same way.
| Dashboard | Best for | Where to get it | What it remembers | Analytics |
|---|---|---|---|---|
| Chrome extension | Chrome or Edge on a computer | Chrome Web Store (opens in a new tab), also on Edge Add-ons (opens in a new tab) | Your last board address | Google Analytics |
| Firefox add-on | Firefox on a computer | Firefox Add-ons (opens in a new tab) | Your last board address | None |
| Safari extension | Safari on a Mac, iPhone or iPad | Opens from the Safari toolbar. Its store link is not listed here yet, so use the web app in Safari for now | Your last board address | None |
| Web app | Safari, and browsers that are not Chrome, Edge or Firefox (such as Chrome on iPhone) | app.makerbuddy.cc (opens in a new tab). Needs internet to open | Theme and card settings, but not your board address | Google Analytics |
| MakerBuddy phone app | iPhone and Android, once it is out | Not yet in the App Store or Google Play | Your last board and its look. It reconnects by itself after a Wi-Fi drop | Not out yet |
The first time you connect, the Chrome and Firefox add-ons ask your permission to reach your board. The phone app will ask for permission to use the local network.
http://, not https://. That is on purpose: the board only speaks plain http, and browsers do not let an https page talk to it. Your browser may show "Not secure" next to the address.The gas sensor and the soil sensor give learning readings, not certified safety readings. Never use the gas sensor as a real gas or smoke alarm.
The board asks for no password and does not encrypt what it sends. Anyone on the same Wi-Fi can open its dashboard and change it. Never put it on the open internet.
In a class, write each board's name on a label, so students connect to their own board. Between class groups, delete the last group's rules in the dashboard. Holding the button does not clear rules.
Every board's setup network uses the same password, 12345678. Finish setup soon after you start it.
The board does not check where an update file comes from. Only install update files from MakerBuddy. See Updating the board's software.
Every security limit, and four steps for a school network, are in Technical details.
You set all three in the dashboard. Programmers can find the command fields in Mapping commands.
Dry
Open soil calibration in the dashboard and press Start under Dry. Hold the sensor in dry air or dry soil. The box shows the live raw number. Press Save.
Wet
Press Start under Wet. Hold the sensor in water or wet soil. Press Save.
Until you do this, the board uses 3000 for dry and 1200 for wet. Saved numbers must be between 0 and 4095. If dry and wet are the same number, moisture always reads 0.
The knob can control the blue light's brightness, the colour light (turning through the colours), the motor's angle, or nothing. Each time the board restarts, the knob goes back to controlling nothing. This is on purpose, so choose again after a restart. If a running rule is using the same part, you cannot pick that part until the rule lets go of it.
Pick one sensor: DHT11 temperature (0–50 °C), DS18B20 temperature (−55 to 125 °C), or humidity, light, gas or soil moisture (each 0–100). The motor then turns across 0–180° as the reading changes. You can reverse the direction. It ignores changes smaller than 3° and moves smoothly instead of jumping.
The knob and a sensor cannot both drive the motor. Turning one on turns the other off. Your choice is saved, but it starts switched off after every restart. It also pauses while a rule with a motor step is running.
Current versions
Firmware 2.10 installs over USB with the Arduino IDE; updating over Wi-Fi erases the board's saved settings.
The dashboards check for new board software (firmware) by themselves. When there is a newer version, they show a notice with the release notes. Closing the notice hides it for 24 hours. Versions are compared number by number, so 2.10 is newer than 2.9.
A dashboard can install an update over Wi-Fi only when the file's link starts with plain http://. The 2.10 file is on GitHub, behind an https:// link. So every dashboard shows this message:
"New version 2.10 available. This download requires manual installation through Arduino IDE."
This means you install it from a computer, with a USB cable, using the free Arduino IDE program.
Get the Arduino IDE
Install the free Arduino IDE on a computer.
Add ESP32 support
In File > Preferences, paste the board address shown below into "Additional Board Manager URLs". Then open Tools > Board > Boards Manager, search for "ESP32" and install "esp32 by Espressif Systems" (version 3.x).
Add the libraries
In Sketch > Include Library > Manage Libraries, install the 8 libraries listed in Arduino development.
Get the code
Download the public source (opens in a new tab) and open Arduino Code/MakerBuddy/MakerBuddy.ino.
Pick the board
Connect the board to the computer by USB. Choose Tools > Board > ESP32 Dev Module, then the board's port under Tools > Port. Set Tools > Upload Speed to 115200.
Upload
Click Upload and wait until it finishes.
Check
Open the Serial Monitor at 115200 baud. It shows the board's IP address once the board joins Wi-Fi.
The board address for step 2:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.jsonFind what you see, then try the fix.
The setup network appears only when the board has no saved Wi-Fi, or after a button reset.
Try this: hold the button for 10 seconds, then look again. More in First-time setup
Your device and the board may be on different networks, or the network stops devices talking to each other.
Try this: put both on the same Wi-Fi. Type the board's IP address instead of its .local name. Ask IT to turn off "client isolation". Use the http:// web app or an add-on, because the board only speaks plain ws:// on port 80. More in Choose your dashboard
The screen shows "Not Connected to" and the network name. After 3 tries the board turns its Wi-Fi off. It does not reopen setup by itself.
Try this: check that the network is 2.4 GHz and needs only a name and password. Then hold the button for 10 seconds and set it up again. More in Before you start
The DHT11 or DS18B20 sensor could not be read. This is not a real temperature.
Try this: check the part, its socket and the power. More in Know your parts
Readings outside 2–500 cm are ignored, so the last good value stays. 999 means there has been no good reading yet.
Try this: check the sensor's socket, and keep the object between about 2 cm and 4 m away.
This is on purpose. The board switches both links off at every start.
Try this: choose them again in the dashboard. More in Sensor settings
A rule may be using that part. While a rule controls a part, its dashboard control is locked.
Try this: stop the rule in the dashboard's Rule Engine tab. Stopping a rule does not switch its outputs off, so switch them off yourself. Lesson 21 explains rules
A rule, a sensor link or the knob is controlling the motor.
Try this: stop the rule, or set the knob and sensor links to None. More in Sensor settings
Before firmware 2.10, the board did not tell the dashboard when a rule ended by itself.
Try this: install firmware 2.10 by USB. It reports a finished rule within about a second. More in Updates
This update file cannot be installed over Wi-Fi.
Try this: install it by USB with the Arduino IDE. More in Updates
The update deleted the board's saved settings when it began. The sensors and screen may stop updating.
Try this: unplug the board and plug it back in. Set up Wi-Fi again, then put your rules and settings back. More in First-time setup
You don't need this part to use the kit. It is for students and developers who want their own code to read the sensors and control the outputs. The free lessons do not teach this part: they use the dashboard and rules, with no code.
How the firmware behaves inside (servo, screen, rule timing, saved settings) is in Technical details.
This reference matches the current source: firmware 2.10, web app 3.6, the Chrome, Firefox and Safari extensions 2.15, and the phone app 1.10.2 (in source, not yet downloadable). Firmware 2.10 needs a USB install (why). Where 2.10 behaves differently from older firmware, this page says so.
The board itself keeps your settings and runs your rules. The web app, the add-ons and the phone app are remote controls on the same local network.
| Item | Value |
|---|---|
| Firmware platform | ESP32 Arduino framework, Arduino-ESP32 core 3.x |
| REST base | http://{DEVICE_HOST}/api |
| WebSocket | ws://{DEVICE_HOST}/ws |
| Port | 80 |
| Setup page (setup mode only) | http://192.168.4.1 |
| Update feed | firmware.json on GitHub (opens in a new tab) |
| Public source | github.com/MakerBuddy/MakerBuddy-V1 (opens in a new tab). What it holds, and the licences: Technical details |
http://{DEVICE_HOST}/apiws://{DEVICE_HOST}/wshttp://192.168.4.1{DEVICE_HOST} is the board's IP address (for example 192.168.1.100) or its name followed by .local (for example makerbuddy-01.local).
REST is handy for checking the board and for linking it to your own code. The dashboards normally use WebSocket instead. POST endpoints read form fields, not JSON bodies. Where an endpoint takes state, send the text true or false.
| Method and path | Parameters or response | What it does |
|---|---|---|
GET /api/sensors | Compact sensor, output and servo JSON | Current board snapshot |
POST /api/led | state; optional pwm, blink | Blue light on/off, brightness 0–255 and blinking |
POST /api/rgb | r, g, b | Colour light channels, each 0–255 |
POST /api/buzzer | state | true gives one 500 ms beep |
POST /api/relay | state | Switches the relay at once |
POST /api/servo | position | Motor angle, 0–180°; 409 while a rule, a sensor link or the knob controls the motor |
POST /api/servomapping | en, sn, iv; optional il, ih, al, ah, db, sm | Sensor-to-motor link; 400 for invalid values, 409 when enabling while a rule holds the motor |
POST /api/lcd | mode (default or custom); custom needs both text1 and text2 (send an empty text2 for a blank second line) | Normal screen rotation, or your own two 16-column lines |
GET /api/sequences | Expanded {sequences:[...]} | All rules |
POST /api/sequences | action (add, delete, start, stop or toggle) and that action's fields | Manage rules |
POST /api/potmapping | mode (none, led, rgb or servo) | What the knob controls; 409 for servo while a rule holds the motor |
GET /api/device | {dn,fv,ip,mc,up,fh,sd,sw} | Board identity and soil calibration |
GET /api/firmware | {fv,oi,op} | Firmware version and update status |
POST /api/ota/update | url | Queue a firmware download over Wi-Fi (erases saved settings first) |
GET /api/sensorsPOST /api/ledstate; optional pwm, blinkPOST /api/rgbr, g, bPOST /api/buzzerstatetrue gives one 500 ms beepPOST /api/relaystatePOST /api/servoposition409 while a rule, a sensor link or the knob controls the motorPOST /api/servomappingen, sn, iv; optional il, ih, al, ah, db, sm400 for invalid values, 409 when enabling while a rule holds the motorPOST /api/lcdmode (default or custom); custom needs both text1 and text2 (send an empty text2 for a blank second line)GET /api/sequences{sequences:[...]}POST /api/sequencesaction (add, delete, start, stop or toggle) and that action's fieldsPOST /api/potmappingmode (none, led, rgb or servo)409 for servo while a rule holds the motorGET /api/device{dn,fv,ip,mc,up,fh,sd,sw}GET /api/firmware{fv,oi,op}POST /api/ota/updateurlThe relay switches at once. Older clients may send onDelay/offDelay or the short od/fd fields; the firmware ignores them.
There is no /api/rules endpoint. Unknown routes (other than OPTIONS) return a JSON 404. CORS currently allows every origin and private-network access.
GET /api/sensors returns short keys. It has no m field.
{
"te": 25.5, "hu": 65, "d8": 24.8, "li": 75, "po": 50, "ga": 15,
"sm": 45, "sr": 2034, "di": 123.5, "md": false, "bp": false,
"ls": true, "lp": 200, "lb": false, "r": [255, 0, 128], "rs": false, "sp": 90, "lm": 0,
"fh": 234567, "pm": 0, "pv": 0, "sc": 1, "so": 0, "si": -1, "ss": 0, "tg": 90,
"sv": { "en": 0, "sn": 5, "il": 0, "ih": 100, "al": 0, "ah": 180, "iv": 0, "db": 3, "sm": 35 }
}Sensor readings
te: DHT11 temperature, °Chu: DHT11 relative humidityd8: DS18B20 temperature, °Cli: Light level, 0–100po: Knob (potentiometer), 0–100ga: MQ-2 gas value, 0–100sm: Calibrated soil moisture, 0–100sr: Raw soil reading, 0–4095di: Distance in centimetresmd: Motion detectedbp: Button pressedOutput states
ls: Blue light on or offlp: Blue light brightness, 0–255lb: Blue light blinkingr: Colour light as [r,g,b]rs: Relay on or offsp: Motor anglelm: Screen mode: 0 normal, 1 customBoard, knob and motor status
fh: Free memory (heap), bytespm: Knob link: 0 none, 1 blue light, 2 colour light, 3 motorpv: The knob's current output valuesc: 1 when Range sweeps are supported (firmware 2.7+)so: Who controls the motor: 0 manual, 1 knob, 2 sensor link, 3 rulesi: Index of the rule that holds the motor, or -1ss: Sensor link: 0 off, 1 active, 2 invalid or stale reading, 3 paused by a ruletg: Motor target during a move, otherwise the held anglesv: Sensor-to-motor link settings (see Mapping commands)MQ-2 and soil values are for learning, not certified safety readings. A DHT11 or DS18B20 read failure shows as 0.0. The board accepts distance readings from 2 to 500 cm; in practice the sensor reaches about 4 m. Outside that window it keeps the last good value. Until the first good reading, distance shows 999.
{
"dn": "makerbuddy-01",
"fv": "2.10",
"ip": "192.168.1.100",
"mc": "AA:BB:CC:DD:EE:FF",
"up": 3600,
"fh": 234567,
"sd": 3000,
"sw": 1200
}dn is the board name, or empty when no name is saved. up is seconds since the board started. sd and sw are the saved dry and wet soil readings. GET /api/firmware returns fv (the version), oi (an update is in progress) and op (its progress).
Custom screen lines can show live values with wildcards such as {temp}, for example text1=Temp%3A%20%7Btemp%7D (URL-encoded Temp: {temp}). Each finished line must fit 16 columns, and REST /api/lcd does not check that. The full wildcard list, how wide each value is, and a tool to try lines are in The LCD screen.
Connect to ws://{DEVICE_HOST}/ws. This is what the dashboards use. Frames must be final, unfragmented text messages of 4096 bytes or less.
When you connect, the board sends its identity (i), firmware status (f), the full rule list (q) and motor status (j). i is the same object as GET /api/device, and f the same as GET /api/firmware, each with an added "m".
Telemetry (s) goes to every client at most every 2 seconds. A new connection or a mapping change sends it straight away, unless one went out less than 2 seconds before. It has the same keys as GET /api/sensors (see the key lists), plus "m": "s".
| Message | Contents | When |
|---|---|---|
i | {dn,fv,ip,mc,up,fh,sd,sw} | On connect |
f | {fv,oi,op} | On connect |
q | {sq:[...]}, the complete rule list | On connect, after every X command and, from firmware 2.10, within 1 second of a rule starting, finishing or stopping by itself, or of a REST rule change |
j | {sc,so,si,ss,tg,sv}, motor status | On connect |
s | Telemetry, same keys as GET /api/sensors | At most every 2 seconds; also on connect and after a mapping change, if 2 seconds have passed |
e | {error} | A refused manual motor or mapping command, sent to the client that sent it |
m | {d,w} | Soil calibration saved, sent to the client that sent it |
i{dn,fv,ip,mc,up,fh,sd,sw}f{fv,oi,op}q{sq:[...]}, the complete rule listX command and, from firmware 2.10, within 1 second of a rule starting, finishing or stopping by itself, or of a REST rule changej{sc,so,si,ss,tg,sv}, motor statussGET /api/sensorse{error}m{d,w}| Target | Payload | Meaning |
|---|---|---|
| Blue light | {"m":"L","s":1,"p":255,"b":0} | On/off, brightness and blink |
| Colour light | {"m":"R","r":255,"g":0,"b":128} | Red, green and blue, each 0–255 |
| Relay | {"m":"Y","s":1} | Switches at once. Low-voltage things only, never mains |
| Motor | {"m":"V","p":90} | Angle, 0–180°; refused with e while something else controls the motor |
| Buzzer | {"m":"Z","s":1} | One 500 ms beep |
| Screen | {"m":"D","md":1,"t1":"Temp: {temp}","t2":"MakerBuddy"} | md 0 normal or 1 custom |
| Knob link | {"m":"P","md":3} | 0 none, 1 blue light, 2 colour light, 3 motor |
| Sensor-to-motor link | {"m":"J","en":1,"sn":5,"iv":0} | On/off, sensor and reverse |
| Soil calibration | {"m":"M","d":3000,"w":1200} | Dry and/or wet raw values, each optional |
| Update | {"m":"O","u":"http://host/fw.bin"} | Queue a firmware link (erases saved settings first) |
| Rules | {"m":"X","a":0,"i":0,"s":{...}} | Add, delete, start, stop or toggle a rule |
{"m":"L","s":1,"p":255,"b":0}{"m":"R","r":255,"g":0,"b":128}{"m":"Y","s":1}{"m":"V","p":90}e while something else controls the motor{"m":"Z","s":1}{"m":"D","md":1,"t1":"Temp: {temp}","t2":"MakerBuddy"}md 0 normal or 1 custom{"m":"P","md":3}{"m":"J","en":1,"sn":5,"iv":0}{"m":"M","d":3000,"w":1200}{"m":"O","u":"http://host/fw.bin"}{"m":"X","a":0,"i":0,"s":{...}}Rules run on the board itself, even when no dashboard is open. A board holds up to 10 rules, each with up to 10 steps. A rule name can be 20 characters long. Each step does one action, then waits before the next step: 1 second unless you change it, from 0 up to 1 hour (0–3,600,000 ms). The loop mode (lm) decides when a rule runs:
| Priority | Loop mode | What it does |
|---|---|---|
| 1 | condition | Watches one or two sensors. Starts once the match has held for 0.3 s (300 ms). When the match ends, it finishes the current round, then stops |
| 2 | timer | Runs one round, waits the interval ld (milliseconds) after it finishes, then starts again. Up to 999 hours on firmware 2.10 |
| 3 | forever | Starts again straight after the last step's wait |
| 4 | none | Runs once, then stops |
conditiontimerld (milliseconds) after it finishes, then starts again. Up to 999 hours on firmware 2.10forevernoneConditions can use bigger than (>), smaller than (<), at least (>=), at most (<=) and equal (==, which matches when the values are less than 0.1 apart). One sensor can use one comparison, or a range of two joined by AND/OR. A rule can add a second sensor expression and join the two with AND/OR, for example (distance < 20) AND (soilMoisture < 20). The dashboards offer motion and button only as true (1) or false (0).
| Field | Values |
|---|---|
Sensor (lr, lr2) | temperature (DHT11), humidity, ds18b20Temp, lightLevel, gasLevel, soilMoisture, distance, potValue, motionDetected, buttonPressed |
Step action (a) | led_on, led_off, led_pwm, rgb_red, rgb_green, rgb_blue, rgb_yellow, rgb_purple, rgb_cyan, rgb_white, rgb_off, buzzer_on, buzzer_off, relay_on, relay_off, servo_move, lcd_display |
lr, lr2)temperature (DHT11), humidity, ds18b20Temp, lightLevel, gasLevel, soilMoisture, distance, potValue, motionDetected, buttonPresseda)led_on, led_off, led_pwm, rgb_red, rgb_green, rgb_blue, rgb_yellow, rgb_purple, rgb_cyan, rgb_white, rgb_off, buzzer_on, buzzer_off, relay_on, relay_off, servo_move, lcd_displayrelay_on and relay_off are for low-voltage things only, never mains electricity. A misspelled sensor name is treated as temperature, so check the spelling. In a rule, buzzer_on keeps the buzzer on until a buzzer_off step.
Pick the parts of a rule below. The tool writes the matching X message and says in plain words what the rule will do. It sends nothing to a board.
{
"m": "X",
"a": 0,
"s": {
"e": 1,
"n": "Plant alert",
"lm": "condition",
"as": 1,
"lr": "soilMoisture",
"lo": "<",
"lt": 25,
"rg": 0,
"c2": 1,
"lr2": "temperature",
"lo2": ">",
"lt2": 30,
"rg2": 0,
"co": "AND",
"st": [
{ "a": "led_on", "v": 255, "d": 0 },
{ "a": "buzzer_on", "v": 0, "d": 500 },
{ "a": "buzzer_off", "v": 0, "d": 1000 },
{ "a": "led_off", "v": 0, "d": 1000 }
]
}
}e: Enabled (1) or not (0)n: Name, up to 20 characterslm: Loop mode: condition, timer, forever or noneas: Autostart: start at power-on (modes other than condition)tt, ld: Timer type (interval) and interval in mslr, lo, lt: First sensor, its comparison and its numberrg, ro, o2, t2: Range on the first sensor: on (1), AND/OR, second comparison and numberc2: 1 turns on the second sensor expressionlr2, lo2, lt2: Second sensor, its comparison and its numberrg2, ro2, o3, t3: Range on the second sensor: on (1), AND/OR, second comparison and numberco: Joins the two expressions: AND or ORst: Steps: each has a (action), v (value) and d (wait in ms); lcd_display also has lm, t1 and t2i, ms, rn: Only in the q list: index, manually stopped, runningX.a is 0 add, 1 delete, 2 start, 3 stop or 4 toggle enabled. All but add also need the rule index i. There is no update action: when you edit a rule, the dashboard deletes it and adds the new version, which can change the order.
How rules start, lock parts and compete, and what changed in firmware 2.10, is in How rules run.
In a servo_move step, v is the angle to move to. Optional fields set how the motor gets there:
| Field | Meaning |
|---|---|
rv | 1 makes v an offset (−180 to 180) from the current angle, worked out once when the step takes the motor |
mv | Movement time in ms, up to 3,600,000; 0 moves at once |
sw | 1 Range: start angle to target; 2 Range + reverse: there and back (firmware 2.7+) |
sa | Start angle for a sweep, 0–180° |
rv1 makes v an offset (−180 to 180) from the current angle, worked out once when the step takes the motormv0 moves at oncesw1 Range: start angle to target; 2 Range + reverse: there and back (firmware 2.7+)sa{ "a": "servo_move", "v": 150, "d": 1000, "rv": 0, "mv": 2000, "sw": 2, "sa": 30 }This step moves from 30° to 150° over 2 seconds, back over 2 seconds, then holds for 1 second. REST rule forms use stepN_relative, stepN_movementMs, stepN_sweep and stepN_startAngle. Limits, and what happens when rules compete for the servo, are in Servo control.
These are the commands behind the knob and motor settings in Part 1.
J or /api/servomapping)sn picks the sensor: 0 DHT11 temperature (0–50 °C), 1 humidity, 2 DS18B20 temperature (−55 to 125 °C), 3 light, 4 gas or 5 soil moisture (each 0–100).
Each command replaces the settings. A missing en turns the link off. A missing iv means not reversed. A missing sn keeps the current sensor. Missing il/ih/al/ah use the sensor's full range and 0–180°, with a 3° deadband (db) and 35% smoothing (sm).
/api/servomapping returns 400 for invalid values and 409 when you turn it on while a rule holds the motor.
P or /api/potmapping)0/none, 1/led, 2/rgb or 3/servo. servo returns 409 while a rule holds the motor.
The firmware is Arduino Code/MakerBuddy/MakerBuddy.ino in the public source (opens in a new tab). For step-by-step upload, see Install by USB.
esp32:esp32:esp32), with "esp32 by Espressif Systems". Firmware 2.10 is built and checked with core 3.3.7.You do not need ESP32Servo. The firmware drives the motor itself, on LEDC channel 8 at 50 Hz.
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
me-no-dev/ESPAsyncWebServer
me-no-dev/AsyncTCP
bblanchon/ArduinoJson@^6.21.3
paulstoffregen/OneWire
milesburton/DallasTemperature
adafruit/DHT sensor library
adafruit/Adafruit Unified Sensor
marcoschwartz/LiquidCrystal_I2CThe board also has spare UART and I²C sockets. Using them needs your own code.
Uploading your own sketch replaces the MakerBuddy firmware until you upload it again. Before you upload, check the board and the serial port, keep a copy of a firmware file you know works, and write down the settings that matter. Test on the real board.
Still stuck?
Type demo in any MakerBuddy dashboard to try the controls with sample readings. Or send us your setup question.
Will it work on your school Wi-Fi?
Answer four quick questions. The panel tells you what is ready and what to do first.
1.Is the school Wi-Fi 2.4 GHz?
Most routers and most phone hotspots offer 2.4 GHz. The board cannot join a 5 GHz network.
2.Does it join with just a network name and password?
No sign-in web page (a captive portal) and no username (enterprise Wi-Fi).
3.Will the board and the students' laptops or tablets be on the same network?
The dashboard talks to the board over your own Wi-Fi, not over the internet.
4.Which devices will students use?
Pick all that apply.
What MakerBuddy needs
Internet is needed only to open the web app or install the extension. Readings and commands stay on your network.
Test a device before the day: open the dashboard and type demo as the device name to see sample data with no board.
Showing all 15 parts.

These work as soon as the board has power. Nothing to plug in.
The brain is a small Wi-Fi computer (an ESP32) on the same board. The plug-in parts go into labelled sockets, and most plugs fit only one way. The distance sensor and the text screen use four wires, matched by name.
They sense temperature, humidity, distance, movement, smoke or gas, and soil moisture.






They move, switch or show something.

Ideas: Parking gate, clothesline, moving character
Taught in lesson 14
Ideas: Small fan or bulb that turns itself on (low-voltage only)
Low-voltage things only. Never connect mains electricity.
Taught in lesson 15
Pick your device above to see which dashboard to use.
In short: Chrome or Edge → the Chrome extension. Firefox → the Firefox add-on. Safari, or Chrome on an iPhone or iPad → the web app. Android phones cannot be used yet.
Give every board its own name and write it on a label. Then each group connects to its own board. Enter how many boards you have to get a list of names and a sheet to print.
Board names (12)
The sheet has four columns: board name, the setup network shown on its screen, its IP address and the group. Fill in the last three as you set each board up.
Writes text only. It sends nothing to a board.
REST (curl)
curl -X POST \
"http://makerbuddy-01.local/api/led" \
--data "state=true&pwm=200&blink=false"WebSocket (JSON)
Send to ws://makerbuddy-01.local/ws
{"m":"L","s":1,"p":200,"b":0}Rule builder
Writes text only. It sends nothing to a board.
Steps (4 of 10)
In plain words
"Water reminder" It runs the steps once, waits 30 minutes after the last step, then starts again. It starts as soon as it is added, and again whenever the board powers on.
WebSocket message (X add)
Send to ws://{DEVICE_HOST}/ws
{
"m": "X",
"a": 0,
"s": {
"e": 1,
"n": "Water reminder",
"lm": "timer",
"as": 1,
"tt": "interval",
"ld": 1800000,
"st": [
{"a":"rgb_blue","v":0,"d":2000},
{"a":"buzzer_on","v":0,"d":200},
{"a":"buzzer_off","v":0,"d":0},
{"a":"rgb_off","v":0,"d":0}
]
}
}