<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Featured &#8211; About Things | A Hans Scharler Blog</title>
	<atom:link href="https://nothans.com/category/featured/feed" rel="self" type="application/rss+xml" />
	<link>https://nothans.com</link>
	<description>Life, Comedy, Games, Tech, Marketing, and Community</description>
	<lastBuildDate>Sat, 29 Aug 2026 15:56:59 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/cropped-settings.png?fit=32%2C32&#038;ssl=1</url>
	<title>Featured &#8211; About Things | A Hans Scharler Blog</title>
	<link>https://nothans.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">114568856</site>	<item>
		<title>CABLE 82 TV Channel Build Tutorial (Rasbperry Pi 3 B+ and Old CRT TV)</title>
		<link>https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv</link>
					<comments>https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Mon, 24 Aug 2026 19:40:30 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[CABLE 82]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5604</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>Last month I published&nbsp;<a href="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel">CABLE 82</a>, a recreation of the 1982 cable community bulletin board channel that runs on a Raspberry Pi and an old CRT. That post covered the software and the shape of the hardware. Then a reader with a Pi 3 B+ hit &#8220;localhost refused to connect,&#8221; we went back and forth in the comments, and I realized I had never written down the whole build. I will take you from a blank SD card to a glowing tube.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="750" height="600" data-attachment-id="5682" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/image-148" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?fit=2000%2C1600&amp;ssl=1" data-orig-size="2000,1600" data-comments-opened="0" data-image-title="CABLE 82 Dialed In on a Magnavox TV from 1987" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?fit=750%2C600&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=750%2C600&#038;ssl=1" alt="" class="wp-image-5682" style="width:540px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=1024%2C819&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=768%2C614&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=1536%2C1229&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=750%2C600&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=1320%2C1056&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=80%2C64&amp;ssl=1 80w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?w=2000&amp;ssl=1 2000w" sizes="(max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">CABLE 82 Dialed In on a Magnavox TV from 1987</figcaption></figure>
</div>


<p>The TV is a Magnavox portable from Facebook Marketplace, a Perfect View from August 1987, the kind with a handle on top, a rod antenna, and a 12V jack so you could watch it in the car.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" decoding="async" width="395" height="431" data-attachment-id="5658" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/magnavox-marketplace-listing-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?fit=395%2C431&amp;ssl=1" data-orig-size="395,431" data-comments-opened="0" data-image-title="Magnavox marketplace listing" data-image-description="" data-image-caption="&lt;p&gt;The Marketplace listing: a black Magnavox portable CRT showing static&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?fit=395%2C431&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?resize=395%2C431&#038;ssl=1" alt="The Marketplace listing: a black Magnavox portable CRT showing static" class="wp-image-5658" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?w=395&amp;ssl=1 395w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?resize=275%2C300&amp;ssl=1 275w" sizes="(max-width: 395px) 100vw, 395px" /></figure>
</div>


<p>The Pi is a 3 Model B+, the same board the reader had.</p>


<h2 class="wp-block-heading" id="the-false-start-the-original-2012-pi">The false start: the original 2012 Pi</h2>

<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" decoding="async" width="697" height="544" data-attachment-id="5672" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/pi-model-b-and-debian6-sd-card-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?fit=697%2C544&amp;ssl=1" data-orig-size="697,544" data-comments-opened="0" data-image-title="Pi model b and debian6 sd card" data-image-description="" data-image-caption="&lt;p&gt;The original Raspberry Pi Model B from 2012 with the element14 &amp;#8220;Debian 6 for Linux&amp;#8221; SD card it shipped with&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?fit=697%2C544&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?resize=697%2C544&#038;ssl=1" alt="The original Raspberry Pi Model B from 2012 with the element14 &quot;Debian 6 for Linux&quot; SD card it shipped with" class="wp-image-5672" style="width:523px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?w=697&amp;ssl=1 697w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?resize=300%2C234&amp;ssl=1 300w" sizes="(max-width: 697px) 100vw, 697px" /></figure>
</div>


<p>My first instinct was to do this on the least capable Pi in the house: the original Model B, board marked &#8220;(c)2011.12&#8221;, with the 4GB &#8220;Debian 6 for Linux&#8221; card it came with. Raspberry Pi OS still supports it, which is remarkable for a 2012 computer, and Node.js 20 installs from&nbsp;<code>apt</code>. The server half of CABLE 82 would run fine.</p>



<p>The TV half would not. The original Pi&#8217;s chip is ARMv6, and no current browser runs on it. Raspberry Pi dropped Chromium for ARMv6 in 2023; on the current OS it prints &#8220;This hardware doesn&#8217;t support NEON SIMD extensions&#8221; and quits. Firefox is built for ARMv7 and dies the same way. The one engine left is WebKit, with no JavaScript JIT, on a 700MHz core. I looked at that path for a while&#8230; and decided the tutorial should be about the channel, not about heroics.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="728" height="509" data-attachment-id="5657" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/pi-3b-plus-and-16gb-microsd-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?fit=728%2C509&amp;ssl=1" data-orig-size="728,509" data-comments-opened="0" data-image-title="Pi 3b plus and 16gb microsd" data-image-description="" data-image-caption="&lt;p&gt;The Raspberry Pi 3 Model B+ in its clear case, heatsinks on, with the 16GB microSD card that is about to become a TV channel&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?fit=728%2C509&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?resize=728%2C509&#038;ssl=1" alt="The Raspberry Pi 3 Model B+ in its clear case, heatsinks on, with the 16GB microSD card that is about to become a TV channel" class="wp-image-5657" style="width:484px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?w=728&amp;ssl=1 728w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?resize=300%2C210&amp;ssl=1 300w" sizes="auto, (max-width: 728px) 100vw, 728px" /></figure>
</div>

<h2 class="wp-block-heading" id="what-you-need">What you need</h2>


<ul class="wp-block-list">
<li>Raspberry Pi 3 Model B+&nbsp;(or any Pi 2 or newer; a Pi 4 is a fine choice too).</li>



<li>16GB or larger microSD card.&nbsp;Mine is a SanDisk Ultra PLUS 16GB.</li>



<li>Micro-USB power supply, 5V at 2.5A. The 3 B+ is the last micro-USB Pi.</li>



<li>A network connection<strong>.</strong>&nbsp;Ethernet is simplest for the first boot; the 3 B+ also has Wi-Fi.</li>



<li>4:3 CRT with a coax antenna input.&nbsp;Almost every tube TV has one, which is why this is the path that works for everybody. Mine has nothing else: one F connector marked EXT ANT and a switch to pick it over the built-in rod antenna.</li>



<li><a href="https://www.amazon.com/dp/B0DRCZKLBQ?tag=nothans">HDMI-to-RF modulator</a>, the little box that turns HDMI into channel 3 or 4 on the antenna input, plus a short coax cable. Mine is an &#8220;HDM61&#8221; unit; the same design is sold under a dozen brand names.</li>



<li>Another computer to flash the card and to SSH into the Pi (needs to be on the same network as the Raspberry Pi).</li>
</ul>


<h2 class="wp-block-heading" id="step-1-put-the-os-on-the-card">Step 1: Put the OS on the card</h2>

<h3 class="wp-block-heading" id="which-image-and-why">Which image, and why</h3>


<p><strong>Raspberry Pi OS (64-bit), the desktop edition.</strong>&nbsp;It is the image Raspberry Pi&#8217;s own kiosk tutorial tells you to use, and there are two practical reasons to follow that advice on a 3 B+:</p>



<ol class="wp-block-list">
<li>Chromium is the browser that will show the channel, and the 64-bit build is the one that has been solid on Pi 3 boards (the 32-bit build had a will-not-start bug on the Pi 3 as recently as this summer).</li>



<li>Node.js 22 from NodeSource is 64-bit only now; their installer refuses 32-bit outright.</li>
</ol>



<p>The image is a 1.3GB download and takes about 6GB on the card, so 16GB leaves plenty of room.</p>


<h3 class="wp-block-heading" id="flash-it-with-raspberry-pi-imager">Flash it with Raspberry Pi Imager</h3>


<p>Raspberry Pi Imager is the right tool here, and not balenaEtcher or&nbsp;<code>dd</code>, because it can bake the hostname, your user, and SSH into the card before the Pi ever boots. That is what makes the headless setup work. Install it from&nbsp;<a href="https://www.raspberrypi.com/software/">raspberrypi.com/software</a>, put the card in your computer, and walk the steps down the left side.</p>



<p><strong>Device: Raspberry Pi 3.</strong>&nbsp;This filters the OS list to images that run on the 3 family (A+, B, B+, and Compute Module 3).</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5656" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-device-raspberry-pi-3-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager device raspberry pi 3" data-image-description="" data-image-caption="&lt;p&gt;Raspberry Pi Imager 2.0, Device step, with Raspberry Pi 3 selected&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?resize=682%2C482&#038;ssl=1" alt="Raspberry Pi Imager 2.0, Device step, with Raspberry Pi 3 selected" class="wp-image-5656" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p><strong>OS: Raspberry Pi OS (64-bit).</strong>&nbsp;The top entry, marked Recommended. Not the 32-bit one and not the &#8220;Legacy&#8221; one; Legacy is the older Bookworm release.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5659" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-os-raspberry-pi-os-64-bit-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager os raspberry pi os 64 bit" data-image-description="" data-image-caption="&lt;p&gt;Imager OS step: Raspberry Pi OS (64-bit), a port of Debian Trixie with the Raspberry Pi Desktop, released 2026-06-18&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager OS step: Raspberry Pi OS (64-bit), a port of Debian Trixie with the Raspberry Pi Desktop, released 2026-06-18" class="wp-image-5659" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p><strong>Storage: the SD card.</strong>&nbsp;Imager hides your system drives by default, so the only thing in the list should be the card. Mine shows up as a 14.8GB &#8220;Generic MassStorageClass USB Device&#8221; because it is in a USB reader; a 16GB card really is about 14.8GB once you count the way computers count.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5662" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-storage-16gb-card-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager storage 16gb card" data-image-description="" data-image-caption="&lt;p&gt;Imager Storage step showing the 14.8GB USB card reader mounted as I:\&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager Storage step showing the 14.8GB USB card reader mounted as I:\" class="wp-image-5662" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p><strong>Customisation.</strong>&nbsp;This is the part Etcher cannot do, and the reason the Pi will come up on the network with no screen attached.</p>



<ul class="wp-block-list">
<li><strong>Hostname:</strong>&nbsp;<code>cable82</code>. That gives you&nbsp;<code>cable82.local</code>&nbsp;later, so you never have to go looking for an IP address.</li>



<li><strong>Localisation:</strong>&nbsp;your time zone and keyboard layout. The clock on the channel runs off the Pi&#8217;s time zone, so get this right.</li>



<li><strong>User:</strong>&nbsp;a username and password you will remember. You will type them into SSH in a few minutes.</li>



<li><strong>Wi-Fi:</strong>&nbsp;your network name and password. I set it even though the Pi would be on Ethernet for the build; it means the finished TV can live anywhere in the house.</li>



<li><strong>Remote access:</strong>&nbsp;<strong>enable SSH</strong>, password authentication. I also left Raspberry Pi Connect on, which gives you a browser-based remote shell to the Pi from anywhere, handy for a TV that lives in a corner.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5660" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-hostname-cable82-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager hostname cable82" data-image-description="" data-image-caption="&lt;p&gt;Imager Customisation: hostname set to cable82&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager Customisation: hostname set to cable82" class="wp-image-5660" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5663" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-ssh-enabled-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager ssh enabled" data-image-description="" data-image-caption="&lt;p&gt;Imager Customisation, Remote access: Enable SSH on, password authentication&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager Customisation, Remote access: Enable SSH on, password authentication" class="wp-image-5663" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p>Then&nbsp;<strong>Write</strong>. Imager asks once more whether it can erase the card, downloads the image, writes it, and verifies it. The write was the slow part: this card takes data at about 10MB/s, so the 6GB image plus verification took about fifteen minutes.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5661" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-writing-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager writing" data-image-description="" data-image-caption="&lt;p&gt;Imager, write in progress at 9MB/s&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager, write in progress at 9MB/s" class="wp-image-5661" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5664" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-write-complete-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager write complete" data-image-description="" data-image-caption="&lt;p&gt;Imager, write complete, with the list of customisations applied&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager, write complete, with the list of customisations applied" class="wp-image-5664" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>

<h3 class="wp-block-heading" id="first-boot">First boot</h3>


<p>Imager ejects the card when it is done. Card into the Pi, Ethernet in, power in. The green light flickers for a while: the first boot resizes the filesystem to fill the card, generates SSH keys, and runs a one-time setup pass. Mine answered on the network in well under two minutes. Then from your computer:</p>



<pre class="wp-block-code"><code>ssh yourname@cable82.local</code></pre>



<p>(If&nbsp;<code>.local</code>&nbsp;does not resolve on your machine, your router&#8217;s device list will show a&nbsp;<code>cable82</code>&nbsp;with an IP address; SSH to that instead.)</p>



<p>Three things to check while you are in:</p>



<pre class="wp-block-code"><code>head -2 /etc/os-release
free -m
df -h /</code></pre>



<p>Mine came back Debian 13 (trixie), 905MB of memory with about 570MB available, and a 15GB root partition with 8.4GB free after the 6GB image. The Pi had been up eight minutes by the time I got around to asking. Then bring the image current:</p>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt full-upgrade -y</code></pre>



<p>(<code>sudo</code>&nbsp;asks for your password; recent Raspberry Pi OS releases turned off passwordless sudo by default.)</p>



<p>The Pi is on the network, current, and answering SSH.</p>


<h2 class="wp-block-heading" id="step-2-nodejs">Step 2: Node.js</h2>


<p>CABLE 82 is a Node.js app with no dependencies, so Node is the only thing to install. It needs Node 18 or newer, and a fresh Raspberry Pi OS has none at all:</p>



<pre class="wp-block-code"><code>$ node -v
bash: node: command not found</code></pre>



<p>That line, by the way, is almost certainly what was behind the reader&#8217;s &#8220;localhost refused to connect.&#8221; No Node, no server, nothing listening, and the browser reports it as a refused connection.</p>



<p>Two ways to get Node on a 64-bit Pi. The quick one is the distro&#8217;s own package,&nbsp;<code>sudo apt install nodejs</code>, which gives you Node 20. I went with NodeSource for Node 22, the current long-term-support line, and it is two commands:</p>



<pre class="wp-block-code"><code>curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v</code></pre>



<p>Mine printed&nbsp;<code>v22.23.2</code>. (NodeSource only builds for 64-bit now; if you flashed the 32-bit image, use the&nbsp;<code>apt</code>&nbsp;route.)</p>


<h2 class="wp-block-heading" id="step-3-cable-82-on-the-air">Step 3: CABLE 82 on the air</h2>


<p>With Node in place, the channel itself is next. Clone it and start it:</p>



<pre class="wp-block-code"><code>cd ~
git clone https://github.com/nothans/cable-82
cd cable-82
node server.js</code></pre>



<p>It prints every address it answers on:</p>



<pre class="wp-block-code"><code>CABLE 82 broadcasting
  http://localhost:1982   (a browser on this machine)
  http://192.168.68.93:1982   (a browser on another device on your network)
Control room: http://localhost:1982/config</code></pre>



<p>Read that second line carefully, because it is the other half of the reader&#8217;s problem.&nbsp;<code>localhost</code>&nbsp;means &#8220;this machine.&#8221; Typed into a browser on your laptop, it asks the laptop for a channel it does not have. The&nbsp;<code>192.168.x.x</code>&nbsp;address is the Pi as seen from everywhere else on your network, and that is the one to open from the laptop. I did, and the channel was there: blue screen, the clock, the crawl.</p>



<figure class="wp-block-image"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="5673" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/channel-from-laptop-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?fit=1024%2C768&amp;ssl=1" data-orig-size="1024,768" data-comments-opened="0" data-image-title="Channel from laptop" data-image-description="" data-image-caption="&lt;p&gt;The channel from a browser on the laptop: blue clock page, LATEST crawl&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=750%2C563&#038;ssl=1" alt="The channel from a browser on the laptop: blue clock page, LATEST crawl" class="wp-image-5673" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=750%2C563&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<p>The first run also writes a&nbsp;<code>config.json</code>&nbsp;next to the server, which is where everything you change in the control room ends up. Open&nbsp;<code>http://192.168.68.93:1982/config</code>&nbsp;from the laptop and make it yours: channel name, your messages, your feeds, your town for the weather. Save, and the channel picks it up within about twenty seconds.</p>



<figure class="wp-block-image"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="5674" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/control-room-from-laptop-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?fit=1024%2C768&amp;ssl=1" data-orig-size="1024,768" data-comments-opened="0" data-image-title="Control room from laptop" data-image-description="" data-image-caption="&lt;p&gt;The control room from the laptop: the whole channel in one screen&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=750%2C563&#038;ssl=1" alt="The control room from the laptop: the whole channel in one screen" class="wp-image-5674" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=750%2C563&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>


<h3 class="wp-block-heading" id="make-it-a-service">Make it a service</h3>


<p>Ctrl-C the server and hand it to systemd so it runs at boot and restarts if it ever dies. Create&nbsp;<code>/etc/systemd/system/cable82.service</code>:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=CABLE 82
After=network-online.target

&#91;Service]
ExecStart=/usr/bin/node /home/cable82/cable-82/server.js
Restart=always
User=cable82

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p>Both&nbsp;<code>cable82</code>s are my username; use yours (<code>whoami</code>&nbsp;tells you, and&nbsp;<code>which node</code>&nbsp;confirms the path on the&nbsp;<code>ExecStart</code>&nbsp;line). Then:</p>



<pre class="wp-block-code"><code>sudo systemctl enable --now cable82
systemctl status cable82</code></pre>



<p><code>active (running)</code>&nbsp;with the broadcasting lines in its log, and&nbsp;<code>sudo journalctl -u cable82 -f</code>&nbsp;is where to look if anything is ever wrong. The server sits at about 46MB of memory.</p>


<h2 class="wp-block-heading" id="step-4-chromium-in-kiosk-mode">Step 4: Chromium in kiosk mode</h2>


<p>The desktop image already logs in automatically and starts a Wayland session (the compositor is called labwc; the old LXDE desktop from earlier Pi OS releases is gone). Chromium 151 is preinstalled. All we have to do is tell the session to open Chromium full screen on the channel at login.</p>



<p>The file for that is&nbsp;<code>~/.config/labwc/autostart</code>. Create it with these lines:</p>



<pre class="wp-block-code"><code># CABLE 82 kiosk: wait for the channel server, then put Chromium on it full screen.
until curl -s -o /dev/null http://localhost:1982; do sleep 1; done
/usr/bin/lwrespawn /usr/bin/chromium http://localhost:1982   --kiosk --noerrdialogs --disable-infobars --no-first-run --no-memcheck   --disable-lcd-text --autoplay-policy=no-user-gesture-required   --enable-features=OverlayScrollbar --password-store=basic --start-maximized &amp;</code></pre>



<p>A few of those deserve a word:</p>



<ul class="wp-block-list">
<li>The&nbsp;<code>until curl</code>&nbsp;loop waits for the server to answer before launching the browser. Without it, Chromium can win the race at boot and show &#8220;localhost refused to connect&#8221; on the TV, and nothing ever tells it to try again.</li>



<li><code>lwrespawn</code>&nbsp;is a Raspberry Pi helper that restarts a program if it dies, so a crash brings the channel back instead of leaving a blank desktop.</li>



<li><code>--no-memcheck</code>&nbsp;stops Chromium from popping a low-memory warning over the channel on a 1GB board.</li>



<li><code>--autoplay-policy=no-user-gesture-required</code>&nbsp;lets the background music start without anyone clicking.</li>



<li><code>--disable-lcd-text</code>&nbsp;turns off subpixel font smoothing so the chunky text stays crisp white instead of going pink at the edges.</li>



<li><code>--password-store=basic</code>&nbsp;keeps the desktop keyring from asking for a password at login.</li>
</ul>



<p>Then turn off screen blanking, or the TV goes dark after ten minutes:</p>



<pre class="wp-block-code"><code>sudo raspi-config nonint do_blanking 1</code></pre>



<p>(Or interactively:&nbsp;<code>sudo raspi-config</code>&nbsp;&gt; Display Options &gt; Screen Blanking &gt; No.)</p>



<p>If you are here from the original post: the&nbsp;<code>chromium-browser --kiosk</code>&nbsp;line and the&nbsp;<code>/etc/xdg/lxsession/LXDE-pi/autostart</code>&nbsp;file in that post were for the previous Pi OS release. On Trixie the binary is&nbsp;<code>chromium</code>&nbsp;and the file is the labwc one above.</p>



<p>Reboot. About a minute later Chromium was running full screen on the channel. I could tell from the laptop before the TV was even connected:</p>



<pre class="wp-block-code"><code>$ pgrep -a chromium | head -1
1407 /usr/lib/chromium/chromium ... --kiosk ... http://localhost:1982</code></pre>


<h3 class="wp-block-heading" id="check-the-power-supply-while-you-are-here">Check the power supply while you are here</h3>


<p>This section wasn&#8217;t what I expected. My first run was off a phone charger&#8230;</p>



<pre class="wp-block-code"><code>$ vcgencmd get_throttled
throttled=0xd0005
$ vcgencmd measure_clock arm
frequency(48)=600064000</code></pre>



<p>Any bit set in&nbsp;<code>get_throttled</code>&nbsp;is a complaint;&nbsp;<code>0x5</code>&nbsp;means under-voltage and throttling right now, and the clock line shows a 1.4GHz Pi running at 600MHz. It worked, in the sense that the channel was on, but at less than half speed. With a proper 5V 2.5A supply the under-voltage bits cleared and the clock came back up. If you only run one check from this whole post on an existing Pi, run that one.</p>



<p>(On a 3 B+ you may still see&nbsp;<code>0x80008</code>&nbsp;with a 1.2GHz clock: that is the board&#8217;s own soft temperature limit at 60C, normal with Chromium running, and nothing to do with power.)</p>


<h2 class="wp-block-heading" id="step-5-the-crt">Step 5: The CRT</h2>


<p><em>Note on photos of the TV&#8230; it turns out to be surprisingly hard to get a good photo of the screen. My phone didn&#8217;t capture it well. Also, the screen had a giant smudge backed into the acrylic covering the TV. I had to use Novus 2 polish to clean up the smudge and scratches. I assure you that it looks better in person&#8230;</em></p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5671" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/first-picture-on-the-magnavox-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="First picture on the magnavox" data-image-description="" data-image-caption="&lt;p&gt;The first picture: CABLE 82 on the Magnavox over channel 3, fuzzy, red page, no sound yet&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The first picture: CABLE 82 on the Magnavox over channel 3, fuzzy, red page, no sound yet" class="wp-image-5671" style="width:316px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>The Magnavox has exactly one way in: an F connector marked EXT ANT.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="403" height="547" data-attachment-id="5665" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/magnavox-back-panel-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?fit=403%2C547&amp;ssl=1" data-orig-size="403,547" data-comments-opened="0" data-image-title="Magnavox back panel" data-image-description="" data-image-caption="&lt;p&gt;The back of the Magnavox: one EXT ANT jack and a switch to choose it over the rod antenna&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?fit=403%2C547&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?resize=403%2C547&#038;ssl=1" alt="The back of the Magnavox: one EXT ANT jack and a switch to choose it over the rod antenna" class="wp-image-5665" style="width:293px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?w=403&amp;ssl=1 403w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?resize=221%2C300&amp;ssl=1 221w" sizes="auto, (max-width: 403px) 100vw, 403px" /></figure>
</div>


<p>So the path is HDMI out of the Pi into a small&nbsp;<a href="https://www.amazon.com/dp/B0DRCZKLBQ?tag=nothans">HDMI-to-RF modulator</a>, coax from the modulator into the TV, and the TV tuned to channel 3. The box is the size of a cassette tape, takes USB power, has a CH3/CH4 switch, and its spec sheet says everything you need to know: NTSC out, 480p to 1080p in, sound on the 4.5MHz carrier (that means mono, the way 1982 did it).</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="730" data-attachment-id="5666" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/hdm61-modulator-specs-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?fit=1500%2C1459&amp;ssl=1" data-orig-size="1500,1459" data-comments-opened="0" data-image-title="Hdm61 modulator specs" data-image-description="" data-image-caption="&lt;p&gt;The modulator&amp;#8217;s spec table: NTSC, CH3/CH4, 480p-1080p in, sound system M = 4.5MHz&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?fit=750%2C729&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=750%2C730&#038;ssl=1" alt="The modulator's spec table: NTSC, CH3/CH4, 480p-1080p in, sound system M = 4.5MHz" class="wp-image-5666" style="aspect-ratio:1.0281124497991967;width:447px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?w=1500&amp;ssl=1 1500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=300%2C292&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=1024%2C996&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=768%2C747&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=750%2C730&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=1320%2C1284&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5670" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/modulator-and-tv-clock-page-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="Modulator and tv clock page" data-image-description="" data-image-caption="&lt;p&gt;The HDMI-to-RF modulator and the TV, clock page on screen&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The HDMI-to-RF modulator and the TV, clock page on screen" class="wp-image-5670" style="width:408px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>Plug it all in and the channel was on the tube.</p>


<h3 class="wp-block-heading" id="send-it-a-43-picture">Send it a 4:3 picture</h3>


<p>The box scales whatever it gets to fill the 4:3 tube. CABLE 82 draws a 4:3 stage, so if the Pi sends a widescreen mode, the stage gets squashed. The Pi has to output 640&#215;480. On current Raspberry Pi OS the old&nbsp;<code>hdmi_group</code>&nbsp;and&nbsp;<code>hdmi_mode</code>&nbsp;lines in&nbsp;<code>config.txt</code>&nbsp;are dead; the kernel takes its orders from&nbsp;<code>cmdline.txt</code>, and the desktop then picks its own mode on top of that. So it takes two small files.</p>



<p>Append to the end of the single long line in&nbsp;<code>/boot/firmware/cmdline.txt</code>:</p>



<pre class="wp-block-code"><code>video=HDMI-A-1:640x480@60D vc4.force_hotplug=1</code></pre>



<p>The&nbsp;<code>D</code>&nbsp;forces the output on even when nothing answers, and&nbsp;<code>force_hotplug</code>&nbsp;keeps it on if the modulator never raises the hotplug pin (mine does not). Then pin the desktop to the same mode in&nbsp;<code>~/.config/kanshi/config</code>:</p>



<pre class="wp-block-code"><code>profile crt {
  output HDMI-A-1 mode 640x480 position 0,0
}</code></pre>



<p>Without that second file, the desktop on my Pi happily chose 1024&#215;768 on top of the kernel&#8217;s 640&#215;480.</p>


<h3 class="wp-block-heading" id="give-it-an-edid-so-there-is-sound">Give it an EDID, so there is sound</h3>


<p>The first picture had no audio, and the reason is a good one: cheap modulators send no EDID, the little data block a screen uses to introduce itself. No EDID means the Pi does not know the &#8220;screen&#8221; can hear, and it refuses to send HDMI audio at all. So I made it one. The CABLE 82 <a href="https://github.com/nothans/cable-82">repo</a> now ships a 256-byte EDID that describes a 640&#215;480 4:3 screen with stereo audio (<code>edid/cable82-640x480-audio.bin</code>, with the script that generates it). Hand it to the kernel:</p>



<pre class="wp-block-code"><code>sudo mkdir -p /lib/firmware/edid
sudo cp ~/cable-82/edid/cable82-640x480-audio.bin /lib/firmware/edid/cable82.bin</code></pre>



<p>and add one more parameter to that same&nbsp;<code>cmdline.txt</code>&nbsp;line:</p>



<pre class="wp-block-code"><code>drm.edid_firmware=HDMI-A-1:edid/cable82.bin</code></pre>



<p>Reboot.&nbsp;<code>wpctl status</code>&nbsp;now lists an HDMI sink next to the headphone jack; make it the default and give it some level (WirePlumber remembers):</p>



<pre class="wp-block-code"><code>wpctl status                       # find the "(HDMI)" sink's number
wpctl set-default &lt;number&gt;
wpctl set-volume &lt;number&gt; 0.8</code></pre>



<p>The channel&#8217;s music came out of the Magnavox&#8217;s speaker on the next page turn.</p>


<h3 class="wp-block-heading" id="hide-the-cursor">Hide the cursor</h3>


<p>A mouse pointer sat in the middle of the picture with no mouse attached. The HDMI CEC input counts as a pointer device, so the desktop draws one. The fix is a labwc keybinding that hides it, pressed automatically after boot. Copy&nbsp;<code>/etc/xdg/labwc/rc.xml</code>&nbsp;to&nbsp;<code>~/.config/labwc/rc.xml</code>, add inside&nbsp;<code>&lt;keyboard&gt;</code>:</p>



<pre class="wp-block-code"><code>&lt;keybind key="A-W-h"&gt;&lt;action name="HideCursor"/&gt;&lt;/keybind&gt;</code></pre>



<p>then&nbsp;<code>sudo apt install wtype</code>&nbsp;and add to the end of&nbsp;<code>~/.config/labwc/autostart</code>:</p>



<pre class="wp-block-code"><code>(sleep 10; wtype -M alt -M logo -P h -p h -m logo -m alt) &amp;</code></pre>


<h3 class="wp-block-heading" id="the-detour-composite">The detour: composite</h3>


<p>Before the HDMI modulator arrived I tried the other way in: the Pi&#8217;s 3.5mm AV jack, a 4-pole cable to yellow/red/white, and an old composite-to-RF adapter. On a Pi 3 that means&nbsp;<code>sudo raspi-config nonint do_composite 0</code>, which turns HDMI off; on every Pi before the 5 it is one or the other. The Wayland desktop also does not trust the composite connector until it is told the mode, so&nbsp;<code>video=Composite-1:720x480@60ie,tv_mode=NTSC</code>&nbsp;goes on the&nbsp;<code>cmdline.txt</code>&nbsp;line too.</p>


<h2 class="wp-block-heading" id="step-6-make-it-readable">Step 6: Make it readable</h2>

<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5676" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/did-you-know-page-best-legibility-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="Did you know page best legibility" data-image-description="" data-image-caption="&lt;p&gt;The DID YOU KNOW page, the most legible of the bunch before CRT mode&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The DID YOU KNOW page, the most legible of the bunch before CRT mode" class="wp-image-5676" style="width:453px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>With everything working, the verdict on a 9-inch 1987 tube over RF: the big clock and the crawl read fine, the small text was marginal, and the red and blue pages were worse than the cyan one. That is NTSC. It smears saturated color, it clips pure white (broadcast engineers kept white at 90% for a reason), and the hard drop shadow under every character turned into ringing.</p>



<p>So I added a CRT set of settings in the control room for much older TVs&#8230;</p>



<figure class="wp-block-image"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="320" data-attachment-id="5669" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/control-room-crt-panel-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?fit=813%2C347&amp;ssl=1" data-orig-size="813,347" data-comments-opened="0" data-image-title="Control room crt panel" data-image-description="" data-image-caption="&lt;p&gt;The CRT panel: CRT mode, text size, and the overscan margin&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?fit=750%2C320&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=750%2C320&#038;ssl=1" alt="The CRT panel: CRT mode, text size, and the overscan margin" class="wp-image-5669" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?w=813&amp;ssl=1 813w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=300%2C128&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=768%2C328&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=750%2C320&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<ul class="wp-block-list">
<li><strong>CRT mode</strong>&nbsp;swaps in a softer palette (less saturated backgrounds, 90% white) and drops the drop shadow.</li>



<li><strong>Text size</strong>&nbsp;enlarges the body text, kicker, crawl, and the small header lines, from 1 to 1.5x. I run 1.25 on this set; the big clock stays as it is.</li>



<li><strong>Overscan safe margin</strong>&nbsp;was already there; raise it if the TV crops the edges.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="640" height="480" data-attachment-id="5668" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/crt-mode-640x480-from-laptop-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?fit=640%2C480&amp;ssl=1" data-orig-size="640,480" data-comments-opened="0" data-image-title="Crt mode 640&amp;#215;480 from laptop" data-image-description="" data-image-caption="&lt;p&gt;CRT mode as the Pi renders it: softer blue, no shadow, text at 1.25x&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?fit=640%2C480&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=640%2C480&#038;ssl=1" alt="CRT mode as the Pi renders it: softer blue, no shadow, text at 1.25x" class="wp-image-5668" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?w=640&amp;ssl=1 640w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</div>


<p>Turning text size up found one more thing: at 640&#215;480 the weather card no longer fit and its HI/LO line slid under the crawl.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5675" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/weather-page-crt-mode-cut-off-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="Weather page crt mode cut off" data-image-description="" data-image-caption="&lt;p&gt;The weather page with the bottom line cut off&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The weather page with the bottom line cut off" class="wp-image-5675" style="width:586px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>So pages now fit themselves: if the content would overflow, the weather card gives up its sunrise/sunset line first, then shrinks just enough, and a long fact does the same.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="640" height="480" data-attachment-id="5650" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/weather-page-fit-640x480" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?fit=640%2C480&amp;ssl=1" data-orig-size="640,480" data-comments-opened="0" data-image-title="Weather page fit 640&amp;#215;480" data-image-description="" data-image-caption="&lt;p&gt;The weather page fitting the 640&amp;#215;480 frame after the fix&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?fit=640%2C480&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=640%2C480&#038;ssl=1" alt="" class="wp-image-5650" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?w=640&amp;ssl=1 640w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 640px) 100vw, 640px" /><figcaption class="wp-element-caption">The weather page fitting the 640&#215;480 frame after the fix</figcaption></figure>
</div>


<p>All of that is in the repo as of this post.</p>


<h2 class="wp-block-heading" id="what-changed-because-of-this-build">What changed because of this build</h2>


<p>Three things fed straight back into the project:</p>



<ul class="wp-block-list">
<li>The&nbsp;<a href="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel">original post</a>&nbsp;now carries a dated update: the kiosk command is&nbsp;<code>chromium</code>&nbsp;in&nbsp;<code>~/.config/labwc/autostart</code>&nbsp;on current Raspberry Pi OS, and the power supply got the mention it earned.</li>



<li>The&nbsp;<a href="https://github.com/nothans/cable-82#running-it-on-a-real-crt-raspberry-pi">repo README</a>&nbsp;was rewritten from this build, step by step as tested, with a Troubleshooting section keyed to the exact errors from the comment thread.</li>



<li>CABLE 82 itself gained CRT mode, the text size setting, the fit-to-page behavior, and the shipped EDID, because a real 1987 tube demanded all four.</li>
</ul>



<p>That is the part I did not expect when a reader said &#8220;localhost refused to connect&#8221;: the failure report turned into the best test pass the project ever had!</p>


<h2 class="wp-block-heading" id="a-channel-of-your-own">A channel of your own</h2>

<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="5667" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/the-whole-chain-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?fit=1255%2C945&amp;ssl=1" data-orig-size="1255,945" data-comments-opened="0" data-image-title="The whole chain" data-image-description="" data-image-caption="&lt;p&gt;The whole chain: Raspberry Pi 3 B+, RF modulator, coax, and the 1987 Magnavox on channel 3, on the air&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?fit=750%2C565&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=750%2C565&#038;ssl=1" alt="The whole chain: Raspberry Pi 3 B+, RF modulator, coax, and the 1987 Magnavox on channel 3, on the air" class="wp-image-5667" style="aspect-ratio:1.3280763643909526;width:484px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?w=1255&amp;ssl=1 1255w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=750%2C565&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>The Magnavox sits there now, tuned to channel 3, being a channel. The clock, the bake-sale energy, the crawl, the beautiful-music bed coming out of a mono speaker that was built when the music was new. It is a thirty-nine-year-old TV showing a channel that stopped existing before the TV was built, fed by a computer the size of a deck of cards, and the whole thing works because somebody left a comment saying it did not.</p>



<p>So: if you build one and it refuses to connect, say so. That is how this channel gets better, and it is very 1982 of you. Thanks.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5604</post-id>	</item>
		<item>
		<title>The MATLAB Engineering Super Stack (Updated for GitHub Copilot + MATLAB MCP Core Server)</title>
		<link>https://nothans.com/the-matlab-engineering-super-stack</link>
					<comments>https://nothans.com/the-matlab-engineering-super-stack#comments</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sun, 22 Mar 2026 16:26:32 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Agentic Engineering]]></category>
		<category><![CDATA[GitHub Copilot]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[MATLAB MCP Server]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5365</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>Back in November 2025 I wrote about the <a href="https://nothans.com/the-engineering-super-stack-matlab-visual-studio-code-claude-code" data-type="post" data-id="5223">Engineering Super Stack: MATLAB, Visual Studio Code, and Claude Code</a> wired together with the MATLAB MCP server. The thesis was simple. These tools are better together than apart.</p>



<p>Five months later, I owe that post an update. The stack evolved. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5367" data-permalink="https://nothans.com/super-stack-featured" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-featured.png?fit=750%2C750&amp;ssl=1" data-orig-size="750,750" data-comments-opened="0" data-image-title="the matlab engineering super stack" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-featured.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-featured.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5367" style="width:422px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-featured.png?w=750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-featured.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-featured.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-featured.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-featured.png?resize=500%2C500&amp;ssl=1 500w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>

<h2 class="wp-block-heading" id="the-agent-engineer">The Agent Engineer</h2>


<p>Seth DeLand has been at MathWorks for fifteen years. He started in mechanical engineering, building mathematical models for diesel combustion and NOx emissions. Control strategies, optimization, statistics. The kind of work where getting the math wrong means the engine doesn&#8217;t meet spec. Now he&#8217;s a Product Manager focused on generative AI, and he recently sat down with Jousef Murad on the Engineered-Mind Podcast to talk about what agentic AI means for engineers.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/p8JpYGnaegs?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p>He&#8217;s not selling hype. He&#8217;s describing what he sees happening in real engineering workflows.</p>



<p>On what makes agentic AI different from chatting with an LLM:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;Rather than it just generating a bunch of text, it&#8217;s actually going to generate calls to APIs&#8230; now they&#8217;re not limited just to generate text as an output, they can actually start to work on the same artifacts that we humans are working on.&#8221;</p>



<p>Seth DeLand</p>
</blockquote>



<p>That distinction matters. An LLM gives you text. An agent gives you results. It runs your code, checks your tests, detects your toolboxes, and iterates on errors. No copying and pasting between windows. The agent works on your project, not a hypothetical version of it.</p>



<p>Seth didn&#8217;t frame this as tools replacing engineers. He framed it as engineers leveling up.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;It&#8217;s more that we are working at a higher level now. We are thinking much more in terms of what are the problems, what are the constraints, how do I shape the solution space so that I can turn my AI loose in that solution space and have it go work&#8230; and then come back to me.&#8221;</p>



<p>Seth DeLand</p>
</blockquote>



<p>You&#8217;re not being replaced. You&#8217;re being promoted. The engineer becomes the one who defines the problem, sets the constraints, and shapes the space where the AI works. That&#8217;s not a demotion. That&#8217;s what senior engineers have always done, except now the junior engineer on your team is an agent that never sleeps and never complains about the build system.</p>



<p>Seth also nailed something I&#8217;ve been feeling since I started using agents for prototyping:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;Why not have it implement four prototypes of all of those different options and see which one I like the best&#8230; it allows me to shorten that cycle to get from kind of an idea to some type of proof of concept.&#8221;</p>



<p>Seth DeLand</p>
</blockquote>



<p>Four prototypes. Not four design docs. Four working implementations. You compare running code instead of arguing about architecture diagrams. I wrote a whole post about this idea (<a href="https://nothans.com/twenty-prototypes">Twenty Prototypes</a>), and hearing a MathWorks PM describe the same workflow independently tells me this isn&#8217;t a niche trick. It&#8217;s becoming the default.</p>


<h2 class="wp-block-heading" id="what-changed-since-november">What Changed Since November</h2>


<p>When I wrote the <a href="https://nothans.com/the-engineering-super-stack-matlab-visual-studio-code-claude-code">original super stack post</a>, the MATLAB MCP Core Server was at version 0.1. First release. Five tools. It worked, but everything is moving fast.</p>



<p>Here&#8217;s where things stand now:</p>



<p>The MCP server is at v0.6.1. MathWorks shipped cross-platform MCP Bundles for one-click installs, added headless mode so MATLAB can run without the desktop GUI, and introduced MCP Resources that feed coding guidelines directly to your AI agent. Nine releases in five months.</p>



<p>MATLAB Copilot launched with R2025a in May 2025. It&#8217;s a purpose-built AI assistant inside the MATLAB desktop with chat, code generation, autocomplete, and error explanations. They even upgraded the underlying model to GPT-5 mini a month after launch.</p>



<p>Simulink Copilot entered beta. You can chat with your Simulink models, search and trace features with natural language, and troubleshoot errors through a dedicated panel on the canvas. If you do model-based design, this is worth watching.</p>



<p>And the MCP ecosystem around it exploded. MCP now has 97 million monthly SDK downloads and over 10,000 active servers. Anthropic donated it to the Linux Foundation. OpenAI, Google, Microsoft, and Amazon all support it. MathWorks calls MCP &#8220;USB-C for AI,&#8221; and that metaphor has held up.</p>



<p>The super stack isn&#8217;t experimental anymore. It&#8217;s infrastructure.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="572" height="1024" data-attachment-id="5368" data-permalink="https://nothans.com/super-stack-infographic" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-infographic.png?fit=750%2C1343&amp;ssl=1" data-orig-size="750,1343" data-comments-opened="0" data-image-title="matlab engineering super stack infographic" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-infographic.png?fit=572%2C1024&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-infographic.png?resize=572%2C1024&#038;ssl=1" alt="" class="wp-image-5368" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-infographic.png?resize=572%2C1024&amp;ssl=1 572w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-infographic.png?resize=168%2C300&amp;ssl=1 168w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/03/super-stack-infographic.png?w=750&amp;ssl=1 750w" sizes="auto, (max-width: 572px) 100vw, 572px" /></figure>
</div>

<h2 class="wp-block-heading" id="the-setup-matlab-mcp-vs-code-github-copilot">The Setup: MATLAB MCP + VS Code + GitHub Copilot</h2>


<p>The original post showed the stack with Claude Code. This time I&#8217;ll set it up with GitHub Copilot in VS Code. Same MCP server, different AI client. That&#8217;s the whole point of an open protocol.</p>



<p><strong>What you need:</strong></p>



<ul class="wp-block-list">
<li>MATLAB R2020b or later, installed and on your system PATH</li>



<li>Visual Studio Code with the GitHub Copilot Chat extension</li>



<li>The MATLAB Extension for VS Code (optional but recommended)</li>



<li>A GitHub Copilot subscription (the free tier works)</li>
</ul>



<p><strong>Step 1: Download the MCP server</strong></p>



<p>Go to the&nbsp;<a href="https://github.com/matlab/matlab-mcp-core-server/releases">MATLAB MCP Core Server releases page</a>&nbsp;on GitHub and download the binary for your platform:</p>



<ul class="wp-block-list">
<li>Windows: <code>matlab-mcp-core-server-win64.exe</code></li>



<li>macOS Apple Silicon: <code>matlab-mcp-core-server-maca64</code></li>



<li>macOS Intel: <code>matlab-mcp-core-server-maci64</code></li>



<li>Linux: <code>matlab-mcp-core-server-glnxa64</code></li>
</ul>



<p>On macOS or Linux, make it executable:&nbsp;<code>chmod +x matlab-mcp-core-server-*</code></p>



<p><strong>Step 2: Configure VS Code</strong></p>



<p>Create a&nbsp;<code>.vscode</code>&nbsp;folder in your project root (if it doesn&#8217;t exist), then add an&nbsp;<code>mcp.json</code>&nbsp;file:</p>



<pre class="wp-block-code"><code>{
    "servers": {
        "matlab": {
            "type": "stdio",
            "command": "C:\\path\\to\\matlab-mcp-core-server-win64.exe",
            "args": &#91;
                "--matlab-root=C:\\Program Files\\MATLAB\\R2025a",
                "--initial-working-folder=C:\\Users\\you\\YourProject"
            ]
        }
    }
}</code></pre>



<p>Replace the paths with your actual MATLAB installation and project directory. On macOS or Linux, use forward slashes.</p>



<p><strong>Step 3: Validate</strong></p>



<p>Open GitHub Copilot Chat in VS Code and ask: &#8220;Which MATLAB toolboxes are available?&#8221;</p>



<p>If everything is wired up, the MCP server launches MATLAB in the background and Copilot responds with your installed toolboxes. The first call takes a few seconds while MATLAB starts. After that, it&#8217;s fast.</p>



<p><strong>What you get:</strong></p>



<p>Five tools, available to any MCP-compatible AI client:</p>



<ul class="wp-block-list">
<li><code>detect_matlab_toolboxes</code>: Lists your installed MATLAB version and toolboxes</li>



<li><code>check_matlab_code</code>: Runs static analysis on a .m file (style issues, errors, deprecated functions)</li>



<li><code>evaluate_matlab_code</code>: Executes a MATLAB code string and returns the output</li>



<li><code>run_matlab_file</code>: Runs a .m script file</li>



<li><code>run_matlab_test_file</code>: Runs MATLAB unit tests</li>
</ul>



<p>Plus two MCP Resources (added in v0.3) that feed your AI agent the official MATLAB coding guidelines. The agent doesn&#8217;t just write MATLAB code. It writes MATLAB code that follows MathWorks conventions.&nbsp;<code>1i</code>&nbsp;instead of&nbsp;<code>i</code>&nbsp;for imaginary numbers.&nbsp;<code>k</code>&nbsp;for loop variables. Error handling the way the documentation says to.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;I think one of the impressive things about a lot of these AI models is that if you can teach it about the system that it&#8217;s working on&#8230; they can build on top of existing things that you have.&#8221;</p>



<p>Seth DeLand</p>
</blockquote>



<p>That&#8217;s exactly what the MCP server does. It teaches the AI about your MATLAB installation, your toolboxes, your project. The agent isn&#8217;t guessing. It&#8217;s building on what you already have.</p>


<h2 class="wp-block-heading" id="you-are-the-engineer">You Are the Engineer</h2>


<p>The tools got better. The MCP server matured. The ecosystem grew. But the most important upgrade in the super stack isn&#8217;t software.</p>



<p>It&#8217;s you.</p>



<p>You decide what problem to solve. You set the constraints. You shape the solution space and turn the agent loose inside it. When it comes back with four prototypes, you&#8217;re the one with the engineering judgment to pick the one that actually works for your system.</p>



<p>The agent writes code, runs tests, checks for deprecated functions. It can&#8217;t decide what matters. That&#8217;s your job.</p>



<p>Seth put it well: engineers are working at a higher level now. Not because the tools forced them to, but because the tools finally caught up to where the interesting problems live. The math. The constraints. The design decisions that determine whether the system works when it meets the real world.</p>



<p>The super stack is MATLAB, VS Code, and an AI agent connected through MCP. The stack doesn&#8217;t work without the engineer at the top of it.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/the-matlab-engineering-super-stack/feed</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5365</post-id>	</item>
		<item>
		<title>My Brisket Smoking Process (and Secret Brisket Rub Recipe)</title>
		<link>https://nothans.com/my-brisket-smoking-process-and-secret-brisket-rub-recipe</link>
					<comments>https://nothans.com/my-brisket-smoking-process-and-secret-brisket-rub-recipe#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 17 Oct 2023 02:14:00 +0000</pubDate>
				<category><![CDATA[BBQ]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[BBQ Rub]]></category>
		<category><![CDATA[Smoker]]></category>
		<category><![CDATA[Trademark BBQ]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=4126</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>I love Texas-style brisket, but I love the process of making my own and learning through the process. My process has evolved over the years, and my recipes are based on my tastes and point of view. I make a change each time that I make one, so I can continuously improve and also find my trademark outcome. I will always be tinkering. I will never have it all figured out. I am sharing my process with you so you have a head start to find out what you like. I also like to involve George. He likes to ask questions and ask for explanations. Plus, the time together has fire and smoke to heighten the experience.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="745" height="993" data-attachment-id="4128" data-permalink="https://nothans.com/my-brisket-smoking-process-and-secret-brisket-rub-recipe/image-8-10" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/10/image-8.png?fit=745%2C993&amp;ssl=1" data-orig-size="745,993" data-comments-opened="0" data-image-title="Hans and George Smoking BBQ" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/10/image-8.png?fit=745%2C993&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/10/image-8.png?resize=745%2C993&#038;ssl=1" alt="" class="wp-image-4128" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/10/image-8.png?w=745&amp;ssl=1 745w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/10/image-8.png?resize=225%2C300&amp;ssl=1 225w" sizes="auto, (max-width: 745px) 100vw, 745px" /></figure>
</div>

<h2 class="wp-block-heading" id="choose-a-brisket">Choose a Brisket</h2>


<p>I used to buy my briskets at a mass-market store and hope for the best. This still works, but there are some fantastic Brazilian butcher shops all around me. I have learned that I am looking for&nbsp;<em>a carne de peito</em>. If you have a few options, be picky. Pick a brisket with purpose. I tend to look for how much fat there is, the overall shape, and how thin the flat side is. I am thinking about how much I am not going to be able to use. I tend to trim aggressively, so I don’t want to pay for what I am going to throw away. Get the brisket home safely and put it in the refrigerator. Keep it cold until you are ready to trim.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="745" height="993" data-attachment-id="2890" data-permalink="https://nothans.com/make-a-texas-brisket/brisket-in-car" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket-in-car.jpg?fit=745%2C993&amp;ssl=1" data-orig-size="745,993" data-comments-opened="0" data-image-title="brisket in car" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket-in-car.jpg?fit=745%2C993&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket-in-car.jpg?resize=745%2C993&#038;ssl=1" alt="" class="wp-image-2890" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket-in-car.jpg?w=745&amp;ssl=1 745w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket-in-car.jpg?resize=225%2C300&amp;ssl=1 225w" sizes="auto, (max-width: 745px) 100vw, 745px" /><figcaption class="wp-element-caption">Get Your Brisket Home Safely</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="make-a-brisket-rub">Make a Brisket Rub</h2>


<p>While your brisket is getting cold, prepare a fresh brisket rub. This is where your personality and preferences can shine through. Don’t worry too much about being traditional or what others like; try out different rubs, spices, and flavors. Over time, you will figure out what you like and what others tend to like. To me, a brisket rub is basically salt and pepper. This is because I have had many briskets in Texas, and they tend to be heavy on the black pepper. The trick is to use coarse grinds on the spices that you want to use. You want the smoke to make it the meat; fine powders tend to block the smoke from getting in. If you want to experiment, try coarse-ground spices instead of powders. I recommend Penzeys Spices&nbsp;<a href="https://trademarkbbq.com/tellicherry-black-pepper">Tellicherry Black Pepper</a>&nbsp;and grinding it when you need it.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="598" data-attachment-id="2880" data-permalink="https://nothans.com/make-the-perfect-texas-brisket-rub/trademark_bbq_brisket_rub_crop" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/trademark_bbq_brisket_rub_crop.jpg?fit=1155%2C920&amp;ssl=1" data-orig-size="1155,920" data-comments-opened="0" data-image-title="Texas Brisket Rub" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/trademark_bbq_brisket_rub_crop.jpg?fit=750%2C598&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/trademark_bbq_brisket_rub_crop.jpg?resize=750%2C598&#038;ssl=1" alt="" class="wp-image-2880" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/trademark_bbq_brisket_rub_crop.jpg?resize=1024%2C816&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/trademark_bbq_brisket_rub_crop.jpg?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/trademark_bbq_brisket_rub_crop.jpg?resize=768%2C612&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/trademark_bbq_brisket_rub_crop.jpg?resize=750%2C597&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/trademark_bbq_brisket_rub_crop.jpg?w=1155&amp;ssl=1 1155w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Texas Brisket Rub</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="my-secret-texas-brisket-rub-recipe">My Secret Texas Brisket Rub Recipe</h2>


<ul class="wp-block-list">
<li>1/2 cup of&nbsp;<a rel="noreferrer noopener" href="https://amzn.to/2X4QC5p" target="_blank">Lawry’s Seasoned Salt</a></li>



<li>1/2 cup of kosher salt</li>



<li>1 cup of tellicherry black pepper (coarse ground)</li>
</ul>



<p>Add all of the ingredients to a container, seal it, and shake it to mix thoroughly.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube aligncenter wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/Dh6W-yXrEZw?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div><figcaption class="wp-element-caption">Texas Brisket Rub Recipe</figcaption></figure>


<h2 class="wp-block-heading" id="trim-the-brisket">Trim the Brisket</h2>


<p>YouTube is your friend here. If you have never trimmed a brisket, watch a few hours of video to see different techniques and to get comfortable with what you are trying to accomplish. I will list some of my tips, but trimming a brisket takes some practice. It is also nerve-wracking, as you don’t want to mess up a very expensive cut of beef. Trim right out of the refrigerator—the colder, the better. I recommend a cheap&nbsp;<a rel="noreferrer noopener" href="https://amzn.to/3C0wTmF" target="_blank">deboning knife</a>&nbsp;to trim a brisket.</p>



<p>At the end of the trimming process, you want a piece of meat that will be easy to smoke and yield eatable pieces. “Don’t be a hero” is what I say to the people who I teach. I aggressively trim and cut away pieces that are just not going to cook well or be tasty. Save the trimmings to make tallow.</p>



<p>At the end of the process, you want a brisket with an aerodynamic shape. This means no sharp corners and a rounded, domed shape. Trim down the flat side so it is at least an inch thick; any thinner, you run the risk of burning it up and drying it out. Trim the fat cap to around a quarter of an inch. Remove the silver skin and fat pockets from the bottom side. Take your time.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/yaMgt1Altys?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div><figcaption class="wp-element-caption">Aaron Franklin describes how he trims a brisket at Brisket Camp 2015</figcaption></figure>


<h2 class="wp-block-heading" id="apply-the-rub">Apply the Rub</h2>


<p>Put the brisket on a large cutting board. Apply your brisket rub to the brisket by shaking the container of rub from about 12 inches away. I start with the bottom side, go around the edges, flip, and cover the top of the brisket. I only lightly press the rub down. I don’t use any binders, and I don’t rub them into the meat. And make sure to get all of the sides. I tend to miss the side facing away from me.</p>


<div class="wp-block-image is-resized">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="2891" data-permalink="https://nothans.com/make-a-texas-brisket/brisket-rub" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/Brisket-rub.jpg?fit=1024%2C768&amp;ssl=1" data-orig-size="1024,768" data-comments-opened="0" data-image-title="Brisket rub" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/Brisket-rub.jpg?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/Brisket-rub.jpg?resize=750%2C563&#038;ssl=1" alt="" class="wp-image-2891" style="aspect-ratio:1.3333333333333333;width:800px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/Brisket-rub.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/Brisket-rub.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/Brisket-rub.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/Brisket-rub.jpg?resize=750%2C563&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/Brisket-rub.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/Brisket-rub.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Get All of the Sides Covered in Rub</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="smoke-the-brisket-to-170%25c2%25b0f">Smoke the Brisket to 170°F</h2>


<p>I use vertical smokers and charcoal and wood chunks for smoking meat. You can do this with a pellet smoker or an offset smoker. Use what you know and what you are comfortable with. I smoke at 225°F, and I am looking for an internal temperature of 170°F and a defined bark. Before I move to the next step, I like to have good color and have the bark in place.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="749" data-attachment-id="2892" data-permalink="https://nothans.com/make-a-texas-brisket/brisket_wsm" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?fit=2560%2C2554&amp;ssl=1" data-orig-size="2560,2554" data-comments-opened="0" data-image-title="brisket_wsm" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?fit=750%2C749&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm.jpg?resize=750%2C749&#038;ssl=1" alt="" class="wp-image-2892" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?resize=1024%2C1022&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?resize=768%2C766&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?resize=1536%2C1532&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?resize=2048%2C2043&amp;ssl=1 2048w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?resize=750%2C748&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?resize=500%2C500&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_wsm-scaled.jpg?w=2250&amp;ssl=1 2250w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Brisket on the Weber Smokey Mountain (WSM) smoker</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="make-tallow">Make Tallow</h2>


<p>While your brisket is smoking, make some tallow. We are going to use the scraps from trimming and render them into tallow. I put some of my scraps in a pot and heated it up slowly for a couple of hours. I am not worried about getting all of the fat to render. I just want to make a cup for when I wrap the brisket and smoke it the rest of the way. I pour the rendered fat through a strainer and then a coffee filter. I am only trying to get a cup to use in the next step. You can also buy&nbsp;<a rel="noreferrer noopener" href="https://amzn.to/3nm0Ol3" target="_blank">Wagyu Tallow</a>, smoke it, and use it without all of the mess of making your own.</p>


<h2 class="wp-block-heading" id="wrap-the-brisket">Wrap the Brisket</h2>


<p>Take two large sheets of&nbsp;<a rel="noreferrer noopener" href="https://amzn.to/3E9pKSL" target="_blank">pink butcher paper</a>&nbsp;and place them on top of a cooking sheet. Pour the tallow onto the paper, and put the bottom of the brisket down on the pool of beef tallow. Fold the paper around the sides, flip, and tuck. I like to make sure that there are no air pockets in the paper. It might take a few tries to wrap it, but I haven’t noticed too much of a difference in the output. Tallow helps with moisture, texture, and mouthfeel.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="609" height="811" data-attachment-id="2875" data-permalink="https://nothans.com/is-wagyu-beef-tallow-the-trick-to-moist-brisket/wrapped-brisket" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/05/wrapped-brisket.jpg?fit=609%2C811&amp;ssl=1" data-orig-size="609,811" data-comments-opened="0" data-image-title="wrapped brisket with beef tallow" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/05/wrapped-brisket.jpg?fit=609%2C811&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/05/wrapped-brisket.jpg?resize=609%2C811&#038;ssl=1" alt="" class="wp-image-2875" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/05/wrapped-brisket.jpg?w=609&amp;ssl=1 609w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/05/wrapped-brisket.jpg?resize=225%2C300&amp;ssl=1 225w" sizes="auto, (max-width: 609px) 100vw, 609px" /><figcaption class="wp-element-caption">Wrapped Brisket with Tallow</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="smoke-the-brisket-to-203%25c2%25b0f">Smoke the Brisket to 203°F</h2>


<p>Take your wrapped brisket in&nbsp;<a rel="noreferrer noopener" href="https://amzn.to/3E9pKSL" target="_blank">pink butcher paper</a>&nbsp;and place it back on the smoker. I am looking for an internal temperature of 203°F and a certain feel of the temperature problem. I use an&nbsp;instant-read temperature probe&nbsp;with a pointy end. I want the probe to punch through the paper and have little resistance going into the brisket. It takes some experience to get the feel for this.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="1000" data-attachment-id="2893" data-permalink="https://nothans.com/make-a-texas-brisket/brisket_at_temperature" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_at_temperature-scaled.jpg?fit=1920%2C2560&amp;ssl=1" data-orig-size="1920,2560" data-comments-opened="0" data-image-title="brisket_at_temperature" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_at_temperature-scaled.jpg?fit=750%2C1000&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_at_temperature.jpg?resize=750%2C1000&#038;ssl=1" alt="" class="wp-image-2893" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_at_temperature-scaled.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_at_temperature-scaled.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_at_temperature-scaled.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_at_temperature-scaled.jpg?resize=1536%2C2048&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_at_temperature-scaled.jpg?resize=750%2C1000&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_at_temperature-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Brisket Smoked to the Right Temperature</figcaption></figure>


<h2 class="wp-block-heading" id="rest-the-brisket">Rest the Brisket</h2>


<p>Once the brisket is at the desired temperature and has the right texture, I let it cool down to around 180°F. I keep it wrapped the whole time. Then, I place it in a cooler until the brisket is ready to serve. I give it at least 4 hours and have gone as long as 8 hours. The resting part is really important for moisture. A good cooler will hold the internal temperature around 160°F. I used some extra butcher paper to fill up the space in the cooler. I am not sure if this helps, but it is something that I do every time.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="690" height="920" data-attachment-id="2894" data-permalink="https://nothans.com/make-a-texas-brisket/cooler" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/cooler.jpg?fit=690%2C920&amp;ssl=1" data-orig-size="690,920" data-comments-opened="0" data-image-title="cooler" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/cooler.jpg?fit=690%2C920&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/cooler.jpg?resize=690%2C920&#038;ssl=1" alt="" class="wp-image-2894" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/cooler.jpg?w=690&amp;ssl=1 690w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/cooler.jpg?resize=225%2C300&amp;ssl=1 225w" sizes="auto, (max-width: 690px) 100vw, 690px" /><figcaption class="wp-element-caption">Brisket Resting in a Cooler</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="show-off-the-brisket">Show Off the Brisket</h2>


<p>I am a ham. I love to share my work. I usually gather everyone around for the big reveal. This step is optional.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="780" data-attachment-id="2895" data-permalink="https://nothans.com/make-a-texas-brisket/hans_with_brisket" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/hans_with_brisket.jpg?fit=884%2C919&amp;ssl=1" data-orig-size="884,919" data-comments-opened="0" data-image-title="Hans Scharler Showing Off a Texas Brisket" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/hans_with_brisket.jpg?fit=750%2C780&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/hans_with_brisket.jpg?resize=750%2C780&#038;ssl=1" alt="" class="wp-image-2895" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/hans_with_brisket.jpg?w=884&amp;ssl=1 884w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/hans_with_brisket.jpg?resize=289%2C300&amp;ssl=1 289w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/hans_with_brisket.jpg?resize=768%2C798&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/hans_with_brisket.jpg?resize=750%2C780&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Hans Scharler Showing Off His Brisket</figcaption></figure>


<h2 class="wp-block-heading" id="slice-the-brisket">Slice the Brisket</h2>


<p>I use a sharp&nbsp;<a rel="noreferrer noopener" href="https://amzn.to/2YPXFjv" target="_blank">brisket knife</a>&nbsp;while wearing&nbsp;<a rel="noreferrer noopener" href="https://amzn.to/3E6vcWt" target="_blank">gloves</a>&nbsp;to slice to order. My first cut is around the middle to separate the flat from the point muscles. I pose for the moisture shot and then continue slicing. I have watched a lot of videos on slicing a brisket properly, and I learn something new every time I do it. My flat cuts are around a quarter of an inch, and my point cuts are a little wider. Over time, you will learn where the burnt ends are. I usually cube up four pieces from the flap on the point to make some really tasty burnt-end pieces.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="544" height="748" data-attachment-id="2896" data-permalink="https://nothans.com/make-a-texas-brisket/brisket_cut_in_half" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_cut_in_half.jpg?fit=544%2C748&amp;ssl=1" data-orig-size="544,748" data-comments-opened="0" data-image-title="brisket_cut_in_half" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_cut_in_half.jpg?fit=544%2C748&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_cut_in_half.jpg?resize=544%2C748&#038;ssl=1" alt="" class="wp-image-2896" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_cut_in_half.jpg?w=544&amp;ssl=1 544w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/brisket_cut_in_half.jpg?resize=218%2C300&amp;ssl=1 218w" sizes="auto, (max-width: 544px) 100vw, 544px" /><figcaption class="wp-element-caption">Brisket Cut In Half</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="rest-yourself">Rest Yourself</h2>


<p>I never sleep so well after a day or so of smoking and eating. It is exhausting to keep up with the fire, checking things, overthinking things, and striving for your best. Get some rest, reflect, and be ready for the next battle.</p>


<div class="wp-block-image is-resized">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="546" data-attachment-id="2897" data-permalink="https://nothans.com/make-a-texas-brisket/rest" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/rest.jpg?fit=1264%2C920&amp;ssl=1" data-orig-size="1264,920" data-comments-opened="0" data-image-title="rest" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/rest.jpg?fit=750%2C546&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/rest.jpg?resize=750%2C546&#038;ssl=1" alt="" class="wp-image-2897" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/rest.jpg?resize=1024%2C745&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/rest.jpg?resize=300%2C218&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/rest.jpg?resize=768%2C559&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/rest.jpg?resize=750%2C546&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/06/rest.jpg?w=1264&amp;ssl=1 1264w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Hans Scharler Resting</figcaption></figure>
</div>


<p>What tips do you have? Please share and help build up our community. I am always learning. And the more I share, the better I get. I love talking about BBQ, so connect with me&nbsp;here or on&nbsp;<a rel="noreferrer noopener" href="https://www.instagram.com/trademarkbbq/" target="_blank">Instagram</a>. Godspeed.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/my-brisket-smoking-process-and-secret-brisket-rub-recipe/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4126</post-id>	</item>
		<item>
		<title>On Air Light 2023: Easy DIY Status Light for Microsoft Teams and Zoom</title>
		<link>https://nothans.com/on-air-light-2023</link>
					<comments>https://nothans.com/on-air-light-2023#comments</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Wed, 25 Jan 2023 22:03:24 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[ThingSpeak]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[making]]></category>
		<category><![CDATA[On Air Light]]></category>
		<category><![CDATA[Teams]]></category>
		<category><![CDATA[thingspeak]]></category>
		<category><![CDATA[web of things]]></category>
		<category><![CDATA[Zoom]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=3550</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>In March 2020, I made an <a href="https://nothans.com/on-air-light-for-microsoft-teams-and-zoom-meetings" data-type="post" data-id="1489">On Air Light for Microsoft Teams</a> to indicate whether or not my camera was on for all of my newfound remote meetings. Oh, those were the days. At the time, it was a fun project. I didn&#8217;t expect it to be something I still use daily after three years. And my project was complicated. I called it a DIY project, but you had to have two specialized parts: the light housing and some LEDs from an upcycled light. I literally just used what I had in my parts storage area. I get an email almost daily from folks building their own, getting stuck, or asking for clarification. I decided to redo the project using things from Amazon, reduce some of the DIY aspects, and simplify the code. </p>


<h2 class="wp-block-heading" id="the-idea">The Idea</h2>


<p>I want a light that turns on when my webcam turns on. I want the light to turn off when my camera turns off. The idea is that my camera is on when I am in an online meeting. The light is a good indicator to everyone, including myself, that I am in a meeting.</p>


<h2 class="wp-block-heading" id="the-system">The System</h2>


<p>In order to turn a light on and off, I need a script that monitors my webcam for activity. This script will then send the status of my webcam to <a href="https://thingspeak.com" target="_blank" rel="noreferrer noopener">ThingSpeak</a>, a cloud IoT platform that allows you to save and retrieve sensor data. Then, the on-air light controller will read the data from ThingSpeak and turn the light on if my camera is on.</p>


<h2 class="wp-block-heading" id="the-parts">The Parts</h2>


<p>I was able to find everything you need on Amazon to build this project.</p>



<ul class="wp-block-list">
<li><a href="https://amzn.to/3H02OIv" target="_blank" rel="noreferrer noopener">On Air sign</a></li>



<li><a href="https://amzn.to/3H0fChm" target="_blank" rel="noreferrer noopener">ESP32 board</a></li>



<li><a href="https://amzn.to/3kIJIhY" target="_blank" rel="noreferrer noopener">ESP32 screw terminal board</a></li>



<li><a rel="noreferrer noopener" href="https://amzn.to/3R3heM5" target="_blank">LED light strip</a></li>
</ul>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="612" data-attachment-id="3551" data-permalink="https://nothans.com/on-air-light-2023/image-8-3" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-8.png?fit=1222%2C998&amp;ssl=1" data-orig-size="1222,998" data-comments-opened="0" data-image-title="image-8" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-8.png?fit=750%2C612&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-8.png?resize=750%2C612&#038;ssl=1" alt="" class="wp-image-3551" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-8.png?resize=1024%2C836&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-8.png?resize=300%2C245&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-8.png?resize=768%2C627&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-8.png?resize=750%2C613&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-8.png?resize=80%2C64&amp;ssl=1 80w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-8.png?w=1222&amp;ssl=1 1222w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">DIY On Air Light Parts</figcaption></figure>



<p>Here are some notes about these parts.</p>



<ul class="wp-block-list">
<li>You can use any sign that you want to light up. I chose this one since it was $15 US and looks great. It also includes a Micro USB cable that you can use for the ESP32 device.</li>



<li>Screw terminals make this project a solder-free project. Some people who wrote me said that soldering was a barrier to getting started. I want this to be accessible to as many makers as possible. Screw terminals offer a quick way to break out the pins of the ESP32 board and easily connect wires.</li>



<li>Only certain styles of the ESP32 board work with the screw terminals. The terminals are for the 38-pin version of the HiLetgo ESP-WROOM-32 ESP32 dev board. The two parts that I linked to on Amazon will fit together perfectly. Other ESP32 boards might not work with the screw terminal expansion board.</li>
</ul>


<h2 class="wp-block-heading" id="thingspeak-setup">ThingSpeak Setup</h2>


<p><a href="https://thingspeak.com">ThingSpeak</a> is an IoT service hosted by MathWorks. It is focused on being easy to collect data and then retrieve that data. We are going to leverage that core functionality for this project. ThingSpeak stores data in a channel and each channel has eight fields.</p>



<p>Visit&nbsp;<a href="https://thingspeak.com/">ThingSpeak.com</a>&nbsp;and&nbsp;<a href="https://thingspeak.com/users/sign_up">Sign Up</a>&nbsp;for an account. This will just take a minute and user accounts are free. Once you have a user account, you need to create a channel. ThingSpeak channels are where data gets stored.&nbsp;Create a new channel by selecting&nbsp;<em>Channels</em>,&nbsp;<em>My Channels</em>, and then&nbsp;<em>New Channel</em>. Name the channel, “On Air Light&#8221; and name Field 1, “Webcam State”. Click “Save Channel” at the bottom to finish the process.</p>



<p>Click <em>API Keys</em> and note your write API key and read API key. The write API key will be used by the code to track your webcam state. The read API key will be used to turn on or off the light based on the webcam state.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="552" height="191" data-attachment-id="3552" data-permalink="https://nothans.com/on-air-light-2023/image-9-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-9.png?fit=552%2C191&amp;ssl=1" data-orig-size="552,191" data-comments-opened="0" data-image-title="image-9" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-9.png?fit=552%2C191&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-9.png?resize=552%2C191&#038;ssl=1" alt="" class="wp-image-3552" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-9.png?w=552&amp;ssl=1 552w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-9.png?resize=300%2C104&amp;ssl=1 300w" sizes="auto, (max-width: 552px) 100vw, 552px" /></figure>
</div>

<h2 class="wp-block-heading" id="track-webcam-state">Track Webcam State</h2>


<p>I wrote a Python script that uses OpenCV to detect if the camera is in use or not. It sends a &#8220;1&#8221; to field1 of the ThingSpeak Channel if the camera is in use. It sends a 0 if the camera is not in use. Just run this code on a periodic basis to track the state of your webcam.</p>



<p>The code to track my webcam state and upload the state to ThingSpeak is available on&nbsp;<a rel="noreferrer noopener" href="https://github.com/nothans/webcam-state" target="_blank">GitHub</a>. Update the code with your ThingSpeak Channel&#8217;s write API key.</p>



<p>Most of the magic is here:</p>



<pre class="wp-block-preformatted">def&nbsp;returnWebcamStatus(webcamIndex):

&nbsp;&nbsp;&nbsp;&nbsp;webcam&nbsp;=&nbsp;cv2.VideoCapture(webcamIndex,&nbsp;cv2.CAP_DSHOW)

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;webcam.isOpened():
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webcam.release()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;True&nbsp;#Webcam&nbsp;not&nbsp;in&nbsp;use
&nbsp;&nbsp;&nbsp;&nbsp;else:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;False&nbsp;#Webcam&nbsp;in&nbsp;use</pre>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://github.com/nothans/webcam-state"><img data-recalc-dims="1" loading="lazy" decoding="async" width="483" height="335" data-attachment-id="1692" data-permalink="https://nothans.com/on-air-light-for-microsoft-teams-and-zoom-meetings/webcamstatus_thingspeak2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2021/02/WebcamStatus_ThingSpeak2.png?fit=483%2C335&amp;ssl=1" data-orig-size="483,335" data-comments-opened="0" data-image-title="WebcamStatus_ThingSpeak2" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2021/02/WebcamStatus_ThingSpeak2.png?fit=483%2C335&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2021/02/WebcamStatus_ThingSpeak2.png?resize=483%2C335&#038;ssl=1" alt="" class="wp-image-1692" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2021/02/WebcamStatus_ThingSpeak2.png?w=483&amp;ssl=1 483w, https://i0.wp.com/nothans.com/wp-content/uploads/2021/02/WebcamStatus_ThingSpeak2.png?resize=300%2C208&amp;ssl=1 300w" sizes="auto, (max-width: 483px) 100vw, 483px" /></a><figcaption class="wp-element-caption">ThingSpeak chart of my webcam status</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="assembly">Assembly</h2>


<p>Get your parts together and get ready to put everything together. Take your time and step through. There is no soldering, just some connections to be made on a set of screw terminals. You will need cutters, a small screwdriver, and some tape to complete the assembly.</p>


<h3 class="wp-block-heading" id="connect-the-esp32-board-to-the-screw-terminal-board">Connect the ESP32 board to the SCrew Terminal Board</h3>


<p>Make sure to get the right orientation of the boards together. The 5V pins should line up and the USB part should be pointing down.</p>



<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://nothans.com/on-air-light-2023&quot;}'  class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="3557" data-permalink="https://nothans.com/on-air-light-2023/terminal-next-to-esp32" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32.jpg?fit=1253%2C943&amp;ssl=1" data-orig-size="1253,943" data-comments-opened="0" data-image-title="terminal next to esp32" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32.jpg?fit=750%2C565&amp;ssl=1" data-id="3557" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32-1024x771.jpg?resize=750%2C565&#038;ssl=1" alt="" class="wp-image-3557" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32.jpg?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32.jpg?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32.jpg?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32.jpg?resize=750%2C564&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32.jpg?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/terminal-next-to-esp32.jpg?w=1253&amp;ssl=1 1253w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="3558" data-permalink="https://nothans.com/on-air-light-2023/esp32-on-terminal-board" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?fit=1253%2C943&amp;ssl=1" data-orig-size="1253,943" data-comments-opened="0" data-image-title="esp32 on terminal board" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?fit=750%2C565&amp;ssl=1" data-id="3558" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?resize=750%2C565&#038;ssl=1" alt="" class="wp-image-3558" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?resize=750%2C564&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/esp32-on-terminal-board.jpg?w=1253&amp;ssl=1 1253w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</figure>


<h3 class="wp-block-heading" id="cut-off-the-out-connector-from-the-led-strip">Cut Off the Out Connector from the LED Strip</h3>


<p>We can use the connector on the out side of the LED strip. Cut this off and strip back some of the insulation. We will use this connector for the screw terminals.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="3559" data-permalink="https://nothans.com/on-air-light-2023/image-14" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-14.png?fit=752%2C999&amp;ssl=1" data-orig-size="752,999" data-comments-opened="0" data-image-title="image-14" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-14.png?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-14.png?resize=750%2C996&#038;ssl=1" alt="" class="wp-image-3559" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-14.png?w=752&amp;ssl=1 752w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-14.png?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-14.png?resize=750%2C996&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">The Out Side of the LED Strip</figcaption></figure>
</div>

<h3 class="wp-block-heading" id="connect-the-connector-to-the-screw-terminal-board">Connect the Connector to the Screw Terminal Board</h3>


<p>Connect the red wire to the 5v terminal. Connect the green wire to P13. Connect the white wire to GND.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="3560" data-permalink="https://nothans.com/on-air-light-2023/image-15" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-15.png?fit=752%2C999&amp;ssl=1" data-orig-size="752,999" data-comments-opened="0" data-image-title="image-15" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-15.png?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-15.png?resize=750%2C996&#038;ssl=1" alt="" class="wp-image-3560" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-15.png?w=752&amp;ssl=1 752w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-15.png?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-15.png?resize=750%2C996&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Connector on the Screw Terminal Board</figcaption></figure>


<h3 class="wp-block-heading" id="connect-the-led-strip-to-the-connector">Connect the LED Strip to the Connector</h3>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="677" height="815" data-attachment-id="3561" data-permalink="https://nothans.com/on-air-light-2023/image-16" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-16.png?fit=677%2C815&amp;ssl=1" data-orig-size="677,815" data-comments-opened="0" data-image-title="image-16" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-16.png?fit=677%2C815&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-16.png?resize=677%2C815&#038;ssl=1" alt="" class="wp-image-3561" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-16.png?w=677&amp;ssl=1 677w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-16.png?resize=249%2C300&amp;ssl=1 249w" sizes="auto, (max-width: 677px) 100vw, 677px" /><figcaption class="wp-element-caption">Connect the LED Strip to the Terminal Board</figcaption></figure>
</div>

<h3 class="wp-block-heading" id="program-the-esp32">Program the ESP32</h3>


<p>Using the Micro USB cable that comes with the On Air Light, connect the ESP32 to your computer.</p>



<p>The code that the Arduino IDE uses is called a “sketch” – this is just a short program that the device runs over and over. In this project, we are going to have the code that checks the ThingSpeak channel for the webcam status and sets the LED strip to either on or off. Copy the&nbsp;<a href="https://gist.github.com/nothans/cdd101ec75210c4ecb64c7240f6c9727" target="_blank" rel="noreferrer noopener">example code</a>&nbsp;to your Arduino IDE and change some of the defaults to match your Wi-Fi network and ThingSpeak settings.</p>



<p>Once everything is set, click Sketch and then Upload. This will take the code and program the ESP32 with it. It takes a minute, so be patient. If anything goes wrong, make sure that you have the right board settings and that your “Port” matches what your laptop thinks the port is.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="612" height="441" data-attachment-id="3562" data-permalink="https://nothans.com/on-air-light-2023/image-17" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-17.png?fit=612%2C441&amp;ssl=1" data-orig-size="612,441" data-comments-opened="0" data-image-title="image-17" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-17.png?fit=612%2C441&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-17.png?resize=612%2C441&#038;ssl=1" alt="" class="wp-image-3562" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-17.png?w=612&amp;ssl=1 612w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-17.png?resize=300%2C216&amp;ssl=1 300w" sizes="auto, (max-width: 612px) 100vw, 612px" /><figcaption class="wp-element-caption">Arduino Setting for ESP32-WROOM</figcaption></figure>
</div>

<h3 class="wp-block-heading" id="open-the-on-air-light">Open the On Air Light</h3>


<p>The housing of the On Air light is held together by several tabs. Take your screwdriver and gently twist in each opening. It will come apart without damage. Just take your time and open each tab.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="3563" data-permalink="https://nothans.com/on-air-light-2023/image-18" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?fit=1253%2C943&amp;ssl=1" data-orig-size="1253,943" data-comments-opened="0" data-image-title="image-18" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?fit=750%2C565&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?resize=750%2C565&#038;ssl=1" alt="" class="wp-image-3563" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?resize=750%2C564&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-18.png?w=1253&amp;ssl=1 1253w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Openned Up On Air Light</figcaption></figure>
</div>

<h3 class="wp-block-heading" id="remove-the-existing-led-board">Remove the Existing LED Board</h3>


<p>Remove the existing board on the inside of the light. Trim the wires off close to the circuit board so you have some length to work with.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="3564" data-permalink="https://nothans.com/on-air-light-2023/image-19" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-19.png?fit=752%2C999&amp;ssl=1" data-orig-size="752,999" data-comments-opened="0" data-image-title="image-19" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-19.png?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-19.png?resize=750%2C996&#038;ssl=1" alt="" class="wp-image-3564" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-19.png?w=752&amp;ssl=1 752w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-19.png?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-19.png?resize=750%2C996&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">George Liked Taking the Light Apart</figcaption></figure>
</div>

<h3 class="wp-block-heading" id="connect-the-usb-wires-to-the-board">Connect the USB Wires to the Board</h3>


<p>Connect the red wire to the 5v screw terminal. Connect the black wire to the GND screw terminal. You will have two wires in each. I used some tape to make sure that the screw terminal board doesn&#8217;t move around.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="3566" data-permalink="https://nothans.com/on-air-light-2023/image-21" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?fit=1253%2C943&amp;ssl=1" data-orig-size="1253,943" data-comments-opened="0" data-image-title="image-21" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?fit=750%2C565&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?resize=750%2C565&#038;ssl=1" alt="" class="wp-image-3566" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?resize=750%2C564&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-21.png?w=1253&amp;ssl=1 1253w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Connect the Wiress to the USB Port</figcaption></figure>
</div>

<h3 class="wp-block-heading" id="snap-it-all-back-together">Snap It All Back Together</h3>


<p>Carefully snap the two halves back together.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="3553" data-permalink="https://nothans.com/on-air-light-2023/image-10-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?fit=1253%2C943&amp;ssl=1" data-orig-size="1253,943" data-comments-opened="0" data-image-title="New On Air Light" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?fit=750%2C565&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?resize=750%2C565&#038;ssl=1" alt="" class="wp-image-3553" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?resize=750%2C564&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-10.png?w=1253&amp;ssl=1 1253w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Updated On Air Light and the Orginal On Air Light</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="profit">Profit.</h2>


<p>Enjoy your On Air light. Maybe this will remind you or someone in your family that you actually work when you are home.</p>



<p>My goal was to show you the steps as clearly as possible and share the code. I hope that you can reproduce this as easily as possible. If you need help leave a comment or join me on my new <a href="https://nothans.com/discord" target="_blank" rel="noreferrer noopener">Discord</a> server.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/on-air-light-2023/feed</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3550</post-id>	</item>
		<item>
		<title>Measure Wi-Fi Signal Levels with the ESP8266 and ThingSpeak</title>
		<link>https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak</link>
					<comments>https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak#comments</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Wed, 01 Feb 2017 21:46:49 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[ThingSpeak]]></category>
		<category><![CDATA[esp8266]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[thingspeak]]></category>
		<category><![CDATA[web of things]]></category>
		<category><![CDATA[Wi-Fi]]></category>
		<guid isPermaLink="false">http://nothans.com/?p=1027</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<p>Oh, my. I am sure you have been hearing about the Internet of Things&#8230; The IoT! You might be wondering how to get started with i(o)t. There are many places to start. You might be interested in the data that devices collect and analyzing it or you might be interested in how to deploy thousands of sensors around a factory floor to better understand how efficient things are. You might just want to tinker. Be the cool person at the party talking about Arduino, Raspberry Pi, and Maroon 5. If you want to try out a &#8220;thing&#8221; &#8230; a small, connected device &#8230; that can measure data, I will help you get started with a quick tutorial using the ESP8266 &#8220;thing&#8221;.</p>
<h3>Parts</h3>
<p>First, you need to go buy a thing on <a href="https://amzn.to/4cdl2pY">Amazon</a>. I recommend an ESP8266-compatible device like the NodeMCU for this project. Don&#8217;t be scared. Add it to your <a href="https://amzn.to/4cdl2pY">Amazon</a> shopping list or ask Alexa to buy you one. It&#8217;s $8.<img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1028" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/esp8266" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ESP8266.png?fit=967%2C703&amp;ssl=1" data-orig-size="967,703" data-comments-opened="0" data-image-title="ESP8266 NodeMCU" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ESP8266.png?fit=750%2C545&amp;ssl=1" class="aligncenter size-full wp-image-1028" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ESP8266.png?resize=750%2C545" alt="ESP8266 NodeMCU" width="750" height="545" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ESP8266.png?w=967&amp;ssl=1 967w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ESP8266.png?resize=300%2C218&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ESP8266.png?resize=768%2C558&amp;ssl=1 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /></p>
<p>Other parts that you will need:</p>
<ul>
<li>Laptop</li>
<li>Micro USB cable</li>
</ul>
<h3>ThingSpeak</h3>
<p>While you are waiting for your Amazon stuff to arrive, you can learn about <a href="https://thingspeak.com">ThingSpeak</a>.</p>
<p><a href="https://thingspeak.com"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1033" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/thingspeak" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak.png?fit=968%2C727&amp;ssl=1" data-orig-size="968,727" data-comments-opened="0" data-image-title="ThingSpeak IoT Platform" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak.png?fit=750%2C563&amp;ssl=1" class="aligncenter size-full wp-image-1033" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak.png?resize=750%2C563" alt="ThingSpeak IoT Platform" width="750" height="563" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak.png?w=968&amp;ssl=1 968w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak.png?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak.png?resize=768%2C577&amp;ssl=1 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a></p>
<p>ThingSpeak is where we are going to store the data collected by our thing and where we can see the data that we collected. Visit <a href="https://thingspeak.com">ThingSpeak.com</a> and <a href="https://thingspeak.com/users/sign_up">Sign Up</a> for an account. This will just take a minute, and the user accounts are free. Once you have a user account, you need to create a channel. ThingSpeak channels are where data gets stored. Create a new channel by selecting <em>Channels</em>, <em>My Channels</em>, and then <em>New Channel</em>. Name the channel &#8220;ESP8266 Signal Strength&#8221; and name Field 1 &#8220;RSSI&#8221;. Click &#8220;Save Channel&#8221; at the bottom to finish the process.</p>
<p><a href="https://thingspeak.com/channels"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1034" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/channel_settings" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Channel_Settings.png?fit=545%2C223&amp;ssl=1" data-orig-size="545,223" data-comments-opened="0" data-image-title="Channel_Settings" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Channel_Settings.png?fit=545%2C223&amp;ssl=1" class="aligncenter size-full wp-image-1034" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Channel_Settings.png?resize=545%2C223" alt="Channel_Settings" width="545" height="223" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Channel_Settings.png?w=545&amp;ssl=1 545w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Channel_Settings.png?resize=300%2C123&amp;ssl=1 300w" sizes="auto, (max-width: 545px) 100vw, 545px" /></a></p>
<h3>Arduino Setup</h3>
<p>Once the ESP8266 comes in the mail in a couple of days, you need to gather a few more things to be able to program this thing. You will need a laptop and a micro USB cable (like the one that you charge a phone with). On the laptop, we need to install some software to be able to program the ESP8266. Visit <a href="https://www.arduino.cc/en/main/software">Arduino.cc</a> and install the Arduino IDE.</p>
<p><a href="https://www.arduino.cc/en/main/software"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1029" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/arduino_ide" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_IDE.png?fit=930%2C405&amp;ssl=1" data-orig-size="930,405" data-comments-opened="0" data-image-title="Arduino IDE" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_IDE.png?fit=750%2C327&amp;ssl=1" class="aligncenter size-full wp-image-1029" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_IDE.png?resize=750%2C327" alt="Arduino IDE" width="750" height="327" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_IDE.png?w=930&amp;ssl=1 930w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_IDE.png?resize=300%2C131&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_IDE.png?resize=768%2C334&amp;ssl=1 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a></p>
<p>Once the Arduino IDE is installed, open the program so we can do a couple of setup steps to get it ready to program ESP8266 devices. Under <em>File</em>, <em>Preferences</em>, and <em>Additional Boards Manager URLs</em>, add this link: http://arduino.esp8266.com/stable/package_esp8266com_index.json &#8211; this will allow the Arduino IDE to manage ESP8266-compatible boards.</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1030" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/arduino_preferences" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Preferences.png?fit=753%2C693&amp;ssl=1" data-orig-size="753,693" data-comments-opened="0" data-image-title="Arduino Preferences for ESP8266 programming" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Preferences.png?fit=750%2C690&amp;ssl=1" class="aligncenter size-full wp-image-1030" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Preferences.png?resize=750%2C690" alt="Arduino Preferences for ESP8266 programming" width="750" height="690" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Preferences.png?w=753&amp;ssl=1 753w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Preferences.png?resize=300%2C276&amp;ssl=1 300w" sizes="auto, (max-width: 750px) 100vw, 750px" /></p>
<p>Close and reopen Arduino. Click on <em>Tools</em>, <em>Board</em>, and <em>Boards Manager&#8230;</em>. to open the board manager. The Arduino IDE will load the Additional Boards URL that you entered in the preferences.</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1240" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/arduino_boards_manager" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Boards_Manager.png?fit=790%2C659&amp;ssl=1" data-orig-size="790,659" data-comments-opened="0" data-image-title="Arduino Boards Manager" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Boards_Manager.png?fit=750%2C626&amp;ssl=1" class="aligncenter size-full wp-image-1240" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Boards_Manager.png?resize=750%2C626" alt="" width="750" height="626" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Boards_Manager.png?w=790&amp;ssl=1 790w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Boards_Manager.png?resize=300%2C250&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Boards_Manager.png?resize=768%2C641&amp;ssl=1 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /></p>
<h3>ThingSpeak Library</h3>
<p>Arduino needs to have a library installed in order for your thing to know how to send data to ThingSpeak. In the Arduino IDE, choose <em>Sketch</em>, <em>Include Library</em>, and <em>Manage Libraries</em>. Search for &#8220;thingspeak&#8221; and click Install.</p>
<p><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1239" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/arduino_library_install" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Library_Install.png?fit=786%2C443&amp;ssl=1" data-orig-size="786,443" data-comments-opened="0" data-image-title="Arduino Library Install" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Library_Install.png?fit=750%2C423&amp;ssl=1" class="aligncenter size-full wp-image-1239" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Library_Install.png?resize=750%2C423" alt="" width="750" height="423" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Library_Install.png?w=786&amp;ssl=1 786w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Library_Install.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Library_Install.png?resize=768%2C433&amp;ssl=1 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /></p>
<p>The thing that you bought from Amazon uses the CP2102 USB driver. You might have to install a USB driver from Silicon Labs for this to work with your computer. Connect the ESP8266 to your laptop with the micro USB cable.</p>
<p><a href="https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1031" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/usb_driver" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/USB_Driver.png?fit=478%2C447&amp;ssl=1" data-orig-size="478,447" data-comments-opened="0" data-image-title="USB Driver for the ESP8266 CP2102" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/USB_Driver.png?fit=478%2C447&amp;ssl=1" class="aligncenter size-full wp-image-1031" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/USB_Driver.png?resize=478%2C447" alt="USB Driver for the ESP8266 CP2102" width="478" height="447" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/USB_Driver.png?w=478&amp;ssl=1 478w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/USB_Driver.png?resize=300%2C281&amp;ssl=1 300w" sizes="auto, (max-width: 478px) 100vw, 478px" /></a></p>
<p>Back on the Arduino IDE, under tools, configure the following settings:</p>
<p><a href="https://www.amazon.com/gp/product/B010O1G1ES/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=nothans&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B010O1G1ES&amp;linkId=d1b845ae8775c055cdfd7caf91203364"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1032" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/arduino_board_settings" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Board_Settings.png?fit=500%2C600&amp;ssl=1" data-orig-size="500,600" data-comments-opened="0" data-image-title="Arduino Board Settings for NodeMCU" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Board_Settings.png?fit=500%2C600&amp;ssl=1" class="aligncenter size-full wp-image-1032" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Board_Settings.png?resize=500%2C600" alt="Arduino Board Settings for NodeMCU" width="500" height="600" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Board_Settings.png?w=500&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/Arduino_Board_Settings.png?resize=250%2C300&amp;ssl=1 250w" sizes="auto, (max-width: 500px) 100vw, 500px" /></a></p>
<p>Whew. We got through the setup. Now we can program this device or any ESP8266-compatible device and shouldn&#8217;t have to do that again.</p>
<h3>Programming</h3>
<p>The code that the Arduino IDE uses is called a &#8220;sketch&#8221; &#8211; this is just a short program that the device runs over and over. In our project, we are going to have the code measure the signal strength of the Wi-Fi connection and upload the data to ThingSpeak, wait, and repeat. Over time, we can see the signal strength of our Wi-Fi connection. Copy the <a href="https://github.com/nothans/ESP8266/blob/master/examples/RSSI_to_ThingSpeak.ino">example code</a> to your Arduino IDE and change some of the defaults to match your Wi-Fi network and ThingSpeak settings.</p>
<p>Once everything is set, click Sketch and then Upload. This will take the code and program the ESP8266 with it. It takes a minute, so be patient. If anything goes wrong, make sure that you have the right board settings and that your &#8220;Port&#8221; matches what your laptop thinks the port is.</p>
<p>Back on ThingSpeak, you should see data start to come in. You are looking for the Private View of your channel and a chart that is updating. As new data comes in, the chart shows the latest value. If you carry the ESP8266 around the house, you might notice the signal strength changing.</p>
<p><a href="https://thingspeak.com/channels/210455"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="1035" data-permalink="https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/thingspeak_channel" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak_Channel.png?fit=669%2C780&amp;ssl=1" data-orig-size="669,780" data-comments-opened="0" data-image-title="ThingSpeak_Channel" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak_Channel.png?fit=669%2C780&amp;ssl=1" class="aligncenter size-full wp-image-1035" src="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak_Channel.png?resize=669%2C780" alt="ThingSpeak_Channel" width="669" height="780" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak_Channel.png?w=669&amp;ssl=1 669w, https://i0.wp.com/nothans.com/wp-content/uploads/2017/02/ThingSpeak_Channel.png?resize=257%2C300&amp;ssl=1 257w" sizes="auto, (max-width: 669px) 100vw, 669px" /></a></p>
<h3>Next Steps</h3>
<p>To take the project further, you can use <a href="https://thingspeak.com/apps">MATLAB</a> on ThingSpeak to do some data analysis using the MATLAB function thingSpeakRead and passing in your channel number. I will post about IoT data analytics on another day. The ESP8266 source code for sending data to ThingSpeak is available on <a href="https://github.com/nothans/ESP8266/blob/master/examples/RSSI_to_ThingSpeak.ino">GitHub</a>.</p>
<p><strong>Welcome to the Internet of Things. Let me know if you try this out, and <a href="http://nothans.com/contact">let me know</a> if you take this project further and build something cool.</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/measure-wi-fi-signal-levels-with-the-esp8266-and-thingspeak/feed</wfw:commentRss>
			<slash:comments>37</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1027</post-id>	</item>
	</channel>
</rss>
