Esphome BBQ meter with fan/electric element control

I’ve been building a BBQ meter in order to control my charcoal and electric smoker.

What i managed to get so far:

  1. 4 x independent meat probes (blue led = plugged, red led = temp not reached, green led = temp reached)
  2. 1 x bbq/smoker main probe
  3. 1 x ble (Bluetooth) probe *did not work
  4. control fan for charcoal
  5. control electric element for smoker
  6. control via hassio
  7. control via hardware (potentiometer/screen)
  8. custom 3d printed case

More info to come…





Part list (prices in canadian dollars, not including 3D filament to print and wires):

Part Amount Cost Link
ESP32-WROOM-32U 1 $6.34 Esp32-devkitc Core Board Esp32 Development Board Esp32-wroom-32d Esp32-wroom-32u Wifi+bluetooth-compatible Iot Nodemcu-32 - Integrated Circuits - AliExpress
MAX6675 5 $2.55 Max6675 Module + K Type Thermocouple Thermocouple Senso Temperature Degrees Module For Arduino - Integrated Circuits - AliExpress
PCF8575 Module Expansion IO 1 $1.81 Pcf8575 Module Expansion Io Port Expander Board Dc 2.5-5.5v I2c Communication Control 16 Io Ports For Arduino - Integrated Circuits - AliExpress
RGB modules 5 $0.48 5pcs RGB modules, Supporting the Arduino|Integrated Circuits| - AliExpress
5010-5V Fans 2 $0.99 5010 Dc5v/12v/24v 3d Printer Turbine Fan 5010 3d Printer Part Fan 50mm (50*50*10mm) 2pin Brushless Cooling Fan 5/12/24v Fan Duct - 3d Printer Parts & Accessories - AliExpress
IRF520 Fan module 1 $1.50 2pcs Irf520 Top Mosfet Button Mosfet Driver Module For Arduino Mcu Arm For Raspberry Pi 3.3v-5v Irf520 Power Mos Pwm Dimming Led - Integrated Circuits - AliExpress
KY-040 Potentiometer 1 $2.79 KY 040 Potentiometer Switch 360 Degrees Rotary Encoder Sensor Swith with Development Board Aluminium Alloy Cap Pins for Arduino|Switches| - AliExpress
SSD1306 12864 LCD Screen 1 $4.00 Tzt Original 0.96 Inch Oled Iic Serial White Oled Display Module 128x64 I2c Ssd1306 12864 Lcd Screen Board For Arduino - Lcd Modules - AliExpress
DC12V Plug M/F 1 $0.92 DC12V 5pcs Male + 5pcs Female 2.5x5.5MM DC Power Plug Jack Adapter Connector Plug CCTV Cameras 5.5*2.5mm Socket|Connectors| - AliExpress
3.5mm Plugs M/F 5 $0.43 5/10pcs 3.5mm 2/3/4 Pole Mono Audio Connectors Jack Plug Headphone Male Adapter Jack Plug Male Jack Plug Wire Terminals H1 - Transmission & Cables - AliExpress
K Type male female M/F 1 $0.77 WHCYonline 5 pair K Type male female mini Connectors plug Thermocouple Temperature Sensors New|Temperature Instruments| - AliExpress
$37.41
Wireless Meat 1 $47.68 Wireless Meat Food Thermometer For Oven Grill Bbq Steak Turkey Smoker Kitchen Smart Digital Bluetooth Barbecue New Year Gifts - Household Thermometers - AliExpress
K Type Thermocouple Probe 1 $4.03 2m K Type Thermocouple Probe 50mm/100mm/150mm/200mm Stainless Steel Thermocouple 0-400℃ Temperature Sensor - Thermometer Hygrometer - AliExpress
Thermocouple K pointy 4 $10.41 Type Thermocouple K 6 "(150mm) With Probe 90 Pointed & Tip For Bbq Smoker Bend - Thermometer Hygrometer - AliExpress
$93.35
4 Likes

Yeah i kept adding and adding and it just got messier and messier with so many wires… Would have been nice to have a custom board.

1 Like

It’s never too late for a v.2

1 Like

@ThaNerd - Looks great. Would love to see the parts list - especially for the meat probe.

I have a basic one that just measures ambient temperature and publishes that to HA over MQTT - saves me checking the temp plus alerts if out of temperate range.

Added the part list, the meat probes are IMO the expensive part especially the Bluetooth one which I have yet to make it work with my setup. I went with the K-type for the hardwired ones since I’ve read they were more reliable.

1 Like

This is my esphome code: https://github.com/TurboTronix/BBQ-Meter/blob/main/esphome.yaml

As soon as I add more number sensors to adjust probe1, probe2, probe3 and probe4 like I am doing with bbq_adj it crashes, anyone knows why?

number
  - platform template
    name BBQ_adjustment
    id bbq_adj
    optimistic true
    min_value -100
    initial_value 0
    max_value 100
    step 1

another issue:

- platform: rotary_encoder
    name: "Rotary Encoder"
    id: rotary
    pin_a: GPIO35
    pin_b: GPIO34
    resolution: 2
    restore_mode: ALWAYS_ZERO
    on_value:
      then:
        - if:
           condition:
             lambda: 'return id(edit) == true;'
           then:
              - if:
                  condition:
                    lambda: 'return id(rotary).state > id(bbq_max_temp);'
                  then:
                    - sensor.rotary_encoder.set_value:
                            id: rotary
                            value: 100
              - if:
                  condition:
                    lambda: 'return id(rotary).state < 100;'
                  then:
                    - sensor.rotary_encoder.set_value:
                            id: rotary
                            value: !lambda |-
                              return id(bbq_max_temp);   
        - if:
           condition:
             lambda: 'return id(edit) == false;'
           then:
              - if:
                  condition:
                    lambda: 'return id(rotary).state > id(page_max);'
                  then:  
                    - sensor.rotary_encoder.set_value:
                        id: rotary
                        value: !lambda |-
                           return id(page_min);
                  
              - if:
                  condition:
                    lambda: 'return id(rotary).state < id(page_min);'
                  then:  
                    - sensor.rotary_encoder.set_value:
                        id: rotary
                        value: !lambda |-
                          return id(page_max);               
              - display.page.show: !lambda |-
                  if (id(rotary).state==1) 
                  {
                    return id(page1);
                  } 
                  if (id(rotary).state==2) 
                  {
                    return id(page2);
                  } 
                  if (id(rotary).state==3) 
                  {
                    return id(page3);
                  } 
                  if (id(rotary).state==4) 
                  {
                    return id(page4);
                  } 
                  if (id(rotary).state==5) 
                  {
                    return id(page5);
                  } 
                  if (id(rotary).state==6) 
                  {
                    return id(page6);
                  } 
                  if (id(rotary).state==7) 
                  {
                    return id(page7);
                  } 
                  if (id(rotary).state==8) 
                  {
                    return id(page8);
                  }
                  if (id(rotary).state==9) 
                  {
                    return id(page9);
                  } 
              - globals.set:
                  id:  current_page
                  value: !lambda |-
                    return id(rotary).state;

this code gives the following error:
warning: control reaches end of non-void function [-wreturn-type]

Did you ever finish this? What’s your PID → blower logic look like?

I just stumbled across this. I built something akin to it many years ago and finally integrated it with HA via MQTT messages. The code is a bit too complex to write in ESPHome so I wrote it in VS Code (PIO).

If you’re interested in the code I can post it (written in VS Code).


Operation Video Here: https://photos.app.goo.gl/RkparAgsFFbYpken6

I used an ESP32, 20x4 LCD, rotary encoder, MAX31855 breakout, and a 24v brushless DC fan + motor controller on Aliexpress here.

I built 6 DS18B20 meat probes using some SS tubing and teflon high-temp wire. The sensor goes in the meat and never exceeds the DS18 max limit as long as it’s in the meat. If it isn’t in the meat it needs to be outside the smoker.

Sure. The more the merrier. I’ve gotten quite a bit done the ESPhome. The specific PID → Blower implementation is what I’m mainly working out. I have a AD1115 with a NTC 100k probes and they’re working fine. It’s a headless box so it’s a touch simpler, but I may put an OLED on it if I get bored. :slight_smile: I could definitely do this natively, but am wanting to use ESPHome for the heck of it.

EDIT: That’s a lot of blower you have! I only need about 6cfm.