When practicing in the golf sim I use driveway markers. I think I bought them at Home Depot a long time ago.
They’re always getting bumped by us or our cats. Another issue is one marker lays on top of another so it’s end can be closer to the golf ball. Two problems that could easily be solved by an old piece of oak and a bunch of passes through the table saw.
In the photo above you can barely see the left side groove, which is for the first alignment stick and allows me to use the edge of the hitting strip as a reference line for everything. The two grooves running parallel to it give me an option to place the second stick closer to my feet. I penciled in a line on the top side to extend the perpendicular stick, which I guess is no longer needed. A quick sanding eliminated any sharp edges.
Solving a problem doesn’t always need a complicated solution. Quick and simple can often get the job done.
ESP32 G -> CAN Board G -> RJ45 Pin 8 -> Capacitor stripe side
ESP32 3.3 -> CAN Board 3.3 -> Capacitor non-stripe side
ESP32 Pin 4 -> CAN Board TX
ESP32 Pin 5 -> CAN Board RX
CAN Board CANH -> RJ45 Pin 5
CAN Board CANL -> RJ45 Pin 4
Start with this YAML for your ESPHome device:
# Add your standard esphome, ota, api, and wifi sections here at the top
logger:
level: DEBUG
esp32:
board: esp32-c3-devkitm-1
framework:
type: esp-idf
canbus:
- platform: esp32_can
id: can
tx_pin: GPIO4
rx_pin: GPIO5
bit_rate: 125KBPS
can_id: 0x05
use_extended_id: false
on_frame:
- can_id: 0x000
can_id_mask: 0x000 # This catches EVERYTHING
then:
- lambda: |-
std::string res = "";
for (int i = 0; i < x.size(); i++) {
char buf[5];
sprintf(buf, "%02X ", x[i]);
res += buf;
}
ESP_LOGD("ALORAIR_FINDER", "Received ID: 0x%03X, Data: %s", can_id, res.c_str());
# ====== Periodic Polling to Request Status ======
interval:
- interval: 10s
then:
- canbus.send:
can_id: 0x123
use_extended_id: false
data: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
This will test sending and receiving. After you flash the device and have it connected to the dehumidifier, open the ESPHome device log and look for lines like below.
If you see errors after the send or don’t receive messages back, try changing the bit_rate from 125 to 50, install, and recheck the logs.
If you do receive messages back, make note of the value after Received ID, which is 0x123 above. Then open up the ESPHome device’s YAML again and replace everything below type: esp-idf with the following.
If your ID was different than 0x123 (0x3b0 seems common), change the can_id under on_frame. Update mobile_app_YOUR_PHONE for your phone. Install this new code to the device. Go to Settings -> Devices & services -> ESPHome. If your device isn’t already listed, add it, and click through to see the entities. Hopefully you see the Controls and Sensors with data.
Try to toggle the power and change the setpoint. If it’s working, the dehumidifier should respond. Good luck! If all is working, I suggest adjusting your logging level to WARN. There is some stuff in the YAML to alert if the unit sends data that isn’t recognized, because there might be flags or statuses not implemented.
If you install the stack-in-card via HACS, here’s some YAML for your dashboard. Make sure to update the entity names to match what you have.
The table on my new Bucktool drill press is about 9-1/2 inches square, which is too small. I set out to make something bigger. First, a side quest though. I still had the top from my old work table, which was two sheets of 3/4″ plywood glued together.
A big chunk was going to the sanding station, which had sheet metal over junk MDF for the top. The brackets holding it to the metal frame were always getting pulled out.
I cut up the plywood lamination and rounded the corners and edges. I changed the orientation of the machines to give me easier access to the big belt sander, which saved about 10″ of width. I also mounted a power strip.
The small chunk of plywood was for a new drill press table. I worked on the layout, routed the middle for inserts, and routed slots.
The wide slots are for T-tracks. One of my requirements for the table was to make it function with the Magswitch fence I had. So I bought 3/4 x 1/4″ steel bar stock, which fit perfectly through the top of the T-track. The shorts slots in the table offset to the left got additional pieces of metal, allowing me to move the fence over to clear the quill feed handles.
When I bought the flat bar, I place it across both magnets and I could not pull it off. That turned out to be a flawed test. After screwing in the short pieces as shown in that last picture I could easily move the fence. I did some research and found the 1/4″ thick metal was fine, but it needed more surface area to hit the magnetic field. I clamped two pieces of the metal side by side and couldn’t move the fence.
So I bought a piece of 1/4 x 4 x 12″ flat cold rolled steel and cut two 5-1/2″ pieces. Then I did a bunch of sanding and drilling before spraying three coats of lacquer.
On the table, I cut and glued plywood in the back section of the T-track slots. After the glue dried, I routed large areas for the plates. I cut the T-tracks shorter, sanded the table, and gave it 3 coats of shellac. Then I mounted the tracks and metal plates. This turned out to be a much better solution.
The crank shaft on the drill press is actually 9/16″, so the coupling was too large (I could only find metric sizes on Amazon). Three small pieces of aluminum can were thick enough to shim it and test. I connected an 18 volt laptop power brick, added extra weight to the table, and toggled the switch. It worked!
I had ordered both the DC90 and DC350 motors and went with the DC90. The beefier motor was too slow and has way more torque than I’ll even need.
I bought a 24v power supply, motor speed controller, fuse, and 12 gauge wire. I also grabbed a toggle switch and limit switches from my parts bins. The toggle switch was so AC wouldn’t be constantly flowing to the power supply. The limit switches were to prevent the table from going out of bounds, which I do enough of on the golf course! I wired things up for an initial test.
When I bought the speed controller there wasn’t much documentation and I was hoping the FWD/REV terminals would allow me to directly connect limit switches. They didn’t. At least not out of the box. The controller has two modes; you can use the switch on the front or bypass it with your own switch connected to those back terminals. In the picture above I got the bypass working with my limit switches and the 3-position switch used in my initial testing.
This was unnecessarily complex, disabled the switch on the front of the box, and meant I’d have to mount the additional switch. I opened up the controller to see how it worked. The case’s switch was plugged in to the circuit board, so I popped off the connector and connected it through my circuit instead. Bingo!
It was a latching switch, but I wanted a momentary 3-position switch, so I bought a pack. I soldered wires to the new switch, clipped a bit of plastic from the case, and fed the wires through the larger hole. The new switch was a perfect fit.
I took the original table off the drill press and brought it to my assembly table. First, I mounted the tables together and then screwed down the power supply. I made a custom bracket for the speed controller.
I forgot about the on/off switch though! So I scrapped the mounting bracket and made a new one. The second one used a piece of metal saved from a table top basketball game and turned out much better.
To make a proper coupling that would join the two shafts I ordered parts from Motion Industries:
The middle piece is flexible and would help with any misalignment, but I wanted to try to get the shafts lined up the best I could. I think it turned out pretty well.
Then I put the table back on the drill press column. After squaring it to the cart, I tightened hose clamps around the rack to prevent rotation. I never need that functionality. Then I figured out the limit switch triggers and positions.
I hadn’t used the drill press much, but while drilling the holes in that piece of butter knife, I was already sick of the cluck key location. So I mounted the clip on the side of the table instead.
I forgot to cut corners off the inserts earlier, so quickly did that. It’ll make it much easier to get the inserts out of the table. Eight spares should last a long time.
Here’s a quick demo of the motor and limit switches. This thing is awesome!
This project was a lot of fun and is a big improvement to the machine.
One of our daily tasks is to clean out the cat litter boxes and we (on maybe I just wanted an excuse to automate part of the process!) run in to a couple of small problems:
We usually don’t know if the other has already cleaned them.
We obviously don’t want to forget.
Since I primarily took over this job, I’ve been using a daily reminder, but it’s on my iPhone nagging me all day, even though it’s set for noon. I only need a reminder when it doesn’t get done.
I thought of a solution with an ESPHome based device and Home Assistant. I used a WEMOS D1 Mini Lite, WEMOS OLED Shield, button, red LED, green LED, and 220 Ohm resistors. I connected everything on a breadboard for testing and then made it more permanent.
Key functionality:
During the day, the green LED will be lit if the litter boxes have been cleaned and the red LED if they need to be cleaned. If we’re walking by, green means keep going and red means stop here.
At night (8pm to 8am), the LEDs are off, unless the device is woken up.
Press the button to turn on the display and status LED if at night. The display shows the last time the litter was cleaned in one of three formats, depending on how long it’s been.
Today 1:23 PM
Yesterday 2:48 PM
2 days ago 11:00 AM
Press the button when the display is on to update the litter box last cleaned date and time. The LEDs flash to signify something is happening. The new date and time gets shown on the display.
After 30 seconds the display turns off.
At 4pm send a reminder to our phones if the litter boxes need to be cleaned.
In Home Assistant a toggle can disable the reminders. Useful when we’re on vacation.
I also added a couple of simpler helpers via Settings -> Devices & services -> Helpers:
Cat Litter Last Cleaned – Date and time
Cat Litter Reminders – Toggle
Finally, I added cards to a Home Assistant dashboard. See screenshots of the different states of each card below.
Here’s the dashboard YAML if you want it.
type: horizontal-stack
title: Cat Litter
cards:
- type: custom:mushroom-template-card
primary: >-
{% set last = states('input_datetime.cat_litter_last_cleaned') |
as_datetime %}
{% if last is none %}
Unknown State
{% else %}
{% set diff = (now().date() - last.date()).days %}
{% if diff == 0 %}
Cleaned Today
{% else %}
Needs Cleaning
{% endif %}
{% endif %}
icon: mdi:emoticon-poop
features_position: bottom
secondary: >-
{% set last = states('input_datetime.cat_litter_last_cleaned') |
as_datetime %}
{% if last is none %}
???
{% else %}
{% set diff = (now().date() - last.date()).days %}
{% if diff > 0 %}
{{ last.strftime('%b %-d') }} -
{% endif %}
{{ last.strftime('%-I:%M %p') }}
{% endif %}
color: |-
{% if is_state('binary_sensor.litter_needs_cleaning', 'on') %}
red
{% else %}
green
{% endif %}
tap_action:
action: more-info
icon_tap_action:
action: perform-action
perform_action: script.cat_litter_cleaned
target: {}
confirmation:
text: Are you sure you want to update the last cleaned date/time to now?
entity: input_datetime.cat_litter_last_cleaned
- type: custom:mushroom-entity-card
entity: input_boolean.cat_litter_reminders
name: Reminders
tap_action:
action: toggle
hold_action:
action: more-info
icon_color: amber
If we get a reminder, it looks like this. We can click I did it to update the date/time to now if we forgot to press the button on the physical device. With the automation set to run at 4pm, we should rarely see this though.
The final device lives right next to the waste bag dispenser I made. This way it’s easy to see the state and hit the button when cleaning out the litter. Here are photos in place with a few different states.
This project was so fun. Using Google Gemini for stuff like this makes it so much faster. I’ve had some of these microcontrollers and other parts for almost a decade so it’s nice to finally put them to use.
What other features or automations would you add to this? Have you built anything similar?
A new year means it’s time for a recap of my maker projects from last year. We’ve settled in to the new house, which let to quite a few home automation things and setting up my shop.
I’ll likely turn this into something that interfaces with my Home Assistant server to control different devices around my house.
The PyPortal has been sitting on a shelf ever since. Way back in February, it caught my eye, and I picked it up, not remembering what it’s capabilities were. Then I started upgrading IKEA air quality monitors and even made my own. Since I’m at the desk in my office a large portion of the week I thought I would make that 2019 prediction come true.
I could show a bunch of data on the screen and the PyPortal has a touchscreen, so I could display buttons for triggering things around the house. The device also has connectors for doing GPIO, so I got the idea of adding an LED strip, which I could use for notifications. I even had a meter long strip of Adafruit Mini Skinny NeoPixels I had bought in 2017 and never touched that would be perfect. I needed to buy a 2.0mm JST PH Connector kit in order to make a wire that would connect to the pack of the PyPortal. I ended up using a piece of Cat6 cable, even though I only needed 3 of the 8 wires inside.
All of this was done back in March. I quickly began having issues with the ethernet cable and the small JST connectors, so I put this post on pause. Figured it was time to finally fix this before the end of the year. While testing, I determined the LED strip got fried up at some point. It was probably some kind of short from the janky wire.
Here’s what my display looks like.
My favorite aspect of the project and code is being able to publish MQTT messages from Home Assistant, which the PyPortal listens for and reacts to. I can send various commands, such as fill:blue, which turns all of the LEDs blue, or whatever color I set. I have commands to chase a color from one side to the other, bounce a color from left to right and back to the left, pulse the entire strip, animate a rainbow, or set the brightness. Since I don’t have another strip of Neopixels, in order to create a demo video, I wired up a 24 LED circle. You’ll have to imagine the effects on the back of my desk, lighting up the wall.
I can manually send these MQTT messages as shown in the demo, but the real power comes from automations. For example, the LEDs automatically pulse blue when the washing machine is done and pink when the dryer is done.
With the different effects and color combinations, the possibilities are endless. What kind of automations would you run?
Over the years, I’ve seen many versions of a shop air filter, made from box fans and 20×20 inch furnace filters. A few years ago I picked up some old box fans on Facebook Marketplace and bought a pack of filters from Sam’s Club. They’ve been stacked in the corner.
It was finally time to build my air filter. I removed the back covers, feet, handles, and knobs from the fans. I got my first look at the switches inside, which are nearly identical.
I’d easily be able to wire the fans together, so I removed the switches and power cords.
I put together a frame from OSB, cut slots to feed the wires through, and screwed the box fans in.
Then I grabbed wood that had been salvaged from a pallet to construct a door.
On the back side, I used glue and brad nails to attach plywood rails. I also made tabs to hold the filters secure.
I attached the door with a couple hinges and made some notched tabs to hold the door shut.
A plastic screw container was a good side, so I used hot glue to secure the boards and then wired up all of the fan connections.
I’m not sure if I’ll ever use the button, but it allows me to cycle between the three speeds and turn it off. The three LEDs show which speed is currently running. The only thing I got wrong was reversing the low and high speeds, which was a quick fix in the ESPHome code. Speaking of the code, here’s mine.
I used Google Gemini to help and it had a great suggestion to track the run time and add a maintenance reminder when it was time to replace the filters.
In Home Assistant I created some automations. My dust collector uses a smart plug, so when it draws electricity, the air filter automatically turns on at high speed. When the dust collector turns off, the air filter continues to run for 15 minutes before turning off. If I had to remember to turn on the air filter all the time, it would rarely happen, so this is amazing.
I’m still on lifting restrictions for several weeks so Brandi helped me install the air filter on the ceiling.
With my big shop table done and a lot of storage space to fill, I finally started to tackle the boxes and piles of things that have been sitting in the corner for nearly a year and a half. First up was towels, rags, cleaning supplies, and first aid. We had an unused plastic shelving unit, so I put it to use. It went between my Ryobi cordless tool wall and the utility sink.
Finally trying to pick things up!
I’ve been draping a hand towel over the edge of the sink since moving in and now I had a place to mount a towel bar. I quickly cut some 2×4 to size, so it would fit between the edges on the side of the top shelf.
Truss head screws, so they’re less likely to pull through the plastic.
Then I drilled four holes in the edge of that shelf and mounted the piece of wood. I drilled two more holes in a piece of PVC and mounted it to the wood.
Ignore the sand marks.
This was a quick project and it’s extremely useful. I love simple shop builds where functionality is the most important requirement.
Several years ago my aunt made me Lions and Red Wings towels that I use in the shop.