<?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>Projects &#8211; About Things | A Hans Scharler Blog</title>
	<atom:link href="https://nothans.com/category/projects/feed" rel="self" type="application/rss+xml" />
	<link>https://nothans.com</link>
	<description>Life, Comedy, Games, Tech, Marketing, and Community</description>
	<lastBuildDate>Wed, 02 Sep 2026 21:37:43 +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>Projects &#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 Project Update: Run Your Own Cable Network with New Channels</title>
		<link>https://nothans.com/cable-82-project-update-run-your-own-cable-network-with-new-channels</link>
					<comments>https://nothans.com/cable-82-project-update-run-your-own-cable-network-with-new-channels#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 01 Sep 2026 16:20:26 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[CABLE 82]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[TV]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5685</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>CABLE 82 started as one channel: a 1982-style community bulletin board on a Raspberry Pi, broadcast over RF to a 1987 Magnavox. With my latest GitHub release,&nbsp;<a href="https://github.com/nothans/cable-82/releases/tag/v0.2.0">v0.2.0, &#8220;The dial&#8221;</a>, the CABLE 82 project becomes a cable network. And, you set the programming.</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="5696" data-permalink="https://nothans.com/cable-82-project-update-run-your-own-cable-network-with-new-channels/cable-82" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?fit=2000%2C1600&amp;ssl=1" data-orig-size="2000,1600" data-comments-opened="0" data-image-title="Run Your Own Cable Network with the CABLE 82 project" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?fit=750%2C600&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=750%2C600&#038;ssl=1" alt="" class="wp-image-5696" style="width:535px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=1024%2C819&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=768%2C614&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=1536%2C1229&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=750%2C600&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=1320%2C1056&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?resize=80%2C64&amp;ssl=1 80w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/09/cable-82.png?w=2000&amp;ssl=1 2000w" sizes="(max-width: 750px) 100vw, 750px" /></figure>
</div>

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


<ul class="wp-block-list">
<li><strong>Video channels.</strong>&nbsp;Drop video files in a folder and point a channel at it. My folder of 90s commercials is now channel 2, for example.</li>



<li><strong>A broadcast clock.</strong>&nbsp;Channels air whether you&#8217;re watching or not. Tune away, tune back, and you land mid-program.</li>



<li><strong>Scheduled hours.</strong>&nbsp;Cartoons can keep Saturday-morning hours. Off the air, the channel shows a test card with the resume time, color bars, or static.</li>



<li><strong>A tuner.</strong>&nbsp;Change channels with arrow keys, a USB gamepad, or an HTTP request. Every change cuts through a moment of tuner static and shows a channel banner.</li>



<li><strong>A demo channel.</strong>&nbsp;<code>node channels/fetch-demo-channel.js</code>&nbsp;downloads eight public-domain films from the Internet Archive&#8217;s Prelinger collection. Duck and Cover, Design for Dreaming, One Got Fat. A working channel in one command.</li>



<li><strong>The control room.</strong>&nbsp;A Channels panel with a folder picker, a schedule editor, and a week grid of your on-air windows.</li>
</ul>


<h2 class="wp-block-heading" id="the-broadcast-clock">The broadcast clock</h2>


<p>A normal media player has a play state: what&#8217;s playing, where you paused, what&#8217;s next. A cable channel has none of that. Its position is a pure function of the wall clock: given the playlist and the time of day, the channel knows exactly what should be on the air and how far into it we are.</p>



<p>That means there is nothing to save and nothing to resume. Tune to channel 2 at 9:14 and you join a commercial already in progress, like TV that doesn&#8217;t wait for you. </p>


<h2 class="wp-block-heading" id="i-changed-channels-with-an-atari-joystick">I changed channels with an Atari joystick</h2>


<p>The tuner reads NES-style D-pad buttons and the analog axis, so when I plugged in a single-button Atari USB stick, up and down worked on the first try. A 1977-style controller changing channels on a 1987 television driven by a modern Raspberry Pi. The input doesn&#8217;t care what you use: anything that can press a key, close a GPIO pin, or POST to&nbsp;<code>/api/tune</code>&nbsp;is a remote control.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-9-16 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="CABLE 82 -- Run Your Own Cable Network from a Raspberry Pi!  #raspberrypi #crt" width="563" height="1000" src="https://www.youtube.com/embed/E5Xh6JH8H08?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>My CABLE 82 network has a channel dedicated to 80s commercials, 90s commercials, retro movies, Beavis and Butthead, music videos, Transformers, Saturday morning cartoons, and the community bulletin board. I have been busy copying old VHS tapes to MP4.</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 class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/KROAE0mn7vo?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>


<h2 class="wp-block-heading" id="thermals">Thermals</h2>


<p>Software video decode is the hardest this Pi has ever worked. The bulletin board alone kept the 3 B+ in the high 50s C; continuous video holds it in the low 60s. That trips the 3 B+&#8217;s soft temperature cap at 60 C (<code>vcgencmd get_throttled</code>&nbsp;reports&nbsp;<code>0x80008</code>), which is the chip protecting itself by design &#8211; not a power problem, and the picture doesn&#8217;t care.</p>



<p>Passive cooling has been fine, but a network that broadcasts around the clock earns a fan. I&#8217;m looking at a&nbsp;<a href="https://www.amazon.com/gp/product/B0B79JHSFW?tag=nothans">Raspberry Pi 3 case with a fan and heatsinks</a>. It also comes with a 3A supply with a power switch, but don&#8217;t use the power switch. Send a proper shutdown signal to the Raspberry Pi. Older Pi&#8217;s can corrupt the SD card.</p>


<h2 class="wp-block-heading" id="get-the-latest-cable-82-release">Get the latest CABLE 82 release</h2>


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



<p>Open the address it prints and you&#8217;re on the air with channel 82, the community bulletin board. Run the demo channel fetcher, add it in the control room, and you have a network. </p>



<p>The repo is at&nbsp;<a href="https://github.com/nothans/cable-82">github.com/nothans/cable-82</a>. The original&nbsp;<a href="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel">build story</a>&nbsp;and the&nbsp;<a href="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv">step-by-step tutorial</a>&nbsp;cover the build from a blank SD card to a cable network of your own.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/cable-82-project-update-run-your-own-cable-network-with-new-channels/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5685</post-id>	</item>
		<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" loading="lazy" 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="auto, (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" loading="lazy" 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="auto, (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" loading="lazy" 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="auto, (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>CABLE 82: Turn a Raspberry Pi and an Old CRT Into a 1982 Cable Bulletin Board Channel</title>
		<link>https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel</link>
					<comments>https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel#comments</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Thu, 23 Jul 2026 01:42:05 +0000</pubDate>
				<category><![CDATA[CheerLights]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[CABLE 82]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[retro]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5489</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>Before feeds, your town had a channel.</p>



<p>You might know the one if you watched MTV when it first came on cable. A flat blue screen, chunky white text, the time and the temperature in the corner. The Lions Club pancake breakfast. A birthday wish for someone named STEVE. Little League signups at the rec center. Headlines crawling along the bottom while a Muzak version of a song you almost recognized played underneath. I remember watching it for long stretches, waiting for the flea market notice to come back around. Our Sears CRT had the blue bars burnt in.</p>



<p>At some point, the Cable Bulletin Board Channel disappeared from all of our lives. NOBODY IS TALKING ABOUT IT.</p>



<p>Recently, I have been spending evenings learning about retro gaming and reading posts on Reddit saying that you have to game on a CRT for the proper gaming experience. This led me to Facebook Marketplace. After a few weeks of looking at photos of TVs this got me remembering the big honker in our living room&#8230; then, I uncovered a repressed memory. I had to have it back in my life.</p>


<h2 class="wp-block-heading" id="meet-cable-82">Meet CABLE 82</h2>


<p>CABLE 82 is a tiny web app that turns any screen into your own 1982 community bulletin board channel. Ideally that screen is an old 4:3 CRT fed by a Raspberry Pi, sitting in the corner of a room, being ambient.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://github.com/nothans/cable-82"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="600" data-attachment-id="5490" data-permalink="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/hero" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?fit=2000%2C1600&amp;ssl=1" data-orig-size="2000,1600" data-comments-opened="0" data-image-title="CABLE 82: Turn a Raspberry Pi and an Old CRT Into a 1982 Cable Bulletin Board Channel" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?fit=750%2C600&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=750%2C600&#038;ssl=1" alt="CABLE 82: Turn a Raspberry Pi and an Old CRT Into a 1982 Cable Bulletin Board Channel" class="wp-image-5490" style="aspect-ratio:1.2504481250448125;width:545px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=1024%2C819&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=768%2C614&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=1536%2C1229&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=750%2C600&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=1320%2C1056&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=80%2C64&amp;ssl=1 80w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?w=2000&amp;ssl=1 2000w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a></figure>
</div>


<p>It scrolls the date and time, your community messages, fun facts, dad jokes, live weather, and headlines from whatever RSS feeds you point it at. There is a crawl along the bottom, a red LATEST flag, and a little station bug in the corner, because of course there is.</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/d5Jcfx5oN0A?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>You make it yours in a control room in the browser, or by editing one plain config file. It is free and open source and it runs on a Raspberry Pi.</p>



<p>The rest of this post is how to get it going on a Raspberry Pi and a CRT.</p>


<h2 class="wp-block-heading" id="step-1-get-it-on-the-air">Step 1: Get it on the air</h2>


<p>SSH into the Pi, or just open a terminal on it, and run:</p>



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



<p>Open&nbsp;<code>http://localhost:1982</code>&nbsp;in a browser on the Pi. You&#8217;re on the air.</p>



<p>Out of the box it already looks right: the blue screens, the clock, a couple of example bake-sale messages, and real headlines pulled from a few default feeds.</p>


<h2 class="wp-block-heading" id="step-2-make-it-your-channel">Step 2: Make it your channel</h2>


<p>Everything about the channel lives in one place. Open the control room at&nbsp;<code>http://localhost:1982/config</code>&nbsp;and you get the whole thing on one screen: the name, your community messages, which RSS feeds to pull, your town&#8217;s weather, the colors, the page lineup. Change something, hit Save, and the channel updates itself within about twenty seconds. Nobody has to touch the TV.</p>



<p>If you would rather edit a file, it all lives in&nbsp;<code>config.json</code>, and you can hand-edit that just as happily. Put your own town in the weather. Drop in the feeds you actually read. Write the messages your household needs to see, which in my house is mostly reminders that trash day is tomorrow.</p>


<h2 class="wp-block-heading" id="step-3-run-it-on-boot">Step 3: Run it on boot</h2>


<p>You do not want to SSH in and start a server every time the power blips. Make it a service so the Pi just comes up broadcasting.</p>



<p>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/pi/cable-82/server.js
Restart=always
User=pi

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



<p>Then turn it on:</p>



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



<p>Now the channel is always running in the background, whether anything is looking at it or not.</p>


<h2 class="wp-block-heading" id="step-4-point-a-browser-at-it-full-screen">Step 4: Point a browser at it, full screen</h2>


<p>Have the Pi launch Chromium in kiosk mode, pointed at the channel:</p>



<pre class="wp-block-code"><code>chromium-browser --kiosk --noerrdialogs --disable-infobars \
  --disable-lcd-text \
  --autoplay-policy=no-user-gesture-required \
  http:&#47;&#47;localhost:1982</code></pre>



<p>Two of those flags earn their keep.&nbsp;<code>--disable-lcd-text</code>&nbsp;turns off subpixel font smoothing, which otherwise tints the chunky white text a faint pink on some screens.&nbsp;<code>--autoplay-policy=no-user-gesture-required</code>&nbsp;lets the background music start on its own at boot, so nobody has to click anything to get the beautiful-music bed going.</p>



<p>While you are in there, turn off screen blanking so the picture never sleeps:&nbsp;<code>sudo raspi-config</code>&nbsp;&gt; Display Options &gt; Screen Blanking &gt; No.</p>


<h2 class="wp-block-heading" id="step-5-get-it-onto-a-real-crt">Step 5: Get it onto a real CRT</h2>


<p>The easiest and most reliable hookup works on any Pi and any TV with a coax (antenna) input. Run&nbsp;HDMI from the Pi into an&nbsp;<a href="https://amzn.to/4ftrKsq">HDMI-to-coax RF modulator</a>, then run coax from the modulator into the TV, and tune the TV to&nbsp;channel 3 or 4. Your Pi is now a broadcast channel and the TV is receiving it over the air the way God and 1982 intended.</p>



<p>If the TV crops the edges of the picture, bump up the overscan margin in the control room until nothing important gets cut off. There are no fake scanline filters in CABLE 82, on purpose. The CRT is the filter.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="691" height="553" data-attachment-id="5601" data-permalink="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/image-147" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?fit=691%2C553&amp;ssl=1" data-orig-size="691,553" data-comments-opened="0" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?fit=691%2C553&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?resize=691%2C553&#038;ssl=1" alt="" class="wp-image-5601" style="width:269px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?w=691&amp;ssl=1 691w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?resize=80%2C64&amp;ssl=1 80w" sizes="auto, (max-width: 691px) 100vw, 691px" /></figure>
</div>

<h2 class="wp-block-heading" id="step-6-give-it-a-soundtrack">Step 6: Give it a soundtrack</h2>


<p>Drop a few audio files into the&nbsp;<code>music/</code>&nbsp;folder and CABLE 82 plays them as a continuous background bed behind the pages, looping the set, shuffling if you like. Two tracks ship with it to get you started. Aim for the sound the old channels actually used: beautiful music, easy listening, and eventually the famous smooth jazz.</p>


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


<p>A Pi, an old TV, a coax cable, and a folder of files, and now there is a corner of your house that runs its own quiet little channel: your messages, your weather, your headlines, your dad jokes, scrolling by all day.</p>



<p>It&#8217;s not useful, exactly. It&#8217;s better than useful.</p>



<p>CABLE 82 is open source and lives at&nbsp;<a href="https://github.com/nothans/cable-82">github.com/nothans/cable-82</a>.</p>


<h2 class="wp-block-heading" id="project-demo-video">Project Demo Video</h2>


<p>Watch 6 minutes of glorious community news like it is 1982. Enjoy.</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/0YEvI_oFfqY?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>


<h2 class="wp-block-heading" id="update-july-27-2026-cheerlights-support">Update July 27, 2026: CheerLights Support</h2>


<p>I can&#8217;t believe that it took me a few days to do this&#8230; <a href="https://cheerlights.com/">CheerLights</a>. A perfect feed (for me) is to see the latest CheerLights color scroll by every once in a while. Okay, so now you can add CheerLights feed support with a custom message if needed.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://github.com/nothans/cable-82"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="422" data-attachment-id="5531" data-permalink="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/image-133" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?fit=1920%2C1080&amp;ssl=1" data-orig-size="1920,1080" data-comments-opened="0" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?fit=750%2C422&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=750%2C422&#038;ssl=1" alt="" class="wp-image-5531" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=1024%2C576&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=768%2C432&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=1536%2C864&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=750%2C422&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=480%2C270&amp;ssl=1 480w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=1320%2C743&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?w=1920&amp;ssl=1 1920w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">CheerLights is now on the CABLE 82 project</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="update-august-22-2026-updated-github-readme-and-better-crt-support">Update August 22, 2026: Updated GitHub README and better CRT support</h2>


<p>Based on some user feedback, I built a version of the project on an older Raspberry Pi and used a much older CRT TV. This helped me find some areas for improvement.</p>



<p>I updated the kiosk command to use chromium (not chromium-browser), and it goes in ~/.config/labwc/autostart.</p>



<p>Old TVs do not have as much contrast as newer ones, so I added a CRT mode to help. This is in the &#8220;control room&#8221; or in the config.</p>



<p>And, a user reported &#8220;throttling&#8221; of the CPU. This happens when the Raspberry Pi is underpowered. This usually happens when you use a phone USB charger instead of a Raspberry Pi power supply.</p>



<p>From what I learned during the first month of the project, I added a <a href="https://github.com/nothans/cable-82#troubleshooting">troubleshooting</a> section to the GitHub README for the CABLE 82 project.</p>



<p>I will publish an end-to-end tutorial for a Raspberry Pi 3 B+ soon to help smooth out the installation steps.</p>



<p>Thanks for sharing your feedback and trying the project. It helps all of us.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5596" data-permalink="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/image-146" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?fit=712%2C945&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?resize=712%2C945&#038;ssl=1" alt="Cable-82 running a Raspberry Pi and a CRT TV from 1987" class="wp-image-5596" style="aspect-ratio:0.7534664689979943;width:270px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /><figcaption class="wp-element-caption">CABLE 82 server running on a Raspberry Pi and a CRT TV from 1987</figcaption></figure>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/feed</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5489</post-id>	</item>
		<item>
		<title>Abode 101: A Practical Project to Learn the Open Knowledge Format (OKF)</title>
		<link>https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf</link>
					<comments>https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sun, 28 Jun 2026 17:14:36 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[abode101]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[okf]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5457</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://www.youtube.com/watch?v=gYMh5LDbtw8" target="_blank" rel=" noreferrer noopener"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5459" data-permalink="https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf/okf-for-your-house-abode101" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?fit=2048%2C2048&amp;ssl=1" data-orig-size="2048,2048" data-comments-opened="0" data-image-title="Google OKF for your house abode101" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5459" style="width:556px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=1024%2C1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=1536%2C1536&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=750%2C750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=500%2C500&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?resize=1320%2C1320&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-for-your-house-abode101.png?w=2048&amp;ssl=1 2048w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">Google OKF for Your House</figcaption></figure>
</div>


<p>I was standing in the hardware store holding a dead coin cell, squinting at it, trying to remember if the Lutron dimmer in my hallway takes a CR2032 or one of the other fourteen round silver batteries that all look exactly the same. So I guessed. I bought two of the wrong one. Classic.</p>



<p>Here is the thing about a house. You slowly learn a thousand tiny facts about it. The vent sizes. The filter part numbers. The spa was installed in some year you&#8217;ll never remember. The good info is scattered across manuals in a junk drawer, an email from the installer, a photo of a model plate you took and never looked at again. By the time you actually need a fact, it&#8217;s gone.</p>



<p>I finally fixed it. Not with an app. With a folder.</p>


<h2 class="wp-block-heading" id="the-idea-i-borrowed">The idea I borrowed</h2>


<p>Earlier this year Andrej Karpathy posted a little pattern he called an &#8220;LLM wiki.&#8221; Instead of the usual retrieval setup where you chop documents into chunks and stuff them in a vector database, you just keep a folder of Markdown files that the AI itself writes and maintains. The model builds the connections once, when it learns something, instead of re-deriving them every single time you ask. The internet looked at it and went &#8220;wait, it&#8217;s just a folder? why did we ever do the other thing.&#8221;</p>



<p>Then Google Cloud made it official. On June 12 they published the&nbsp;<a href="https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md">Open Knowledge Format</a>, or OKF. It&#8217;s a tiny, vendor-neutral spec: a directory of Markdown files, one concept per file, a bit of YAML at the top, an index, links between them. No database. No SDK. Readable by a human and by any agent. That&#8217;s the whole thing.</p>



<p>So I pointed it at my house. The project is called Abode 101.</p>


<h2 class="wp-block-heading" id="what-i-actually-built">What I actually built</h2>


<p><a href="https://github.com/nothans/abode101" target="_blank" rel="noreferrer noopener">Abode 101</a> is an OKF folder about my home. There&#8217;s a file for the Lutron dimmer, one for the swim spa, one for the HVAC vents, one for the smoke alarms. There&#8217;s an <code>index.md</code> the AI reads first so it knows where to look. To use it, I don&#8217;t open an app. I just talk to it in Claude Code.</p>



<pre class="wp-block-code"><code>you ▸ what's the battery for the Lutron dimmer?
abode ▸ Panasonic CR2032, per the install guide (page 10).</code></pre>



<p>That&#8217;s the fact I drove to the store without. Now it&#8217;s one question away, and it tells me where it got the answer.</p>



<figure class="wp-block-embed aligncenter 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/gYMh5LDbtw8?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">Abode101 Explainer Video</figcaption></figure>



<p>But a folder of files just sitting there is a filing cabinet. The magic is in two things the bare spec leaves out.</p>


<h2 class="wp-block-heading" id="thing-one-the-loop">Thing one: the loop</h2>

<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="572" height="1024" data-attachment-id="5460" data-permalink="https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf/okf-loop" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?fit=1429%2C2560&amp;ssl=1" data-orig-size="1429,2560" data-comments-opened="0" data-image-title="okf loop" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?fit=572%2C1024&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop.png?resize=572%2C1024&#038;ssl=1" alt="" class="wp-image-5460" style="width:484px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=572%2C1024&amp;ssl=1 572w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=167%2C300&amp;ssl=1 167w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=768%2C1376&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=857%2C1536&amp;ssl=1 857w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=1143%2C2048&amp;ssl=1 1143w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=750%2C1344&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?resize=1320%2C2365&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-loop-scaled.png?w=1429&amp;ssl=1 1429w" sizes="auto, (max-width: 572px) 100vw, 572px" /></figure>
</div>


<p>OKF standardizes the files. It says nothing about keeping them fresh. Karpathy&#8217;s original idea had the AI do the maintaining, and that&#8217;s the part I cared about most, so I built it back in as a set of playbooks.</p>



<p>I capture a thing by telling it &#8220;I bought X,&#8221; or by dropping a manual, a receipt, or a photo of a label into an inbox folder. It reads whatever I throw at it, pulls out the real specs, and files them. Then overnight it does the boring homework I never do. It looks up the filter I just bought, finds the replacement part, figures out how often it needs changing, and adds a reminder. I wake up and my house knows more than it did when I went to bed.</p>


<h2 class="wp-block-heading" id="thing-two-it-refuses-to-guess">Thing two: it refuses to guess</h2>

<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="572" height="1024" data-attachment-id="5458" data-permalink="https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf/okf-battery" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?fit=1429%2C2560&amp;ssl=1" data-orig-size="1429,2560" data-comments-opened="0" data-image-title="okf battery answer" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?fit=572%2C1024&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery.png?resize=572%2C1024&#038;ssl=1" alt="" class="wp-image-5458" style="width:474px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=572%2C1024&amp;ssl=1 572w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=167%2C300&amp;ssl=1 167w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=768%2C1376&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=857%2C1536&amp;ssl=1 857w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=1143%2C2048&amp;ssl=1 1143w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=750%2C1344&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?resize=1320%2C2365&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/06/okf-battery-scaled.png?w=1429&amp;ssl=1 1429w" sizes="auto, (max-width: 572px) 100vw, 572px" /></figure>
</div>


<p>This is the part I&#8217;m proud of. Every exact fact carries its source and a confidence level. A battery type from the manufacturer&#8217;s manual is &#8220;verified&#8221; and it gets cited. A spec from a random Amazon listing is &#8220;reported&#8221; and ranked lower. And when I ask something it doesn&#8217;t actually know, it says so.</p>



<pre class="wp-block-code"><code>you ▸ what size is the kitchen toe-kick vent?
abode ▸ Not recorded. It's marked TODO, needs measuring. I won't guess.</code></pre>



<p>An AI that says &#8220;I don&#8217;t know&#8221; instead of inventing a confident wrong number. For house facts, where the wrong answer means a second trip to the store or a part that doesn&#8217;t fit, that refusal is the feature.</p>



<p>I ran a little eval suite over it to make sure. Twenty-one questions, answered cold. It got the exact facts right, with sources, and on the three questions it shouldn&#8217;t know, it refused all three. That&#8217;s the behavior I want from something I&#8217;m going to trust with my house.</p>


<h2 class="wp-block-heading" id="why-a-folder-beats-an-app">Why a folder beats an app</h2>


<p>I could have built a slick app with a database. I&#8217;m glad I didn&#8217;t. The folder is portable, it diffs in version control, it works with any model, and I own it. There&#8217;s no service to shut down, no export button I&#8217;ll go hunting for in five years. When the next better model comes out, I point it at the same folder and it just works. Try that with your smart-home app from 2014.</p>


<h2 class="wp-block-heading" id="get-it">Get it</h2>


<p>I open-sourced the framework. The structure, the agent instructions, the playbooks, even the eval harness are all in the repo. My actual house data stays on my machine, gitignored, because you do not need to know my spa&#8217;s gallon count. You fork it and fill it with your own home.</p>



<p><strong>→&nbsp;<a href="https://github.com/nothans/abode101">github.com/nothans/abode101</a></strong></p>



<p>Go give your house a memory. And maybe check what battery your dimmer takes before you drive to the store. Just a thought&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/abode-101-a-practical-project-to-learn-the-open-knowledge-format-okf/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5457</post-id>	</item>
		<item>
		<title>It&#8217;s Time for Snowblower Maintenance Ahead of the Big Storm</title>
		<link>https://nothans.com/its-time-for-snowblower-maintenance-ahead-of-the-big-storm</link>
					<comments>https://nothans.com/its-time-for-snowblower-maintenance-ahead-of-the-big-storm#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sat, 06 Jan 2024 22:13:09 +0000</pubDate>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Ariens]]></category>
		<category><![CDATA[maintenance]]></category>
		<category><![CDATA[snowblower]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=4440</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>The big topic all week is the big storm that is projected to come our way. This means that we are likely to get snow. It would be the first snow of the season. This also means that I haven&#8217;t run my snowblower yet. Well, it&#8217;s time for snowblower maintenance. It is way easier to do the maintenance ahead of the snow season, so you (and everyone else) are not scrambling to The Home Depot for the last shear bolts in stock.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="4442" data-permalink="https://nothans.com/its-time-for-snowblower-maintenance-ahead-of-the-big-storm/image-6-14" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?fit=1266%2C950&amp;ssl=1" data-orig-size="1266,950" data-comments-opened="0" data-image-title="Snowblower selfie" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?resize=750%2C563&#038;ssl=1" alt="" class="wp-image-4442" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?resize=750%2C563&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-6.png?w=1266&amp;ssl=1 1266w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">George and I Getting Ready for the Nor&#8217;easter Snow Storm</figcaption></figure>
</div>


<p>Here are some tips that I have learned after a few seasons in New England with an Ariens 1128 Sno-Thro snowblower.</p>



<p><strong>RTFM.</strong> The manual contains a lot of clues. <a href="https://www.ariens.com/en-us/productsupport" target="_blank" rel="noreferrer noopener">Ariens.com</a> has manuals for all of its models archived. Actually, I find that the manual gets more helpful over time. Initially, you don’t know anything about this machine that you just bought. How hard could it be, you may think? The machine typically works pretty well when you first get it. Once you get a little time under your belt, read the manual. You will find little details that help you understand what’s going on.</p>



<p><strong>Take notes.&nbsp;</strong>When you learn something, write it down. Your future self will thank you. Write down the socket sizes, threads, part numbers for replacement parts, and any tips that you discover.</p>



<p><strong>Watch videos on YouTube.</strong>&nbsp;When you encounter a problem or a developing issue, find appropriate videos on YouTube. You will have to make sure that you watch a video on your specific model, as sometimes you might be watching a video on a different model. I tend to act like a detective and seek out the information from the videos. Not all of the videos, or every video you are going to find, are going to apply. This is a good skill to develop to speed up the learning process with anything that you may want to learn.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 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/WaMhISxX9j8?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">How To Grease Your Snow Blower Auger</figcaption></figure>



<p><strong>Grease the shear bolts.</strong>&nbsp;Your snowblower is designed to fail-safe when you run over a dog toy, a tree branch, or a rock. A shear bolt is designed to break in case of a jam instead of putting the forces back on the belt, drive, and motor. When you replace your shear bolt, grease it up. It will be easier to remove and replace when you inevitably hit something.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="812" height="887" data-attachment-id="2713" data-permalink="https://nothans.com/zen-and-the-art-of-snowblower-maintenance-ariens-sno-thro-repair/shear-bolt" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/shear-bolt.jpg?fit=812%2C887&amp;ssl=1" data-orig-size="812,887" data-comments-opened="0" data-image-title="shear-bolt" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/shear-bolt.jpg?fit=750%2C819&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/shear-bolt.jpg?resize=750%2C819&amp;ssl=1" alt="" class="wp-image-2713" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/shear-bolt.jpg?w=812&amp;ssl=1 812w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/shear-bolt.jpg?resize=275%2C300&amp;ssl=1 275w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/shear-bolt.jpg?resize=768%2C839&amp;ssl=1 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Greased Shear Bolt</figcaption></figure>



<p><strong>Keep a stock of shear bolts.</strong>&nbsp;Use the manual to find the type of shear bolt you need. Write down the part number.&nbsp;Buy a bunch of <a href="https://amzn.to/41R2eWQ">shear bolts</a>. Try them out as soon as you get them. Make sure they fit and last with normal wear. On Amazon, there is a variety of quality that you will find. So, find ones that work and return the ones that don’t. You will be thankful when you need them. In New England, they tend to be out of stock in the winter since everyone is breaking their shear bolts and going out to buy them. Mine uses a 1/2″ socket to install. Yes, I wrote that down in my notes.</p>



<p><strong>Grease the auger when you replace the shear bolts.&nbsp;</strong>A good time to grease the auger shaft is when you replace the shear bolts. I like to take the shear bolts off and apply grease via the Zerk fittings and then spin the auger to spread out the grease. I squeeze grease in there until it comes out the sides of the auger. This was something I had to watch a&nbsp;<a rel="noreferrer noopener" href="https://www.youtube.com/watch?v=WaMhISxX9j8" target="_blank">YouTube</a>&nbsp;video on. I never used my grease gun before and didn’t even know how to attach it to the grease fitting.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1184" height="888" data-attachment-id="2714" data-permalink="https://nothans.com/zen-and-the-art-of-snowblower-maintenance-ariens-sno-thro-repair/grease-fitting" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/grease-fitting.jpg?fit=1184%2C888&amp;ssl=1" data-orig-size="1184,888" data-comments-opened="0" data-image-title="grease-fitting" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/grease-fitting.jpg?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/grease-fitting.jpg?resize=750%2C563&amp;ssl=1" alt="" class="wp-image-2714" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/grease-fitting.jpg?w=1184&amp;ssl=1 1184w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/grease-fitting.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/grease-fitting.jpg?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/grease-fitting.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/grease-fitting.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Grease Gun Correctly Connected to a Zerk Grease Fitting</figcaption></figure>



<p><strong>Maintain the correct tire pressure.&nbsp;</strong>My Ariens 1128 tires require 14 psi to function properly. I bought a battery-powered air compressor to make it easy to fill the tires. I also like that it tells me the pressure in the tire with a digital readout. Make sure that both tires are set to the same air pressure. This will help the snowblower travel in a straight line. If you don’t know your target PSI, check the sides of the tires. It is usually written on the walls of the tire.</p>



<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://nothans.com/its-time-for-snowblower-maintenance-ahead-of-the-big-storm&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="666" height="888" data-attachment-id="2715" data-permalink="https://nothans.com/zen-and-the-art-of-snowblower-maintenance-ariens-sno-thro-repair/tire-air-pressure" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/tire-air-pressure.jpg?fit=666%2C888&amp;ssl=1" data-orig-size="666,888" data-comments-opened="0" data-image-title="tire-air-pressure" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/tire-air-pressure.jpg?fit=666%2C888&amp;ssl=1" data-id="2715" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/tire-air-pressure.jpg?resize=666%2C888&#038;ssl=1" alt="" class="wp-image-2715" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/tire-air-pressure.jpg?w=666&amp;ssl=1 666w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/02/tire-air-pressure.jpg?resize=225%2C300&amp;ssl=1 225w" sizes="auto, (max-width: 666px) 100vw, 666px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="716" height="950" data-attachment-id="4441" data-permalink="https://nothans.com/its-time-for-snowblower-maintenance-ahead-of-the-big-storm/image-5-16" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-5.png?fit=716%2C950&amp;ssl=1" data-orig-size="716,950" data-comments-opened="0" data-image-title="correct snowblower tire pressure" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-5.png?fit=716%2C950&amp;ssl=1" data-id="4441" src="https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-5.png?resize=716%2C950&#038;ssl=1" alt="" class="wp-image-4441" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-5.png?w=716&amp;ssl=1 716w, https://i0.wp.com/nothans.com/wp-content/uploads/2024/01/image-5.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 716px) 100vw, 716px" /></figure>
</figure>



<p><strong>Take advantage of the calm before the storm.&nbsp;</strong>It’s freezing in the winter, and it&#8217;s not convenient to perform maintenance. In the spring or fall, you can take advantage of warmer weather and lower stakes. Grease the auger, <a href="https://amzn.to/41R2eWQ" target="_blank" rel="noreferrer noopener">buy some shear bolts from Amazon</a>, clean the gas, add oil, tighten the chute, and set the right air pressure in your tires.</p>



<p><em>Godspeed.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/its-time-for-snowblower-maintenance-ahead-of-the-big-storm/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4440</post-id>	</item>
		<item>
		<title>CheerLights for Halloween</title>
		<link>https://nothans.com/cheerlights-for-halloween-fearlights</link>
					<comments>https://nothans.com/cheerlights-for-halloween-fearlights#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 24 Oct 2023 19:27:07 +0000</pubDate>
				<category><![CDATA[CheerLights]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[ThingSpeak]]></category>
		<category><![CDATA[cheerlights]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[thingspeak]]></category>
		<category><![CDATA[web of things]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=4170</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>Are you ready? Ready for another season of <a href="https://cheerlights.com">CheerLights</a>? I love seeing CheerLights have a longer and longer season as the years go by. Last year, many people made Halloween displays that were connected to the CheerLights project&#8230; <a href="http://fearlights.com">FearLights</a>&#8230; if you will.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="http://fearlights.com/"><img loading="lazy" decoding="async" width="518" height="142" data-attachment-id="3420" data-permalink="https://nothans.com/cheerlights-for-halloween/cyan-cheerlights-color" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/Cyan-CheerLights-Color.png?fit=518%2C142&amp;ssl=1" data-orig-size="518,142" data-comments-opened="0" data-image-title="Cyan CheerLights Color" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/Cyan-CheerLights-Color.png?fit=518%2C142&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/Cyan-CheerLights-Color.png?resize=518%2C142&amp;ssl=1" alt="" class="wp-image-3420" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/Cyan-CheerLights-Color.png?w=518&amp;ssl=1 518w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/Cyan-CheerLights-Color.png?resize=300%2C82&amp;ssl=1 300w" sizes="auto, (max-width: 518px) 100vw, 518px" /></a><figcaption class="wp-element-caption">Cyan FearLights!</figcaption></figure>
</div>


<p><a rel="noreferrer noopener" href="https://cheerlights.com/" target="_blank">CheerLights</a> is a fun way to get started with IoT, microcontrollers, and LED lights. If you know how to make CheerLights work, you can build some other awesome IoT projects. CheerLights is a great project to get people interested in IoT. It&#8217;s often used as an &#8220;Hello, World&#8221; project for the Internet of Things, and what you learn can be applied to other project ideas.</p>



<p>To make a Halloween-inspired project, you can take the CheerLights color and illuminate a pumpkin or even a&#8230; skull from <a rel="noreferrer noopener" href="https://shop.pimoroni.com/products/wireless-plasma-kit" target="_blank">Pimoroni</a>.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://twitter.com/mtaylorsherwood/status/1585202938850729985/photo/1"><img loading="lazy" decoding="async" width="1300" height="1726" data-attachment-id="3421" data-permalink="https://nothans.com/cheerlights-for-halloween/image-7" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/image-7.png?fit=1300%2C1726&amp;ssl=1" data-orig-size="1300,1726" data-comments-opened="0" data-image-title="CheerLights Halloween Skull" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/image-7.png?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/image-7.png?resize=750%2C996&amp;ssl=1" alt="" class="wp-image-3421" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/image-7.png?w=1300&amp;ssl=1 1300w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/image-7.png?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/image-7.png?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/image-7.png?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/image-7.png?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/10/image-7.png?resize=750%2C996&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">Pimoroni Wireless Plasma Stick + Glass Skull</figcaption></figure>
</div>


<p>Check out other Halloween CheerLights projects over at the CheerLights <a rel="noreferrer noopener" href="https://cheerlights.com/halloween/" target="_blank">blog</a>. Have fun with the idea, build something spooky, and help spread the… <em>fear</em>.</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/2so03Zzy5Fc?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">Streaming Lo-Fi inspired by the latest CheerLights Color</figcaption></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/cheerlights-for-halloween-fearlights/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4170</post-id>	</item>
		<item>
		<title>Top 10 IoT Project Ideas For ThingSpeak</title>
		<link>https://nothans.com/top-10-iot-project-ideas-for-thingspeak</link>
					<comments>https://nothans.com/top-10-iot-project-ideas-for-thingspeak#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Wed, 22 Feb 2023 00:14:13 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[ThingSpeak]]></category>
		<category><![CDATA[ideas]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[thingspeak]]></category>
		<category><![CDATA[web of things]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=3649</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading" id="what-is-thingspeak">What is ThingSpeak?</h2>


<p><a href="https://thingspeak.com">ThingSpeak</a> is an Internet of Things (IoT) platform that allows you to collect, analyze, and act on data from sensors and other IoT devices. The platform provides a web-based interface for users to create and manage channels, which are virtual locations where data from sensors and other devices can be collected and analyzed using the built-in MATLAB analytics app.</p>



<figure class="wp-block-image size-full"><a href="https://thingspeak.com/"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="555" data-attachment-id="3650" data-permalink="https://nothans.com/top-10-iot-project-ideas-for-thingspeak/image-3-6" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/image-3.png?fit=949%2C702&amp;ssl=1" data-orig-size="949,702" data-comments-opened="0" data-image-title="ThingSpeak for IoT Projects" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/image-3.png?fit=750%2C555&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/image-3.png?resize=750%2C555&#038;ssl=1" alt="" class="wp-image-3650" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/image-3.png?w=949&amp;ssl=1 949w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/image-3.png?resize=300%2C222&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/image-3.png?resize=768%2C568&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/image-3.png?resize=750%2C555&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/image-3.png?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">ThingSpeak for IoT Projects</figcaption></figure>



<p>With ThingSpeak, you can visualize your data in real-time, generate alerts and notifications based on pre-defined thresholds, and even automate actions based on specific conditions. The platform also includes built-in integrations with popular IoT hardware platforms, such as Arduino and Raspberry Pi, making it easy to connect your devices to the internet and start collecting data.</p>


<h2 class="wp-block-heading" id="top-10-iot-project-ideas-for-thingspeak">Top 10 IoT Project Ideas for ThingSpeak</h2>


<ol class="wp-block-list">
<li><strong>Weather Station:</strong> Build a weather station using a microcontroller such as Arduino or Raspberry Pi that collects data on temperature, humidity, and air pressure, and sends it to ThingSpeak for real-time monitoring and analysis.</li>



<li><strong>Home Automation: </strong>Use ThingSpeak to automate your home by controlling lights, fans, and other appliances based on sensor data, such as motion, temperature, or light levels.</li>



<li><strong>Smart Agriculture:</strong> Monitor soil moisture, temperature, and other environmental variables to optimize crop growth and water usage, using ThingSpeak to collect and analyze the data.</li>



<li><strong>Water Quality Monitoring</strong>: Monitor water quality in lakes, rivers, and other bodies of water using sensors to collect data on pH, temperature, and other parameters, and then use ThingSpeak to analyze the data and generate alerts for unsafe conditions.</li>



<li><strong>Smart Parking</strong>: Use ThingSpeak to monitor parking spots and guide drivers to available spots using sensors and real-time data analysis.</li>



<li><strong>Industrial Automation</strong>: Monitor machine data in a factory or other industrial setting to detect anomalies and predict equipment failures, using ThingSpeak to collect and analyze the data.</li>



<li><strong>Healthcare Monitoring</strong>: Use ThingSpeak to monitor patients&#8217; health data, such as heart rate, blood pressure, and oxygen levels, in real-time and alert healthcare professionals of any critical changes.</li>



<li><strong>Air Quality Monitoring</strong>: Use ThingSpeak to collect data on air quality, including particulate matter and pollutants, and generate alerts and visualizations for high-risk areas.</li>



<li><strong>Smart Energy</strong>: Monitor energy usage in homes or businesses and automatically adjust consumption based on sensor data, such as occupancy or sunlight levels.</li>



<li><strong>Smart City</strong>: Use ThingSpeak to monitor and optimize traffic flow, waste management, and other city services based on sensor data from a network of IoT devices.</li>
</ol>



<p><a href="/subscribe">Subscribe</a> to the <em>About Things</em> blog for more IoT news, tips, and projects. If you need help or want to share ideas,  connect with me and the community on our <a href="/discord">Quandary Discord Server</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/top-10-iot-project-ideas-for-thingspeak/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3649</post-id>	</item>
		<item>
		<title>IoT On Air Light Project Featured on Hackaday Blog!</title>
		<link>https://nothans.com/on-air-light-project-on-hackaday</link>
					<comments>https://nothans.com/on-air-light-project-on-hackaday#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Mon, 30 Jan 2023 17:02:49 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Hackaday]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[press]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[thingspeak]]></category>
		<category><![CDATA[web of things]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=3579</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>While scrolling through my newsreader this morning, I discovered my <a href="https://nothans.com/on-air-light-2023" data-type="post" data-id="3550">On Air Light</a> project featured on the Hackaday project blog. <a rel="noreferrer noopener" href="https://hackaday.com/author/robinkearey/" target="_blank">Robin Kearey</a> shared my project and extra detail on their post. I got a few messages this morning from friends and coworkers who saw the article. I am thankful for being included on the Hackaday blog and also thankful that Hackaday has stayed on top of maker projects for such a long time.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://hackaday.com/2023/01/29/automatic-on-air-light-prevents-distractions-during-online-meetings/"><img data-recalc-dims="1" loading="lazy" decoding="async" width="605" height="721" data-attachment-id="3580" data-permalink="https://nothans.com/on-air-light-project-on-hackaday/image-24" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-24.png?fit=605%2C721&amp;ssl=1" data-orig-size="605,721" data-comments-opened="0" data-image-title="On Air Light Featured on Hackaday" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-24.png?fit=605%2C721&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-24.png?resize=605%2C721&#038;ssl=1" alt="" class="wp-image-3580" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-24.png?w=605&amp;ssl=1 605w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-24.png?resize=252%2C300&amp;ssl=1 252w" sizes="auto, (max-width: 605px) 100vw, 605px" /></a><figcaption class="wp-element-caption">On Air Light Project on <a href="https://hackaday.com/2023/01/29/automatic-on-air-light-prevents-distractions-during-online-meetings/" target="_blank" rel="noreferrer noopener">Hackaday</a></figcaption></figure>
</div>


<p>This version of the On Air Light is cheaper and easier to build than my previous <a href="https://nothans.com/tag/on-air-light" data-type="post_tag" data-id="350">versions</a>.</p>



<figure data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://nothans.com/on-air-light-project-on-hackaday&quot;}'  class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://nothans.com/on-air-light-for-microsoft-teams-and-zoom-meetings"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="1491" data-permalink="https://nothans.com/on-air-light-for-microsoft-teams-and-zoom-meetings/on-air-light" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/03/On-Air-Light.jpg?fit=1224%2C918&amp;ssl=1" data-orig-size="1224,918" data-comments-opened="0" data-image-title="On-Air-Light" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/03/On-Air-Light.jpg?fit=750%2C563&amp;ssl=1" data-id="1491" src="https://i0.wp.com/nothans.com/wp-content/uploads/2020/03/On-Air-Light.jpg?resize=750%2C563&#038;ssl=1" alt="" class="wp-image-1491" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2020/03/On-Air-Light.jpg?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/03/On-Air-Light.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/03/On-Air-Light.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/03/On-Air-Light.jpg?w=1224&amp;ssl=1 1224w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">First On Air Light</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://nothans.com/on-air-light-for-live-streaming"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="732" data-attachment-id="2372" data-permalink="https://nothans.com/on-air-light-for-live-streaming/on-air-light-led-strip" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2021/08/on-air-light-led-strip.jpg?fit=1016%2C992&amp;ssl=1" data-orig-size="1016,992" data-comments-opened="0" data-image-title="On Air Light with LED Strip" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2021/08/on-air-light-led-strip.jpg?fit=750%2C732&amp;ssl=1" data-id="2372" src="https://i0.wp.com/nothans.com/wp-content/uploads/2021/08/on-air-light-led-strip.jpg?resize=750%2C732&#038;ssl=1" alt="" class="wp-image-2372" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2021/08/on-air-light-led-strip.jpg?w=1016&amp;ssl=1 1016w, https://i0.wp.com/nothans.com/wp-content/uploads/2021/08/on-air-light-led-strip.jpg?resize=300%2C293&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2021/08/on-air-light-led-strip.jpg?resize=768%2C750&amp;ssl=1 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">No Code On Air Light</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://nothans.com/on-air-light-2023"><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" data-id="3553" 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" /></a><figcaption class="wp-element-caption">Easy On Air Light</figcaption></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">Evolution of On Air Light Projects</figcaption></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/on-air-light-project-on-hackaday/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3579</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-3 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>Classify a Photo Using ResNet-50 and MATLAB Online</title>
		<link>https://nothans.com/classify-a-photo-using-resnet-50-and-matlab-online</link>
					<comments>https://nothans.com/classify-a-photo-using-resnet-50-and-matlab-online#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sat, 14 Jan 2023 04:16:31 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[deep learning]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[MATLAB Online]]></category>
		<category><![CDATA[ResNet-50]]></category>
		<category><![CDATA[webcam]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=3536</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>MATLAB is a powerful tool for technical computing and data analysis. It is widely used in a variety of fields such as engineering, finance, and science. One of the strengths of MATLAB is its ability to work with images and perform image processing tasks.</p>



<p>Most people experienced MATLAB on their PC, but you can also access MATLAB in your browser with <a rel="noreferrer noopener" href="https://matlab.mathworks.com" target="_blank">MATLAB Online</a>. MATLAB Online is a web-based version of MATLAB that allows users to access the software and its features through a web browser. It eliminates the need to install and configure the software on a local computer, making it accessible from anywhere with an internet connection.</p>



<p>In this project, I will be using MATLAB Online to take a picture with a webcam, classify the image using a pre-trained deep learning model, and display the results.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="428" height="428" data-attachment-id="3537" data-permalink="https://nothans.com/classify-a-photo-using-resnet-50-and-matlab-online/webcam" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/webcam.png?fit=428%2C428&amp;ssl=1" data-orig-size="428,428" data-comments-opened="0" data-image-title="webcam" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/webcam.png?fit=428%2C428&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/webcam.png?resize=428%2C428&#038;ssl=1" alt="" class="wp-image-3537" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/webcam.png?w=428&amp;ssl=1 428w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/webcam.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/webcam.png?resize=150%2C150&amp;ssl=1 150w" sizes="auto, (max-width: 428px) 100vw, 428px" /><figcaption class="wp-element-caption">MATLAB Online Selfie</figcaption></figure>
</div>


<p>I selected the ResNet-50 model, which is a deep convolutional neural network (CNN) trained on the ImageNet dataset. ResNet-50 stands for &#8220;Residual Network with 50 layers&#8221; and was developed by Microsoft Research in 2015. The architecture is known for its ability to train very deep neural networks without the problem of vanishing gradients, which allows for improved performance on image classification tasks. The model is capable of identifying objects in images and classifying them into one of 1000 different categories.</p>



<pre class="wp-block-code"><code>% Connect to webcam
cam = webcam;

% Take a picture
img = snapshot(cam);

% Resize image to &#91;224 224 3]
img = imresize(img, &#91;224 224]);

% Display the picture
imshow(img);

% Load pretrained model
net = resnet50;

% Classify image
label = classify(net, img);

% Display label
disp(label);

% Release webcam
clear cam;</code></pre>



<p>What&#8217;s really neat is that MATLAB Online can use your webcam. This code takes a photo, resizes it for ResNet-50, shows the output, and classifies the photo.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://matlab.mathworks.com/"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="390" data-attachment-id="3538" data-permalink="https://nothans.com/classify-a-photo-using-resnet-50-and-matlab-online/image-2-5" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-2.png?fit=1311%2C682&amp;ssl=1" data-orig-size="1311,682" data-comments-opened="0" data-image-title="image-2" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-2.png?fit=750%2C390&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-2.png?resize=750%2C390&#038;ssl=1" alt="" class="wp-image-3538" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-2.png?resize=1024%2C533&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-2.png?resize=300%2C156&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-2.png?resize=768%2C400&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-2.png?resize=750%2C390&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2023/01/image-2.png?w=1311&amp;ssl=1 1311w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">Old A.I. Thinks My Phone is an iPod</figcaption></figure>
</div>


<p>Check out <a rel="noreferrer noopener" href="https://matlab.mathworks.com/" target="_blank">MATLAB Online</a> and run the very latest version of MATLAB and select toolboxes. Everyone should be able to try this project out and get started with image classification.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/classify-a-photo-using-resnet-50-and-matlab-online/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3536</post-id>	</item>
	</channel>
</rss>
