<?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>Teach Me Microcontrollers!</title>
	<atom:link href="https://www.teachmemicro.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.teachmemicro.com/3-3v-5v-logic-level-shifting-arduino-esp32/</link>
	<description>Microcontroller Tutorials and Resources</description>
	<lastBuildDate>Fri, 06 Nov 2026 02:56:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://www.teachmemicro.com/wp-content/uploads/2019/04/blue-icon-65x65.png</url>
	<title>Teach Me Microcontrollers!</title>
	<link>https://www.teachmemicro.com/3-3v-5v-logic-level-shifting-arduino-esp32/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>3.3V vs 5V Logic Levels: When Do You Need a Level Shifter?</title>
		<link>https://www.teachmemicro.com/3-3v-5v-logic-level-shifting-arduino-esp32/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Fri, 06 Nov 2026 02:56:41 +0000</pubDate>
				<category><![CDATA[Arduino Tutorial]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13150</guid>

					<description><![CDATA[<p>Suppose you want an Arduino Uno and an ESP32 to talk to each other. Both boards have digital input and output pins, and both support familiar protocols such as UART, SPI, and I2C. Connecting them should be straightforward, right? There's one important difference: the Arduino Uno R3 uses 5V logic, while the ESP32 uses 3.3V &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/3-3v-5v-logic-level-shifting-arduino-esp32/">3.3V vs 5V Logic Levels: When Do You Need a Level Shifter?</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Suppose you want an Arduino Uno and an ESP32 to talk to each other. Both boards have digital input and output pins, and both support familiar protocols such as UART, SPI, and I2C. Connecting them should be straightforward, right?</p>
<p>There's one important difference: the Arduino Uno R3 uses 5V logic, while the ESP32 uses 3.3V logic. Connect a 5V signal directly to an ESP32 GPIO pin, and you risk damaging the microcontroller. Go the other way, though, and a 3.3V signal might work perfectly well with the 5V Arduino.</p>
<p>Why is that?</p>
<p>The answer lies in logic voltage thresholds, which determine how a microcontroller interprets a digital signal. In this tutorial, we'll look at how 3.3V and 5V logic work and when you can connect devices directly. We'll also cover when you need a voltage divider, a buffer, or a logic level translator. Then we'll wire a simple circuit that lets a 5V Arduino Uno safely send digital signals to an ESP32.</p>
<div class="box info  "><div class="box-inner-block"><i class="fa tie-shortcode-boxicon"></i>
			Throughout this article, "ESP32" means the original ESP32 chip. Variants such as the ESP32-S3 and ESP32-C3 have their own datasheets, so check the one for your chip. This tutorial also covers digital signals only. Analog signals, such as a 5V sensor output feeding the ESP32's ADC, need a separate analysis.
			</div></div>
<p><span id="more-13150"></span></p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>What Are Logic Levels?</strong></h2>
<p>Microcontrollers communicate using binary signals: a digital pin represents either logic LOW (0) or logic HIGH (1). Ideally, LOW sits at 0V and HIGH sits at the logic supply voltage: about 5V in a 5V system or 3.3V in a 3.3V system.</p>
<p>In practice, a digital input doesn't need an exact voltage to recognize either state. The 5V Arduino Uno R3, for example, accepts voltages well below 5V as a valid HIGH. Likewise, a LOW doesn't have to be exactly 0V. Every digital input has two specifications that define these ranges:</p>
<ul>
<li><strong>V<sub>IH</sub> (Input HIGH Voltage):</strong> The minimum input voltage guaranteed to register as HIGH.</li>
<li><strong>V<sub>IL</sub> (Input LOW Voltage):</strong> The maximum input voltage guaranteed to register as LOW.</li>
</ul>
<p>Any voltage between these two limits falls into an undefined region. The microcontroller might read it as HIGH or LOW, and the result can change from one moment to the next. A signal that lingers there can also make a CMOS input draw extra current, because both transistors in its input stage partly conduct.</p>
<p>Some inputs, including the ATmega328P's standard I/O pins, pass the signal through a Schmitt trigger. A Schmitt trigger adds hysteresis: its rising threshold sits slightly above its falling threshold. As a result, small amounts of noise on a slow edge don't make the input toggle repeatedly.</p>
<p><img data-dominant-color="f7f7f3" data-has-transparency="false" style="--dominant-color: #f7f7f3;" loading="lazy" decoding="async" class="aligncenter wp-image-13291 size-full not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/01-logic-thresholds.avif" alt="Input voltage thresholds for the Arduino Uno R3 at 5V and the ESP32 at 3.3V, showing guaranteed LOW, undefined and guaranteed HIGH regions, and the ESP32’s 3.6V maximum" width="1640" height="1160" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/01-logic-thresholds.avif 1640w, https://www.teachmemicro.com/wp-content/uploads/2026/11/01-logic-thresholds-300x212.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/01-logic-thresholds-1024x724.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/01-logic-thresholds-768x543.avif 768w, https://www.teachmemicro.com/wp-content/uploads/2026/11/01-logic-thresholds-1536x1086.avif 1536w" sizes="auto, (max-width: 1640px) 100vw, 1640px" /></p>
<p>Inputs are only half the story, though. Every digital output also has two specifications:</p>
<ul>
<li><strong>V<sub>OH</sub> (Output HIGH Voltage):</strong> The minimum voltage the output guarantees when driving HIGH.</li>
<li><strong>V<sub>OL</sub> (Output LOW Voltage):</strong> The maximum voltage the output guarantees when driving LOW.</li>
</ul>
<p>A connection works reliably when the sender's output levels land inside the receiver's guaranteed input ranges. The gap between them is called the noise margin, and each logic state has one:</p>
<p style="text-align: center;"><span class='MathJax_Preview'><img src='https://www.teachmemicro.com/wp-content/plugins/latex/cache/tex_545875c80ce70544b7313235e1fb4b3d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="NM_H = V_{OH} - V_{IH}" /></span><script type='math/tex'>NM_H = V_{OH} - V_{IH}</script></p>
<p style="text-align: center;"><span class='MathJax_Preview'><img src='https://www.teachmemicro.com/wp-content/plugins/latex/cache/tex_a433e0a01e791a0931891bdc01aa373c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="NM_L = V_{IL} - V_{OL}" /></span><script type='math/tex'>NM_L = V_{IL} - V_{OL}</script></p>
<p>A positive noise margin means the receiver should read the signal correctly, with some room left over for noise. A negative margin means the datasheets don't guarantee the connection, even if it seems to work on your bench.</p>
<h3><strong>Logic Voltage Thresholds of Arduino Uno and ESP32</strong></h3>
<p>To make these numbers concrete, let's compare the ATmega328P used by the Arduino Uno R3 with the ESP32. The table below lists the key parameters for each chip at its nominal supply voltage.</p>
<div>
<table>
<thead>
<tr>
<th scope="col">Parameter</th>
<th scope="col">Arduino Uno R3 (ATmega328P at 5V)</th>
<th scope="col">ESP32 (at 3.3V)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Logic supply voltage</td>
<td>5V</td>
<td>3.3V</td>
</tr>
<tr>
<td>Minimum input HIGH (V<sub>IH</sub>)</td>
<td>0.6 × VCC = 3.0V</td>
<td>0.75 × VDD = 2.475V</td>
</tr>
<tr>
<td>Maximum input LOW (V<sub>IL</sub>)</td>
<td>0.3 × VCC = 1.5V</td>
<td>0.25 × VDD = 0.825V</td>
</tr>
<tr>
<td>Minimum output HIGH (V<sub>OH</sub>)</td>
<td>4.2V while sourcing 20 mA</td>
<td>0.8 × VDD = 2.64V while sourcing up to 40 mA</td>
</tr>
<tr>
<td>Maximum output LOW (V<sub>OL</sub>)</td>
<td>0.9V while sinking 20 mA</td>
<td>0.1 × VDD = 0.33V</td>
</tr>
<tr>
<td>Maximum voltage on a GPIO pin</td>
<td>VCC + 0.5V = 5.5V</td>
<td>VDD + 0.3V = 3.6V</td>
</tr>
<tr>
<td>Accepts a direct 5V input?</td>
<td>Yes, within its rated conditions</td>
<td>No</td>
</tr>
</tbody>
</table>
</div>
<p>Note that the output values include test currents. Most logic connections draw far less current than these test conditions, so a real output typically sits much closer to its supply rail or ground. These values also apply only to these two microcontrollers. Other Arduino boards, ESP32 variants, and external devices may have different specifications.</p>
<p>Now look at the Arduino's 3.0V HIGH threshold. A 3.3V signal clears it, which explains why many 3.3V sensors work directly with 5V Arduino boards. We'll come back to why that isn't the whole story, but first, let's look at the more dangerous direction.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Can You Connect a 5V Signal Directly to a 3.3V Microcontroller?</strong></h2>
<p>For an ESP32, the answer is no. Its GPIO pins aren't 5V tolerant. Espressif limits input-pin voltage to VDD + 0.3V, which is 3.6V on a 3.3V supply.</p>
<p>That ceiling moves with the supply voltage. Espressif allows VDD anywhere from 3.0V to 3.6V, so on a board whose regulator runs at 3.0V, the limit drops to 3.3V. A 5V signal exceeds the limit anywhere in that range.</p>
<p>A common mistake is assuming the ESP32 can tolerate 5V because its development board has a 5V or VIN power input. But a power input and a GPIO pin are different things. Many ESP32 development boards include a voltage regulator that converts the external supply down to 3.3V for the microcontroller. That regulator protects the chip's supply, not its GPIO pins.</p>
<p><img data-dominant-color="f6f6f4" data-has-transparency="false" style="--dominant-color: #f6f6f4;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13292 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/02-esp32-power-input-vs-gpio.avif" alt="5V safely entering an ESP32 board’s regulator compared with an unsafe direct 5V connection to a GPIO pin." width="1640" height="1000" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/02-esp32-power-input-vs-gpio.avif 1640w, https://www.teachmemicro.com/wp-content/uploads/2026/11/02-esp32-power-input-vs-gpio-300x183.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/02-esp32-power-input-vs-gpio-1024x624.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/02-esp32-power-input-vs-gpio-768x468.avif 768w, https://www.teachmemicro.com/wp-content/uploads/2026/11/02-esp32-power-input-vs-gpio-1536x937.avif 1536w" sizes="auto, (max-width: 1640px) 100vw, 1640px" /></p>
<h3><strong>What Happens Inside the Pin?</strong></h3>
<p>Like most CMOS chips, the ESP32 protects its pins against electrostatic discharge (ESD). These protection structures typically behave like two diodes per pin. One runs from the pin up to the 3.3V supply rail, and the other runs from ground up to the pin.</p>
<p>During normal operation, both diodes stay reverse-biased and carry no current. Apply 5V to the pin, though, and the upper diode turns on once the pin rises about 0.6V above the rail. Current then flows from the 5V source into the chip's 3.3V supply:</p>
<div class="tmm-flow-container tmm-flow-container--linear" role="img" aria-label="Flow diagram: 5V signal to ESP32 GPIO pin; ESP32 GPIO pin to Upper ESD diode; Upper ESD diode to ESP32 3.3V rail; ESP32 3.3V rail to Other circuits on the rail."><div class="tmm-flow-row"><span class="tmm-flow-node">5V signal</span><span class="tmm-flow-edge"><span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span></span><span class="tmm-flow-node">ESP32 GPIO pin</span><span class="tmm-flow-edge"><span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span></span><span class="tmm-flow-node">Upper ESD diode</span><span class="tmm-flow-edge"><span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span></span><span class="tmm-flow-node">ESP32 3.3V rail</span><span class="tmm-flow-edge"><span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span></span><span class="tmm-flow-node">Other circuits on the rail</span></div></div>
<p>With a direct wire, only the resistance of the source and wiring limits this current, so it can be large. Excess current can damage the diode or the pin. It can also lift the 3.3V rail, because most voltage regulators can source current but can't sink it. In the worst case, injected current can trigger latch-up, a parasitic short between the supply and ground that can destroy the chip.</p>
<p>Even if an ESP32 appears to work after receiving a 5V signal, that doesn't make the connection safe. Damage can build up gradually, and erratic behavior may only appear later. The same caution applies to other 3.3V microcontrollers, although individual tolerances vary.</p>
<div class="box info  "><div class="box-inner-block"><i class="fa tie-shortcode-boxicon"></i>
			Forum posts often suggest adding a series resistor, such as 10 kΩ, between a 5V output and an ESP32 pin. The resistor limits the current through the protection diode, which is why the trick often seems to work. However, Espressif doesn't publish a safe injection-current rating for the ESP32's pins, so the datasheet doesn't support this approach. The methods in this article keep the pin within its rated voltage instead.
			</div></div>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Do You Need a Level Shifter for 3.3V to 5V Signals?</strong></h2>
<p>In the other direction, the answer is often no, but it's worth checking. A 3.3V output can't push a 5V input beyond its rating, so safety isn't the concern. The question is whether the receiver will reliably read the signal as HIGH.</p>
<p>This is where noise margins come in. For an ESP32 output driving an Arduino Uno input, the datasheet values give:</p>
<p style="text-align: center;"><span class='MathJax_Preview'><img src='https://www.teachmemicro.com/wp-content/plugins/latex/cache/tex_6604d4c659dfc4b2e00216195e1ae091.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="NM_H = 2.64V - 3.0V = -0.36V" /></span><script type='math/tex'>NM_H = 2.64V - 3.0V = -0.36V</script></p>
<p style="text-align: center;"><span class='MathJax_Preview'><img src='https://www.teachmemicro.com/wp-content/plugins/latex/cache/tex_bba4569581758a964673cf182a179258.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="NM_L = 1.5V - 0.33V = 1.17V" /></span><script type='math/tex'>NM_L = 1.5V - 0.33V = 1.17V</script></p>
<p>The LOW side has plenty of room. The HIGH side has a negative margin, so the datasheets don't guarantee that the Arduino will read the ESP32's HIGH.</p>
<p>That 2.64V minimum assumes the pin sources up to 40 mA, however. A logic input draws almost no current, so in practice, the ESP32's output usually sits close to 3.3V. That's why the link typically works on the bench.</p>
<p>Even then, a margin of about 0.3V is thin for a permanent design. A buffer that drives a full 5V removes the doubt, as we'll see in Method 3.</p>
<h3><strong>TTL vs. CMOS Input Levels</strong></h3>
<p>Not every 5V input uses the same thresholds, so the answer also depends on the receiving device. Older TTL logic, and modern parts with TTL-compatible inputs, recognize anything above 2.0V as HIGH and anything below 0.8V as LOW. A 3.3V output clears those levels easily.</p>
<p>Many 5V CMOS parts, on the other hand, scale their thresholds with the supply. A typical 5V CMOS input needs 0.7 × VCC, or 3.5V, to register a HIGH, which a 3.3V output can't reach. The ATmega328P sits between the two, at 0.6 × VCC.</p>
<p>Part names often hint at the input type. In the 74-series logic families, a "T" in the family name, as in HCT or AHCT, usually marks TTL-compatible inputs. When the receiver needs more than a 3.3V output can deliver, use a translator that actively drives the signal up to 5V.</p>
<p>Fortunately, there are several ways to connect different logic voltages safely, in either direction. We'll start with one-directional methods and then move on to bidirectional ones.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Method 1: Using a Resistor Voltage Divider</strong></h2>
<p>To send a signal from a 5V output to a 3.3V input, a resistor voltage divider is one of the simplest solutions. Two resistors in series split the input voltage, and the receiver reads the voltage at their junction:</p>
<div class="tmm-flow-container tmm-flow-container--branched" role="img" aria-label="Flow diagram: 5V digital output to R1; R1 to Junction; Junction to 3.3V logic input; Junction to R2; R2 to GND."><div class="tmm-flow-canvas" data-tmm-flow-graph style="--tmm-flow-columns:5"><svg class="tmm-flow-lines" aria-hidden="true" focusable="false"><defs><marker id="tmm-flow-arrowhead-2" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto-start-reverse" markerUnits="strokeWidth"><path d="M0,0 L8,4 L0,8 Z"></path></marker></defs></svg><div class="tmm-flow-grid"><span class="tmm-flow-node" data-tmm-flow-node="0" style="--tmm-flow-column:1;--tmm-flow-row:1;--tmm-flow-order:1">5V digital output</span><span class="tmm-flow-node" data-tmm-flow-node="1" style="--tmm-flow-column:2;--tmm-flow-row:1;--tmm-flow-order:2">R1</span><span class="tmm-flow-node" data-tmm-flow-node="2" style="--tmm-flow-column:3;--tmm-flow-row:1;--tmm-flow-order:3">Junction</span><span class="tmm-flow-node" data-tmm-flow-node="3" style="--tmm-flow-column:4;--tmm-flow-row:1;--tmm-flow-order:4">3.3V logic input</span><span class="tmm-flow-node" data-tmm-flow-node="4" style="--tmm-flow-column:4;--tmm-flow-row:2;--tmm-flow-order:5">R2</span><span class="tmm-flow-node" data-tmm-flow-node="5" style="--tmm-flow-column:5;--tmm-flow-row:1;--tmm-flow-order:6">GND</span></div><div class="tmm-flow-relations"><span class="tmm-flow-relation" data-tmm-flow-from="0" data-tmm-flow-to="1" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">5V digital output <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> R1</span><span class="tmm-flow-relation" data-tmm-flow-from="1" data-tmm-flow-to="2" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">R1 <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Junction</span><span class="tmm-flow-relation" data-tmm-flow-from="2" data-tmm-flow-to="3" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Junction <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> 3.3V logic input</span><span class="tmm-flow-relation" data-tmm-flow-from="2" data-tmm-flow-to="4" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Junction <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> R2</span><span class="tmm-flow-relation" data-tmm-flow-from="4" data-tmm-flow-to="5" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">R2 <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> GND</span></div><span class="tmm-flow-marker-id" data-tmm-flow-marker="tmm-flow-arrowhead-2"></span></div></div>
<p>The voltage at the junction between R1 and R2 is:</p>
<p style="text-align: center;"><span class='MathJax_Preview'><img src='https://www.teachmemicro.com/wp-content/plugins/latex/cache/tex_5dec5e35cc0dcc5c2a6d276fb29584d6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="V_{out} = \frac{V_{in} \times R_2}{R_1 + R_2}" /></span><script type='math/tex'>V_{out} = \frac{V_{in} \times R_2}{R_1 + R_2}</script></p>
<p>We don't need exactly 3.3V. A target of about 3.0V sits between the ESP32's 2.475V HIGH threshold and its 3.6V limit. A 2.2 kΩ and 3.3 kΩ pair gets us there:</p>
<ul>
<li>R1 = 2.2 kΩ</li>
<li>R2 = 3.3 kΩ</li>
<li>Vin = 5V</li>
</ul>
<p style="text-align: center;"><span class='MathJax_Preview'><img src='https://www.teachmemicro.com/wp-content/plugins/latex/cache/tex_0114e490c5e8271fd340c60646449c2a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="V_{out} = \frac{5V \times 3.3\,k\Omega}{2.2\,k\Omega + 3.3\,k\Omega} = 3.0V" /></span><script type='math/tex'>V_{out} = \frac{5V \times 3.3\,k\Omega}{2.2\,k\Omega + 3.3\,k\Omega} = 3.0V</script></p>
<p>When the Arduino output goes LOW, the divider output also falls to about 0V. With the output HIGH, the divider draws about 0.91 mA, a trivial load for an Arduino pin.</p>
<p><img data-dominant-color="f8f8f8" data-has-transparency="false" style="--dominant-color: #f8f8f8;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13293 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/03-voltage-divider-schematic.avif" alt="Voltage divider with a 2.2 kΩ and a 3.3 kΩ resistor reducing Arduino D8’s 5V output to about 3.0V for ESP32 GPIO18." width="1640" height="680" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/03-voltage-divider-schematic.avif 1640w, https://www.teachmemicro.com/wp-content/uploads/2026/11/03-voltage-divider-schematic-300x124.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/03-voltage-divider-schematic-1024x425.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/03-voltage-divider-schematic-768x318.avif 768w, https://www.teachmemicro.com/wp-content/uploads/2026/11/03-voltage-divider-schematic-1536x637.avif 1536w" sizes="auto, (max-width: 1640px) 100vw, 1640px" /></p>
<h3><strong>Checking the Worst Case</strong></h3>
<p>The 3.0V result assumes a perfect 5V supply and perfect resistors. Real parts vary, so it's worth checking how low and how high the junction voltage can go. Two variations matter most:</p>
<ul>
<li><strong>Resistor tolerance:</strong> Common 5% resistors can sit anywhere within ±5% of their marked value.</li>
<li><strong>Supply voltage:</strong> USB ports typically supply 4.75V to 5.25V, and the Uno's input protection drops a little more. On a weak port or a long cable, the Uno's 5V rail can sag to around 4.5V.</li>
</ul>
<p>The low corner pairs the lowest supply with R1 at its highest value and R2 at its lowest. The high corner does the opposite:</p>
<div>
<table>
<thead>
<tr>
<th scope="col">Case</th>
<th scope="col">Supply</th>
<th scope="col">R1</th>
<th scope="col">R2</th>
<th scope="col">Junction voltage</th>
</tr>
</thead>
<tbody>
<tr>
<td>Nominal</td>
<td>5.0V</td>
<td>2.2 kΩ</td>
<td>3.3 kΩ</td>
<td>3.00V</td>
</tr>
<tr>
<td>Low corner, 5% resistors</td>
<td>4.5V</td>
<td>2.31 kΩ</td>
<td>3.135 kΩ</td>
<td>2.59V</td>
</tr>
<tr>
<td>High corner, 5% resistors</td>
<td>5.25V</td>
<td>2.09 kΩ</td>
<td>3.465 kΩ</td>
<td>3.27V</td>
</tr>
<tr>
<td>Low corner, 1% resistors</td>
<td>4.5V</td>
<td>2.222 kΩ</td>
<td>3.267 kΩ</td>
<td>2.68V</td>
</tr>
<tr>
<td>High corner, 1% resistors</td>
<td>5.25V</td>
<td>2.178 kΩ</td>
<td>3.333 kΩ</td>
<td>3.18V</td>
</tr>
</tbody>
</table>
</div>
<p>With 5% resistors, the low corner clears the ESP32's 2.475V threshold by only about 0.12V. That margin also assumes the ESP32 runs at exactly 3.3V. If its rail runs at 3.6V instead, V<sub>IH</sub> rises to 2.7V, and the 5% low corner falls short.</p>
<p>Switching to 1% resistors widens the low-corner margin to about 0.2V at a 3.3V ESP32 supply. Both high corners also stay below 3.3V, so they remain within the ESP32's input limit even if its supply runs as low as 3.0V.</p>
<h3><strong>When Is a Voltage Divider Appropriate?</strong></h3>
<p>A divider works well for slow, one-directional digital signals, such as a status line, a button-state output, or a UART transmit line.</p>
<p>Its speed limit comes from capacitance. The ESP32's input pin, the breadboard, and the wiring all add capacitance at the junction. From the input's point of view, the divider acts like a single resistor equal to R1 and R2 in parallel, called the Thevenin resistance:</p>
<p style="text-align: center;"><span class='MathJax_Preview'><img src='https://www.teachmemicro.com/wp-content/plugins/latex/cache/tex_c8f640b362cea1b54d1d308b0efce29c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="R_{TH} = \frac{R_1 \times R_2}{R_1 + R_2} = \frac{2.2\,k\Omega \times 3.3\,k\Omega}{5.5\,k\Omega} = 1.32\,k\Omega" /></span><script type='math/tex'>R_{TH} = \frac{R_1 \times R_2}{R_1 + R_2} = \frac{2.2\,k\Omega \times 3.3\,k\Omega}{5.5\,k\Omega} = 1.32\,k\Omega</script></p>
<p>That resistance and the junction capacitance form an RC circuit. Assuming about 15 pF of combined pin and breadboard capacitance, the time constant is:</p>
<p style="text-align: center;"><span class='MathJax_Preview'><img src='https://www.teachmemicro.com/wp-content/plugins/latex/cache/tex_5fd3365dc11b0fb18655985eaea1f72d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\tau = R_{TH} \times C = 1.32\,k\Omega \times 15\,pF \approx 20\,ns" /></span><script type='math/tex'>\tau = R_{TH} \times C = 1.32\,k\Omega \times 15\,pF \approx 20\,ns</script></p>
<p>The 10%-to-90% rise time is about 2.2 time constants, or roughly 44 ns. For comparison, one bit at 115200 baud lasts about 8.7 µs, so the edges barely register. At a 10 MHz SPI clock, though, each half-cycle lasts only 50 ns, and the slow edge would consume most of it.</p>
<p>The resistor values set the trade-off. Smaller resistors give faster edges but draw more current from the 5V output. Larger ones, such as 22 kΩ and 33 kΩ, save current but make the edges ten times slower.</p>
<p>A divider also can't raise a 3.3V signal to 5V; it can only reduce voltage. For faster signals, or for the opposite direction, you'll need an active circuit.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Method 2: Using a 5V-Tolerant Buffer (5V to 3.3V)</strong></h2>
<p>When a 5V signal switches too fast for a divider, a logic buffer powered from 3.3V can take its place. Some 3.3V logic families have 5V-tolerant inputs, which accept up to 5.5V even when the chip runs from 3.3V. The 74LVC125A quad buffer, available from manufacturers including Texas Instruments and Nexperia, is a common example.</p>
<p>The buffer's inputs read the 5V signal, and its push-pull outputs drive a clean 0V-to-3.3V signal into the ESP32. Unlike a divider, the buffer doesn't rely on resistors to set its output level, so its edges stay sharp at much higher speeds. Like the divider, though, it only works in one direction, from 5V down to 3.3V.</p>
<div class="box info  "><div class="box-inner-block"><i class="fa tie-shortcode-boxicon"></i>
			Each of the 74LVC125A's four buffers has an active-low output-enable (OE) pin. Tie OE to GND for each buffer you use, and tie unused inputs to GND rather than leaving them floating. Place a 0.1 µF ceramic capacitor between VCC and GND, close to the chip.
			</div></div>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Method 3: Using a 5V Logic Buffer (3.3V to 5V)</strong></h2>
<p>Method 3 mirrors Method 2. When a 5V device needs a full 5V HIGH from a 3.3V source, a buffer powered from 5V does the job. The 74AHCT125, for example, has TTL-compatible inputs that recognize 2V as HIGH, yet its outputs swing up to its 5V supply.</p>
<p>It also works in only one direction, from 3.3V to 5V, but it's simple, fast, and inexpensive. Many makers use it to drive 5V peripherals, such as addressable LED strips, from 3.3V microcontrollers.</p>
<div class="box info  "><div class="box-inner-block"><i class="fa tie-shortcode-boxicon"></i>
			Like the 74LVC125A, the 74AHCT125 has an active-low OE pin for each buffer. Tie OE to GND for each buffer you use. For unused buffers, tie OE to VCC to disable them and tie their inputs to GND. Add a 0.1 µF decoupling capacitor at the VCC pin.
			</div></div>
<p>Together, Methods 2 and 3 handle both directions with push-pull buffers, as long as each signal travels only one way. Bidirectional signals need a different approach.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Method 4: Using a MOSFET Logic Level Shifter</strong></h2>
<p>When a single line carries data in both directions, none of the methods so far will do. One of the most common solutions is a small module based on BSS138 N-channel MOSFETs. It translates signals either way without a direction-control pin.</p>
<h3><strong>How the BSS138 Circuit Works</strong></h3>
<p>Each channel uses one MOSFET and two pull-up resistors, one on each side. The MOSFET's gate connects to the low-voltage supply, its source to the low-voltage signal, and its drain to the high-voltage signal.</p>
<p><img data-dominant-color="fbfbfb" data-has-transparency="false" style="--dominant-color: #fbfbfb;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13297 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/04-bss138-channel-schematic.avif" alt="One BSS138 level-shifter channel, with the gate tied to 3.3V, pull-ups on both sides and the MOSFET’s body diode." width="1640" height="840" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/04-bss138-channel-schematic.avif 1640w, https://www.teachmemicro.com/wp-content/uploads/2026/11/04-bss138-channel-schematic-300x154.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/04-bss138-channel-schematic-1024x524.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/04-bss138-channel-schematic-768x393.avif 768w, https://www.teachmemicro.com/wp-content/uploads/2026/11/04-bss138-channel-schematic-1536x787.avif 1536w" sizes="auto, (max-width: 1640px) 100vw, 1640px" /></p>
<p>The circuit has three states:</p>
<ul>
<li><strong>Neither side pulls LOW:</strong> The source sits at 3.3V, the same as the gate, so the MOSFET stays off. Each pull-up holds its own side at its own rail: 3.3V on the low side and 5V on the high side.</li>
<li><strong>The low-voltage device pulls LOW:</strong> The source drops to 0V, giving a 3.3V gate-source voltage. The MOSFET turns on and pulls the high-voltage side LOW too.</li>
<li><strong>The high-voltage device pulls LOW:</strong> The MOSFET's internal body diode conducts first, pulling the source down to about 0.6V. That raises the gate-source voltage enough to turn the MOSFET fully on, and the low side follows to near 0V.</li>
</ul>
<p>When the device releases the line, the pull-ups bring both sides back to their rails, and the MOSFET switches off again. Because the circuit only ever pulls lines LOW, it particularly suits open-drain buses such as I2C.</p>
<p>These modules typically have four channels, with connections labeled:</p>
<ul>
<li><strong>HV:</strong> Higher-voltage supply, commonly 5V</li>
<li><strong>LV:</strong> Lower-voltage supply, commonly 3.3V</li>
<li><strong>GND:</strong> Common ground</li>
<li><strong>HV1–HV4:</strong> High-voltage signal connections</li>
<li><strong>LV1–LV4:</strong> Low-voltage signal connections</li>
</ul>
<p><img data-dominant-color="d2deeb" data-has-transparency="false" style="--dominant-color: #d2deeb;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13298 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/05-bss138-module-labeled.avif" alt="four-channel BSS138 level shifter module with the LV, HV, GND, LV1 and HV1 pins labeled." width="1640" height="1140" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/05-bss138-module-labeled.avif 1640w, https://www.teachmemicro.com/wp-content/uploads/2026/11/05-bss138-module-labeled-300x209.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/05-bss138-module-labeled-1024x712.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/05-bss138-module-labeled-768x534.avif 768w, https://www.teachmemicro.com/wp-content/uploads/2026/11/05-bss138-module-labeled-1536x1068.avif 1536w, https://www.teachmemicro.com/wp-content/uploads/2026/11/05-bss138-module-labeled-110x75.avif 110w" sizes="auto, (max-width: 1640px) 100vw, 1640px" /></p>
<h3><strong>Speed Limits of the BSS138 Module</strong></h3>
<p>The BSS138 module isn’t a universal solution, though. Every rising edge comes from a pull-up resistor charging the line’s capacitance, and many of these modules use 10 kΩ pull-ups. On the module pictured earlier, for example, the resistors carry the marking “01C”, the EIA-96 code for 10.0 kΩ. The I2C specification measures rise time between 30% and 70% of the supply voltage:</p>
<p style="text-align: center;"><span class='MathJax_Preview'><img src='https://www.teachmemicro.com/wp-content/plugins/latex/cache/tex_be78b94e80a6cde010f9e62212e12e5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="t_r = 0.8473 \times R \times C" /></span><script type='math/tex'>t_r = 0.8473 \times R \times C</script></p>
<p>With 10 kΩ pull-ups and a 50 pF bus, the rise time is about 424 ns. That fits within I2C Standard-mode's 1000 ns limit at 100 kHz. However, it exceeds Fast-mode's 300 ns limit at 400 kHz, so Fast-mode buses may need stronger, lower-value pull-ups.</p>
<p>Pull-ups also combine in parallel. If a sensor module already has its own 10 kΩ pull-ups, the effective resistance on that side drops to 5 kΩ. Stronger pull-ups speed up the edges, but they also increase the current each device must sink to pull the line LOW.</p>
<p>The same pull-up dependence makes the module a poor fit for fast push-pull signals, such as SPI clocks. A push-pull driver on the low side pulls the high side LOW through the MOSFET quickly. Its rising edge, however, still depends on the slow pull-up.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Method 5: Using a Dedicated Logic Level Translator IC</strong></h2>
<p>Where signal timing and reliability matter, a dedicated translator IC is often the better choice. The right part depends on the type of signal:</p>
<ul>
<li><strong>TXS0108E (Texas Instruments):</strong> An eight-channel, auto-direction translator that supports both open-drain and push-pull signals within its specified operating conditions.</li>
<li><strong>PCA9306 (Texas Instruments):</strong> Designed specifically for bidirectional I2C and SMBus translation.</li>
<li><strong>SN74LVC8T245 (Texas Instruments):</strong> An eight-bit, dual-supply translator for push-pull signals. A single direction-control (DIR) pin sets all eight channels at once.</li>
<li><strong>SN74LVC1T45 (Texas Instruments):</strong> A single-bit, dual-supply translator with its own DIR pin, useful for a lone signal that travels the other way.</li>
</ul>
<p>Choose a translator based on the signal type, not because a module is advertised as "3.3V to 5V compatible." A translator designed for I2C might not work reliably on a fast SPI bus, even though both carry the same HIGH and LOW levels.</p>
<h3><strong>Practical Notes on TXS0108E Modules</strong></h3>
<p>TXS0108E breakout boards are popular, but they come with a few requirements that often catch first-time users:</p>
<ul>
<li><strong>Supply order:</strong> VCCA, the A-side supply, must not exceed VCCB, and it must not exceed 3.6V. Connect 3.3V to VCCA and 5V to VCCB, not the other way around.</li>
<li><strong>Output enable:</strong> The OE pin uses VCCA as its reference, and pulling it LOW puts every output in a high-impedance state. Drive OE HIGH, to 3.3V, to enable translation, and check whether your module already pulls it up or down.</li>
<li><strong>Look-alike parts:</strong> TXB0108 modules look almost identical but are intended for push-pull signals. They generally don't work reliably with I2C pull-up resistors.</li>
<li><strong>Loading:</strong> The TXS0108E uses edge accelerators that briefly boost each transition. Heavy capacitive loads or strong external pull-ups can confuse them, so keep the wiring short.</li>
</ul>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Practical Example: Sending a 5V Arduino Signal to an ESP32</strong></h2>
<p>Let's put the voltage divider to use. We'll connect an Arduino Uno R3 to an ESP32 development board. The Arduino will toggle a digital output every 500 milliseconds, and the ESP32 will read that signal.</p>
<h3><strong>Components Needed</strong></h3>
<ul>
<li>Arduino Uno R3</li>
<li>ESP32 development board</li>
<li>2.2 kΩ resistor (1% tolerance recommended)</li>
<li>3.3 kΩ resistor (1% tolerance recommended)</li>
<li>Breadboard</li>
<li>Jumper wires</li>
<li>USB cables</li>
<li>Multimeter (recommended)</li>
<li>Optional, for the return path: 74AHCT125 buffer, 0.1 µF capacitor, and 10 kΩ resistor</li>
</ul>
<h3><strong>Choosing the Pins</strong></h3>
<p>We'll use digital pin 8 on the Arduino and GPIO18 on the ESP32. GPIO18 is a general-purpose pin with no special role during boot, which makes it a safe choice. When you adapt this circuit, avoid these ESP32 pins:</p>
<ul>
<li><strong>Strapping pins (GPIO0, GPIO2, GPIO5, GPIO12, and GPIO15):</strong> The ESP32 samples these pins at reset to choose its boot mode and settings, so an external signal can change those settings. For example, a HIGH on GPIO12 at boot selects a 1.8V flash supply. That setting stops modules with 3.3V flash, such as the ESP32-WROOM-32, from booting.</li>
<li><strong>GPIO6 to GPIO11:</strong> On most modules, these pins connect to the internal SPI flash.</li>
</ul>
<h3><strong>Wiring Diagram</strong></h3>
<p>Wire the divider between the two boards as follows:</p>
<div>
<table>
<thead>
<tr>
<th scope="col">Arduino / Circuit</th>
<th scope="col">Connection</th>
</tr>
</thead>
<tbody>
<tr>
<td>Arduino D8</td>
<td>R1 (2.2 kΩ)</td>
</tr>
<tr>
<td>Other end of R1</td>
<td>ESP32 GPIO18 and one end of R2</td>
</tr>
<tr>
<td>Other end of R2 (3.3 kΩ)</td>
<td>GND</td>
</tr>
<tr>
<td>Arduino GND</td>
<td>ESP32 GND</td>
</tr>
</tbody>
</table>
</div>
<p>The Arduino and ESP32 must share a common ground so they have the same voltage reference. Power each board through its own USB port, and don't connect their 5V and 3.3V rails together.</p>
<p>R2 also does a second job. While the Uno resets, its pins switch to high-impedance inputs, so D8 stops driving the divider. R2 then pulls GPIO18 to GND, and the ESP32 reads a clean LOW instead of a floating input.</p>
<div class="box info  "><div class="box-inner-block"><i class="fa tie-shortcode-boxicon"></i>
			Power up the ESP32 first, or both boards at the same time. If the Uno runs while the ESP32 is unpowered, a HIGH on D8 feeds current through the divider into the ESP32's protection diodes. The divider's 1.32 kΩ Thevenin resistance limits this current to roughly 2 mA, so damage is unlikely here. Still, it's a good habit, and it matters more with lower-resistance circuits.
			</div></div>
<p>Wire everything except the connection to GPIO18 for now. We'll check the divider output before it reaches the ESP32.</p>
<p><img data-dominant-color="bbc8cd" data-has-transparency="false" style="--dominant-color: #bbc8cd;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13295 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/06-breadboard-wiring.avif" alt="Breadboard wiring of an Arduino Uno R3 and ESP32 DevKit through a 2.2 kΩ and 3.3 kΩ voltage divider with a shared ground" width="1800" height="820" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/06-breadboard-wiring.avif 1800w, https://www.teachmemicro.com/wp-content/uploads/2026/11/06-breadboard-wiring-300x137.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/06-breadboard-wiring-1024x466.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/06-breadboard-wiring-768x350.avif 768w, https://www.teachmemicro.com/wp-content/uploads/2026/11/06-breadboard-wiring-1536x700.avif 1536w" sizes="auto, (max-width: 1800px) 100vw, 1800px" /></p>
<h3><strong>Arduino Code</strong></h3>
<p>Upload the following sketch to the Arduino Uno:</p>
<pre><code class="language-cpp">const int signalPin = 8;

void setup() {
  pinMode(signalPin, OUTPUT);
  digitalWrite(signalPin, LOW);
}

void loop() {
  digitalWrite(signalPin, HIGH);
  delay(500);

  digitalWrite(signalPin, LOW);
  delay(500);
}</code></pre>
<p>Inside <em><code>setup()</code></em>, we configure pin 8 as an output. Then <em><code>loop()</code></em> alternates it between HIGH and LOW at half-second intervals.</p>
<p>When HIGH, D8 outputs close to 5V, and the divider delivers about 3.0V. When LOW, both sides measure close to 0V.</p>
<h3><strong>Checking the Divider with a Multimeter</strong></h3>
<p>Before connecting the divider to GPIO18, confirm its output voltage with a multimeter. A quick measurement catches wiring mistakes before 5V reaches the ESP32.</p>
<p>A toggling signal is hard to read on a multimeter, so first upload this short test sketch, which holds D8 HIGH:</p>
<pre><code class="language-cpp">void setup() {
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
}

void loop() {
}</code></pre>
<p>Then measure between the junction of R1 and R2 and GND. The reading tells you whether the wiring is correct:</p>
<div>
<table>
<thead>
<tr>
<th scope="col">Reading at the junction</th>
<th scope="col">Likely cause</th>
</tr>
</thead>
<tbody>
<tr>
<td>About 3.0V</td>
<td>Correct wiring</td>
</tr>
<tr>
<td>About 5V</td>
<td>R2 isn't reaching GND</td>
</tr>
<tr>
<td>About 2.0V</td>
<td>R1 and R2 are swapped</td>
</tr>
<tr>
<td>About 0V</td>
<td>R1 isn't connected, or D8 isn't HIGH</td>
</tr>
</tbody>
</table>
</div>
<p>Once the reading is correct, re-upload the toggling sketch and connect the junction to GPIO18.</p>
<h3><strong>ESP32 Code</strong></h3>
<p>Next, upload this sketch to the ESP32 using the Arduino IDE. If you haven't set up the IDE for the ESP32 yet, install the "esp32" board package by Espressif through the Boards Manager. Then select your board; "ESP32 Dev Module" works for most DevKitC-style boards.</p>
<pre><code class="language-cpp">const int inputPin = 18;
int previousState = -1;

void setup() {
  Serial.begin(115200);
  pinMode(inputPin, INPUT);
}

void loop() {
  int currentState = digitalRead(inputPin);

  if (currentState != previousState) {
    Serial.print("Signal: ");

    if (currentState == HIGH) {
      Serial.println("HIGH");
    } else {
      Serial.println("LOW");
    }

    previousState = currentState;
  }

  delay(10);
}</code></pre>
<p>Here, <em><code>digitalRead()</code></em> checks the voltage level at GPIO18 and returns HIGH or LOW. The sketch prints a message only when the input changes state, which makes the transitions easy to follow. The pin uses plain <em><code>INPUT</code></em> mode because R2 already acts as a pull-down.</p>
<p>With both boards running, open the Serial Monitor at 115200 baud. It should show:</p>
<pre><code class="language-text">Signal: HIGH
Signal: LOW
Signal: HIGH
Signal: LOW</code></pre>
<p>The first line depends on which state the signal is in when the ESP32 starts.</p>
<h3><strong>Viewing the Signal on an Oscilloscope</strong></h3>
<p>If you have an oscilloscope, compare the waveforms before and after the divider. At this slow toggle rate, the two waveforms look nearly identical apart from their amplitudes. Zoom into a rising edge, though, and you can see the RC effect described in Method 1.</p>
<p>Keep in mind that the scope probe adds its own capacitance, typically around 10 pF for a 10× probe. The measured edge will therefore look slightly slower than the edge the ESP32 sees without the probe.</p>
<h3><strong>Going Further: Sending a Signal Back to the Arduino</strong></h3>
<p>So far, the example covers only the 5V-to-3.3V direction. To send a signal back, you could rely on the ESP32's output clearing the Uno's 3.0V threshold. For a guaranteed connection, though, add a 74AHCT125 buffer from Method 3 to the same breadboard:</p>
<div>
<table>
<thead>
<tr>
<th scope="col">74AHCT125 Pin</th>
<th scope="col">Connection</th>
</tr>
</thead>
<tbody>
<tr>
<td>VCC (pin 14)</td>
<td>Arduino 5V</td>
</tr>
<tr>
<td>GND (pin 7)</td>
<td>Common GND</td>
</tr>
<tr>
<td>1OE (pin 1)</td>
<td>GND, which enables buffer 1</td>
</tr>
<tr>
<td>1A (pin 2)</td>
<td>ESP32 GPIO19, plus a 10 kΩ resistor to GND</td>
</tr>
<tr>
<td>1Y (pin 3)</td>
<td>Arduino D7</td>
</tr>
<tr>
<td>2OE, 3OE, 4OE (pins 4, 10, 13)</td>
<td>Arduino 5V, which disables the unused buffers</td>
</tr>
<tr>
<td>2A, 3A, 4A (pins 5, 9, 12)</td>
<td>GND</td>
</tr>
<tr>
<td>0.1 µF capacitor</td>
<td>Between pin 14 and pin 7, close to the chip</td>
</tr>
</tbody>
</table>
</div>
<p>The 10 kΩ resistor holds the buffer's input LOW while the ESP32 boots and GPIO19 floats.</p>
<p>Upload this sketch to the ESP32 to toggle GPIO19:</p>
<pre><code class="language-cpp">const int outputPin = 19;

void setup() {
  pinMode(outputPin, OUTPUT);
}

void loop() {
  digitalWrite(outputPin, HIGH);
  delay(500);

  digitalWrite(outputPin, LOW);
  delay(500);
}</code></pre>
<p>Then upload this sketch to the Arduino to read D7:</p>
<pre><code class="language-cpp">const int inputPin = 7;
int previousState = -1;

void setup() {
  Serial.begin(9600);
  pinMode(inputPin, INPUT);
}

void loop() {
  int currentState = digitalRead(inputPin);

  if (currentState != previousState) {
    Serial.print("Signal: ");

    if (currentState == HIGH) {
      Serial.println("HIGH");
    } else {
      Serial.println("LOW");
    }

    previousState = currentState;
  }

  delay(10);
}</code></pre>
<p>Open the Serial Monitor at 9600 baud, and you should see the same alternating HIGH and LOW messages. This time, the buffer drives D7 with a full 5V HIGH, so the connection no longer depends on the ESP32's output voltage.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Logic Level Shifting for UART, I2C, and SPI</strong></h2>
<p>So far, we've looked at single digital signals. The same principles apply to communication buses, but the right circuit depends on how each interface drives its lines.</p>
<h3><strong>UART: Consider Each Direction Separately</strong></h3>
<p>UART uses two signal lines, TX and RX, with each device's TX connected to the other's RX. Between an Arduino Uno R3 and an ESP32, that gives two paths with different needs:</p>
<div class="tmm-flow-container tmm-flow-container--branched" role="img" aria-label="Flow diagram: Arduino TX (5V) to Voltage divider or 74LVC125A; Voltage divider or 74LVC125A to ESP32 RX; ESP32 TX (3.3V) to Direct or 74AHCT125; Direct or 74AHCT125 to Arduino RX."><div class="tmm-flow-canvas" data-tmm-flow-graph style="--tmm-flow-columns:3"><svg class="tmm-flow-lines" aria-hidden="true" focusable="false"><defs><marker id="tmm-flow-arrowhead-3" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto-start-reverse" markerUnits="strokeWidth"><path d="M0,0 L8,4 L0,8 Z"></path></marker></defs></svg><div class="tmm-flow-grid"><span class="tmm-flow-node" data-tmm-flow-node="0" style="--tmm-flow-column:1;--tmm-flow-row:1;--tmm-flow-order:1">Arduino TX (5V)</span><span class="tmm-flow-node" data-tmm-flow-node="1" style="--tmm-flow-column:2;--tmm-flow-row:1;--tmm-flow-order:3">Voltage divider or 74LVC125A</span><span class="tmm-flow-node" data-tmm-flow-node="2" style="--tmm-flow-column:3;--tmm-flow-row:1;--tmm-flow-order:5">ESP32 RX</span><span class="tmm-flow-node" data-tmm-flow-node="3" style="--tmm-flow-column:1;--tmm-flow-row:2;--tmm-flow-order:2">ESP32 TX (3.3V)</span><span class="tmm-flow-node" data-tmm-flow-node="4" style="--tmm-flow-column:2;--tmm-flow-row:2;--tmm-flow-order:4">Direct or 74AHCT125</span><span class="tmm-flow-node" data-tmm-flow-node="5" style="--tmm-flow-column:3;--tmm-flow-row:2;--tmm-flow-order:6">Arduino RX</span></div><div class="tmm-flow-relations"><span class="tmm-flow-relation" data-tmm-flow-from="0" data-tmm-flow-to="1" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Arduino TX (5V) <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Voltage divider or 74LVC125A</span><span class="tmm-flow-relation" data-tmm-flow-from="1" data-tmm-flow-to="2" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Voltage divider or 74LVC125A <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> ESP32 RX</span><span class="tmm-flow-relation" data-tmm-flow-from="3" data-tmm-flow-to="4" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">ESP32 TX (3.3V) <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Direct or 74AHCT125</span><span class="tmm-flow-relation" data-tmm-flow-from="4" data-tmm-flow-to="5" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Direct or 74AHCT125 <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Arduino RX</span></div><span class="tmm-flow-marker-id" data-tmm-flow-marker="tmm-flow-arrowhead-3"></span></div></div>
<p>The Arduino-to-ESP32 path always needs level shifting. The ESP32-to-Arduino path often works directly, subject to the noise-margin caveat above.</p>
<p>For the Arduino TX line, the rise-time estimate from Method 1 shows that a divider handles 115200 baud comfortably. At higher baud rates, or with long wires in a noisy environment, a buffer or translator becomes more important.</p>
<div class="box info  "><div class="box-inner-block"><i class="fa tie-shortcode-boxicon"></i>
			On the Uno R3, pins 0 and 1 carry the hardware UART. These pins also connect to the board's USB-to-serial chip, an ATmega16U2, through 1 kΩ resistors. The 16U2 actively drives D0 HIGH at 5V when idle, so an ESP32 TX connected to D0 fights it through that resistor. This conflict can also disrupt sketch uploads and the Serial Monitor. Use SoftwareSerial on other pins at a modest baud rate, such as 9600, or disconnect the ESP32 while uploading.
			</div></div>
<h3><strong>I2C: Watch the Pull-Up Resistors</strong></h3>
<p>I2C works differently. Its SDA and SCL lines are open-drain: devices pull the lines LOW, and pull-up resistors bring them HIGH. That makes the pull-up voltage critical.</p>
<p>Imagine connecting a 3.3V ESP32 to a sensor module powered by 5V. If the module's onboard pull-ups connect to 5V, SDA and SCL idle at 5V. That voltage reaches the ESP32's pins before any data is exchanged.</p>
<p>A bidirectional I2C translator, such as a BSS138 module or a PCA9306-based circuit, separates the two voltage domains. Its low-voltage side uses pull-ups to 3.3V, and its high-voltage side uses pull-ups to 5V. For Fast-mode I2C at 400 kHz, revisit the rise-time check from Method 4.</p>
<p><img data-dominant-color="f2f3f2" data-has-transparency="false" style="--dominant-color: #f2f3f2;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13294 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/07-i2c-level-translation.avif" alt="ESP32 connected to a 5V I2C module through a bidirectional level shifter, with pull-ups to 3.3V on one side and to 5V on the other." width="1800" height="880" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/07-i2c-level-translation.avif 1800w, https://www.teachmemicro.com/wp-content/uploads/2026/11/07-i2c-level-translation-300x147.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/07-i2c-level-translation-1024x501.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/07-i2c-level-translation-768x375.avif 768w, https://www.teachmemicro.com/wp-content/uploads/2026/11/07-i2c-level-translation-1536x751.avif 1536w" sizes="auto, (max-width: 1800px) 100vw, 1800px" /></p>
<p>Direct 3.3V I2C is sometimes possible, provided every device's input thresholds, the pull-up voltage, and the pin ratings allow it. Check the module's actual schematic rather than relying on its advertised operating voltage.</p>
<p>For more on the protocol itself, see our <a href="https://www.teachmemicro.com/i2c-primer/">I2C primer</a>.</p>
<h3><strong>SPI: Speed and Direction Matter</strong></h3>
<p>SPI uses push-pull drivers for its clock and data lines and doesn't rely on pull-up resistors to create HIGH levels. That matters when choosing a level shifter. A BSS138 module might handle slow SPI signals, but its resistive rising edges distort faster ones.</p>
<p>Consider a 5V Arduino controlling a 3.3V SPI peripheral. SCK, MOSI, and chip select (CS) travel from the Arduino to the peripheral and need translating down. MISO travels the other way, so it needs its own path:</p>
<div class="tmm-flow-container tmm-flow-container--branched" role="img" aria-label="Flow diagram: Arduino SCK, MOSI, CS (5V) to SN74LVC8T245 or 74LVC125A; SN74LVC8T245 or 74LVC125A to 3.3V SPI peripheral; Peripheral MISO (3.3V) to Direct or 74AHCT125; Direct or 74AHCT125 to Arduino MISO."><div class="tmm-flow-canvas" data-tmm-flow-graph style="--tmm-flow-columns:3"><svg class="tmm-flow-lines" aria-hidden="true" focusable="false"><defs><marker id="tmm-flow-arrowhead-4" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto-start-reverse" markerUnits="strokeWidth"><path d="M0,0 L8,4 L0,8 Z"></path></marker></defs></svg><div class="tmm-flow-grid"><span class="tmm-flow-node" data-tmm-flow-node="0" style="--tmm-flow-column:1;--tmm-flow-row:1;--tmm-flow-order:1">Arduino SCK, MOSI, CS (5V)</span><span class="tmm-flow-node" data-tmm-flow-node="1" style="--tmm-flow-column:2;--tmm-flow-row:1;--tmm-flow-order:3">SN74LVC8T245 or 74LVC125A</span><span class="tmm-flow-node" data-tmm-flow-node="2" style="--tmm-flow-column:3;--tmm-flow-row:1;--tmm-flow-order:5">3.3V SPI peripheral</span><span class="tmm-flow-node" data-tmm-flow-node="3" style="--tmm-flow-column:1;--tmm-flow-row:2;--tmm-flow-order:2">Peripheral MISO (3.3V)</span><span class="tmm-flow-node" data-tmm-flow-node="4" style="--tmm-flow-column:2;--tmm-flow-row:2;--tmm-flow-order:4">Direct or 74AHCT125</span><span class="tmm-flow-node" data-tmm-flow-node="5" style="--tmm-flow-column:3;--tmm-flow-row:2;--tmm-flow-order:6">Arduino MISO</span></div><div class="tmm-flow-relations"><span class="tmm-flow-relation" data-tmm-flow-from="0" data-tmm-flow-to="1" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Arduino SCK, MOSI, CS (5V) <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> SN74LVC8T245 or 74LVC125A</span><span class="tmm-flow-relation" data-tmm-flow-from="1" data-tmm-flow-to="2" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">SN74LVC8T245 or 74LVC125A <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> 3.3V SPI peripheral</span><span class="tmm-flow-relation" data-tmm-flow-from="3" data-tmm-flow-to="4" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Peripheral MISO (3.3V) <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Direct or 74AHCT125</span><span class="tmm-flow-relation" data-tmm-flow-from="4" data-tmm-flow-to="5" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Direct or 74AHCT125 <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Arduino MISO</span></div><span class="tmm-flow-marker-id" data-tmm-flow-marker="tmm-flow-arrowhead-4"></span></div></div>
<p>The SN74LVC8T245 uses a single DIR pin for all eight channels, so one chip can't carry MOSI and MISO in opposite directions. Tie its DIR pin for the outbound lines, and give MISO a separate translator, such as an SN74LVC1T45 or one channel of a 74AHCT125.</p>
<p>If other devices share the Arduino's MISO line, the MISO buffer must release the line when its peripheral isn't selected. With a 74AHCT125, connect the buffer's OE pin to the peripheral's active-low CS line. The buffer then drives MISO only while that peripheral is selected.</p>
<p>If you're new to SPI, see our <a href="https://www.teachmemicro.com/spi-protocol-basics/">SPI protocol tutorial</a>.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Common Mistakes When Connecting 3.3V and 5V Devices</strong></h2>
<p>Most mixed-voltage problems trace back to a handful of recurring mistakes:</p>
<ol>
<li><strong>Assuming a 5V power input means 5V-tolerant GPIO:</strong> A development board can accept 5V through a regulator while its microcontroller runs at 3.3V. Always distinguish power-input ratings from GPIO limits.</li>
<li><strong>Ignoring pull-up resistors already on sensor modules:</strong> Many I2C breakouts include onboard pull-ups tied to the module's supply voltage. Inspect the board before connecting it to a 3.3V microcontroller.</li>
<li><strong>Forgetting the common ground:</strong> Two separately powered devices need a shared ground for direct, non-isolated logic signals. Without it, the receiver may see unpredictable voltages.</li>
<li><strong>Using the same level shifter for every protocol:</strong> A BSS138 module suits I2C but not high-speed SPI. The right choice depends on signal direction, output type, speed, and capacitive loading.</li>
<li><strong>Back-powering an unpowered device:</strong> If one board is powered and the other isn't, a HIGH signal can feed current into the unpowered chip through its protection diodes. For permanent designs where this can happen, choose a translator with powered-off isolation.</li>
<li><strong>Enabling INPUT_PULLUP on the 5V side:</strong> The Uno's internal pull-ups connect to 5V. On a pin that receives an ESP32 signal, a pull-up can lift the line toward 5V whenever the ESP32's pin floats, such as during boot. Use plain INPUT mode instead.</li>
<li><strong>Wiring signals to ESP32 strapping pins:</strong> An external signal on GPIO0, GPIO2, GPIO5, GPIO12, or GPIO15 can change how the ESP32 boots. Use general-purpose pins such as GPIO18 or GPIO19 instead.</li>
<li><strong>Assuming a working circuit is electrically safe:</strong> A microcontroller might tolerate an incorrect connection for a while. That doesn't mean the voltage is within its specified limits.</li>
</ol>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>How to Choose the Right Level Shifting Method</strong></h2>
<p>The decision comes down to three questions: Which device is transmitting? Which device is receiving? And what voltages can each pin safely produce or accept? The flow below walks through the common cases:</p>
<div class="tmm-flow-container tmm-flow-container--branched" role="img" aria-label="Flow diagram: Signal direction to 5V to 3.3V; 5V to 3.3V to Slow and one-way; Slow and one-way to Resistor divider; 5V to 3.3V to Fast and one-way; Fast and one-way to 74LVC125A buffer at 3.3V; Signal direction to 3.3V to 5V; 3.3V to 5V to Receiver VIH below 3.0V; Receiver VIH below 3.0V to Direct connection; 3.3V to 5V to Receiver needs a full 5V; Receiver needs a full 5V to 74AHCT125 buffer at 5V; Signal direction to Both ways; Both ways to Open-drain bus like I2C; Open-drain bus like I2C to BSS138 module or PCA9306; Both ways to Push-pull lines like SPI; Push-pull lines like SPI to Separate translator for each direction."><div class="tmm-flow-canvas" data-tmm-flow-graph style="--tmm-flow-columns:4"><svg class="tmm-flow-lines" aria-hidden="true" focusable="false"><defs><marker id="tmm-flow-arrowhead-5" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto-start-reverse" markerUnits="strokeWidth"><path d="M0,0 L8,4 L0,8 Z"></path></marker></defs></svg><div class="tmm-flow-grid"><span class="tmm-flow-node" data-tmm-flow-node="0" style="--tmm-flow-column:1;--tmm-flow-row:1;--tmm-flow-order:1">Signal direction</span><span class="tmm-flow-node" data-tmm-flow-node="1" style="--tmm-flow-column:2;--tmm-flow-row:1;--tmm-flow-order:2">5V to 3.3V</span><span class="tmm-flow-node" data-tmm-flow-node="2" style="--tmm-flow-column:3;--tmm-flow-row:1;--tmm-flow-order:5">Slow and one-way</span><span class="tmm-flow-node" data-tmm-flow-node="3" style="--tmm-flow-column:4;--tmm-flow-row:1;--tmm-flow-order:11">Resistor divider</span><span class="tmm-flow-node" data-tmm-flow-node="4" style="--tmm-flow-column:3;--tmm-flow-row:2;--tmm-flow-order:6">Fast and one-way</span><span class="tmm-flow-node" data-tmm-flow-node="5" style="--tmm-flow-column:4;--tmm-flow-row:2;--tmm-flow-order:12">74LVC125A buffer at 3.3V</span><span class="tmm-flow-node" data-tmm-flow-node="6" style="--tmm-flow-column:2;--tmm-flow-row:2;--tmm-flow-order:3">3.3V to 5V</span><span class="tmm-flow-node" data-tmm-flow-node="7" style="--tmm-flow-column:3;--tmm-flow-row:3;--tmm-flow-order:7">Receiver VIH below 3.0V</span><span class="tmm-flow-node" data-tmm-flow-node="8" style="--tmm-flow-column:4;--tmm-flow-row:3;--tmm-flow-order:13">Direct connection</span><span class="tmm-flow-node" data-tmm-flow-node="9" style="--tmm-flow-column:3;--tmm-flow-row:4;--tmm-flow-order:8">Receiver needs a full 5V</span><span class="tmm-flow-node" data-tmm-flow-node="10" style="--tmm-flow-column:4;--tmm-flow-row:4;--tmm-flow-order:14">74AHCT125 buffer at 5V</span><span class="tmm-flow-node" data-tmm-flow-node="11" style="--tmm-flow-column:2;--tmm-flow-row:3;--tmm-flow-order:4">Both ways</span><span class="tmm-flow-node" data-tmm-flow-node="12" style="--tmm-flow-column:3;--tmm-flow-row:5;--tmm-flow-order:9">Open-drain bus like I2C</span><span class="tmm-flow-node" data-tmm-flow-node="13" style="--tmm-flow-column:4;--tmm-flow-row:5;--tmm-flow-order:15">BSS138 module or PCA9306</span><span class="tmm-flow-node" data-tmm-flow-node="14" style="--tmm-flow-column:3;--tmm-flow-row:6;--tmm-flow-order:10">Push-pull lines like SPI</span><span class="tmm-flow-node" data-tmm-flow-node="15" style="--tmm-flow-column:4;--tmm-flow-row:6;--tmm-flow-order:16">Separate translator for each direction</span></div><div class="tmm-flow-relations"><span class="tmm-flow-relation" data-tmm-flow-from="0" data-tmm-flow-to="1" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Signal direction <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> 5V to 3.3V</span><span class="tmm-flow-relation" data-tmm-flow-from="1" data-tmm-flow-to="2" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">5V to 3.3V <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Slow and one-way</span><span class="tmm-flow-relation" data-tmm-flow-from="2" data-tmm-flow-to="3" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Slow and one-way <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Resistor divider</span><span class="tmm-flow-relation" data-tmm-flow-from="1" data-tmm-flow-to="4" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">5V to 3.3V <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Fast and one-way</span><span class="tmm-flow-relation" data-tmm-flow-from="4" data-tmm-flow-to="5" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Fast and one-way <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> 74LVC125A buffer at 3.3V</span><span class="tmm-flow-relation" data-tmm-flow-from="0" data-tmm-flow-to="6" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Signal direction <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> 3.3V to 5V</span><span class="tmm-flow-relation" data-tmm-flow-from="6" data-tmm-flow-to="7" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">3.3V to 5V <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Receiver VIH below 3.0V</span><span class="tmm-flow-relation" data-tmm-flow-from="7" data-tmm-flow-to="8" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Receiver VIH below 3.0V <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Direct connection</span><span class="tmm-flow-relation" data-tmm-flow-from="6" data-tmm-flow-to="9" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">3.3V to 5V <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Receiver needs a full 5V</span><span class="tmm-flow-relation" data-tmm-flow-from="9" data-tmm-flow-to="10" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Receiver needs a full 5V <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> 74AHCT125 buffer at 5V</span><span class="tmm-flow-relation" data-tmm-flow-from="0" data-tmm-flow-to="11" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Signal direction <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Both ways</span><span class="tmm-flow-relation" data-tmm-flow-from="11" data-tmm-flow-to="12" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Both ways <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Open-drain bus like I2C</span><span class="tmm-flow-relation" data-tmm-flow-from="12" data-tmm-flow-to="13" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Open-drain bus like I2C <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> BSS138 module or PCA9306</span><span class="tmm-flow-relation" data-tmm-flow-from="11" data-tmm-flow-to="14" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Both ways <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Push-pull lines like SPI</span><span class="tmm-flow-relation" data-tmm-flow-from="14" data-tmm-flow-to="15" data-tmm-flow-label="" data-tmm-flow-bidirectional="0">Push-pull lines like SPI <span class="tmm-flow-arrow" aria-hidden="true">&#8594;</span> Separate translator for each direction</span></div><span class="tmm-flow-marker-id" data-tmm-flow-marker="tmm-flow-arrowhead-5"></span></div></div>
<p>The table below summarizes the same choices by application:</p>
<div>
<table>
<thead>
<tr>
<th scope="col">Application</th>
<th scope="col">Suggested approach</th>
</tr>
</thead>
<tbody>
<tr>
<td>Slow 5V GPIO output to 3.3V input</td>
<td>Resistor divider, ideally with 1% resistors</td>
</tr>
<tr>
<td>Fast 5V push-pull output to 3.3V input</td>
<td>5V-tolerant buffer powered at 3.3V, such as the 74LVC125A</td>
</tr>
<tr>
<td>3.3V GPIO to a 5V input with a low enough V<sub>IH</sub></td>
<td>Direct connection may work; check V<sub>OH</sub> against V<sub>IH</sub></td>
</tr>
<tr>
<td>3.3V output to a 5V input that needs a full 5V HIGH</td>
<td>5V logic buffer, such as the 74AHCT125</td>
</tr>
<tr>
<td>Mixed-voltage I2C</td>
<td>Bidirectional open-drain translator, such as a BSS138 module or PCA9306</td>
</tr>
<tr>
<td>Low-speed 5V-to-3.3V UART</td>
<td>Voltage divider on the 5V TX line</td>
</tr>
<tr>
<td>High-speed SPI</td>
<td>Direction-controlled translator for SCK, MOSI, and CS, plus a separate path for MISO</td>
</tr>
<tr>
<td>Multiple GPIOs across voltage domains</td>
<td>Multi-channel translator IC</td>
</tr>
</tbody>
</table>
</div>
<p>Whichever method you choose, check both the HIGH and LOW noise margins and confirm that no pin sees more than its rated voltage.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Frequently Asked Questions</strong></h2>
<p>Here are answers to questions that often come up when mixing 3.3V and 5V devices.</p>
<h3><strong>Are ESP32 GPIO pins 5V tolerant?</strong></h3>
<p>No. Espressif limits the original ESP32's GPIO inputs to VDD + 0.3V, which is 3.6V on a 3.3V supply. Reduce or translate any 5V signal before it reaches an ESP32 GPIO.</p>
<h3><strong>Can I just use a series resistor instead of a divider?</strong></h3>
<p>A series resistor limits the current through the pin's protection diode, but it doesn't keep the pin within its rated voltage. Espressif doesn't specify a safe injection current for the ESP32, so a divider or buffer is the safer choice.</p>
<h3><strong>Does this apply to other ESP32 variants?</strong></h3>
<p>Generally, yes. Espressif's later chips, such as the ESP32-S2, also run 3.3V I/O and list a similar VDD + 0.3V input limit. Check the datasheet for your specific chip.</p>
<h3><strong>Can I connect a 3.3V sensor to an Arduino Uno?</strong></h3>
<p>Often, but not always. Check the sensor's output HIGH voltage against the Arduino's input thresholds. Also check whether any signal from the Arduino could expose the sensor to 5V.</p>
<h3><strong>Can a voltage divider convert 3.3V to 5V?</strong></h3>
<p>No. A resistor divider can only reduce voltage. To produce a 5V HIGH from a 3.3V signal, use a buffer or level translator.</p>
<h3><strong>Can I power a 3.3V sensor from an Arduino's 3.3V pin?</strong></h3>
<p>Only if the pin can supply enough current. The Arduino Uno R3's 3.3V pin is rated for 50 mA. Also remember that powering a sensor at 3.3V doesn't make its signal lines safe if they have pull-ups to 5V.</p>
<h3><strong>Do I always need a logic level converter for I2C?</strong></h3>
<p>No. If every device on the bus has compatible input thresholds and the pull-up voltage stays within every device's rating, a direct connection may be fine. For mixed 3.3V and 5V buses with incompatible requirements, a dedicated I2C level translator is the safer choice.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Conclusion</strong></h2>
<p>Connecting 3.3V and 5V devices isn't difficult once you understand that a digital HIGH doesn't have a universal voltage.</p>
<p>A 5V microcontroller may recognize a 3.3V signal as HIGH, depending on its input threshold and the sender's output voltage. In the opposite direction, a 5V output can exceed the safe input voltage of a 3.3V device such as the ESP32.</p>
<p>A resistor divider is often an inexpensive solution for simple one-directional signals, as long as you check its worst-case output. Faster one-way signals call for a buffer powered from the right supply, which keeps edges sharp. For bidirectional buses like I2C or mixed-direction interfaces like SPI, choose a translator designed for that signal type.</p>
<p>Most importantly, check the datasheet before connecting two different voltage domains. With the four threshold values and a quick noise-margin check, you can mix 3.3V and 5V parts confidently in any project.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>References</strong></h2>
<ul>
<li><a href="https://docs.arduino.cc/hardware/uno-rev3/">Arduino Uno Rev3 documentation and specifications</a></li>
<li><a href="https://www.microchip.com/en-us/product/atmega328p">Microchip ATmega328P product page (datasheet: "DC Characteristics" table)</a></li>
<li><a href="https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf">Espressif ESP32 Series Datasheet ("DC Characteristics (3.3 V, 25 °C)" table)</a></li>
<li><a href="https://www.nxp.com/docs/en/user-guide/UM10204.pdf">NXP UM10204 I2C-bus Specification and User Manual</a></li>
<li><a href="https://www.ti.com/product/PCA9306">Texas Instruments PCA9306 I2C Level Translator</a></li>
<li><a href="https://www.ti.com/product/TXS0108E">Texas Instruments TXS0108E Voltage Translator</a></li>
<li><a href="https://www.ti.com/product/SN74LVC8T245">Texas Instruments SN74LVC8T245 Bus Transceiver</a></li>
<li><a href="https://www.ti.com/product/SN74LVC1T45">Texas Instruments SN74LVC1T45 Single-Bit Transceiver</a></li>
<li><a href="https://www.ti.com/product/SN74LVC125A">Texas Instruments SN74LVC125A Buffer</a></li>
<li><a href="https://www.ti.com/product/SN74AHCT125">Texas Instruments SN74AHCT125 Buffer</a></li>
</ul>
<p>The post <a href="https://www.teachmemicro.com/3-3v-5v-logic-level-shifting-arduino-esp32/">3.3V vs 5V Logic Levels: When Do You Need a Level Shifter?</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What Services Should You Expect From a Professional Moving Company?</title>
		<link>https://www.teachmemicro.com/what-services-should-you-expect-from-a-professional-moving-company/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Thu, 05 Nov 2026 21:54:00 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13287</guid>

					<description><![CDATA[<p>Moving can get pricey in a hurry, especially when a crew arrives late, forgets equipment, or gives you a bill that looks nothing like the quote. That is exactly why professional moving company services should be spelled out before you book. 6 in 10 (62%) people did a DIY move. Almost 4 in 10 (38%) &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/what-services-should-you-expect-from-a-professional-moving-company/">What Services Should You Expect From a Professional Moving Company?</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="font-weight: 400;">Moving can get pricey in a hurry, especially when a crew arrives late, forgets equipment, or gives you a bill that looks nothing like the quote. That is exactly why </span><b>professional moving company services</b><span style="font-weight: 400;"> should be spelled out before you book.</span></p>
<p><span style="font-weight: 400;">6 in 10 (62%) people did a DIY move. Almost 4 in 10 (38%) used a professional mover.</span></p>
<p><span style="font-weight: 400;">So when you ask </span><b>what moving companies offer</b><span style="font-weight: 400;">, you are really asking, “How much stress are they taking off my plate?” A clear </span><b>moving company service list</b><span style="font-weight: 400;"> helps protect your money, your belongings, and, honestly, your nerves.</span></p>
<p><span id="more-13287"></span></p>
<h2><b>Essential Professional Moving Company Services for Every Move</b></h2>
<p><span style="font-weight: 400;">Once you understand why the right mover matters, the next step is knowing what a reliable company should actually provide. At minimum, the basics should be clear, practical, and easy to compare.</span></p>
<p><span style="font-weight: 400;">If you want to compare verified packers and movers without calling five different companies,</span><a href="https://bookmymove.com/"> <span style="font-weight: 400;">BookMyMove</span></a><span style="font-weight: 400;"> lets you review prices, check available services, and book online in one place.</span></p>
<h3><b>Door-to-Door Residential Moving Services</b></h3>
<p><span style="font-weight: 400;">For most people, the real test is a home move. Good </span><b>residential moving services</b><span style="font-weight: 400;"> should cover packing, loading, transport, unloading, and unpacking.</span></p>
<p><span style="font-weight: 400;">The better crews also bring the right packing supplies, protect fragile pieces, and place boxes in the correct rooms. That may sound small now. But after a long moving day, you will be grateful when the kitchen boxes are actually in the kitchen.</span></p>
<h3><b>Commercial Moving Company Services for Businesses</b></h3>
<p><span style="font-weight: 400;">Business moves come with different pressures. You are not just moving desks; you are protecting time, data, equipment, and workflow. Strong </span><b>commercial moving company services</b><span style="font-weight: 400;"> should include office furniture, IT equipment, files, records, and careful scheduling.</span></p>
<p><span style="font-weight: 400;">A professional business mover may offer evening or weekend moves to reduce downtime. They should also understand high-rise rules, shared office buildings, warehouses, and secure handling for sensitive documents.</span></p>
<h3><b>Specialty Moving Solutions</b></h3>
<p><span style="font-weight: 400;">Some items need more than muscle. Pianos, antiques, fine art, safes, and large equipment require special handling, proper tools, trained movers, and the right vehicle setup.</span></p>
<p><span style="font-weight: 400;">Before booking, ask about crating, padding, lifting equipment, and valuation coverage. Once you know your mover can handle the unusual items, you can look at the bigger picture.</span></p>
<h2><b>Full Moving Company Service List: More Than Just Transport</b></h2>
<p><span style="font-weight: 400;">A moving company is not just a truck and two people with dollies. Today, a complete </span><b>moving company service list</b><span style="font-weight: 400;"> should explain what happens before, during, and after moving day.</span></p>
<table>
<tbody>
<tr>
<td><b>Service Area</b></td>
<td><b>What It Should Include</b></td>
<td><b>Why It Matters</b></td>
</tr>
<tr>
<td><span style="font-weight: 400;">Packing</span></td>
<td><span style="font-weight: 400;">Full, partial, or fragile-only packing</span></td>
<td><span style="font-weight: 400;">Reduces breakage and saves time</span></td>
</tr>
<tr>
<td><span style="font-weight: 400;">Furniture Work</span></td>
<td><span style="font-weight: 400;">Disassembly, wrapping, and reassembly</span></td>
<td><span style="font-weight: 400;">Prevents scratches and missing parts</span></td>
</tr>
<tr>
<td><span style="font-weight: 400;">Storage</span></td>
<td><span style="font-weight: 400;">Short-term, long-term, or climate-controlled units</span></td>
<td><span style="font-weight: 400;">Helps when dates don’t line up</span></td>
</tr>
<tr>
<td><span style="font-weight: 400;">Protection</span></td>
<td><span style="font-weight: 400;">Valuation and insurance choices</span></td>
<td><span style="font-weight: 400;">Clarifies what happens if damage occurs</span></td>
</tr>
</tbody>
</table>
<h3><b>Secure Packing and Unpacking Services</b></h3>
<p><span style="font-weight: 400;">A lot of damage starts before anything reaches the truck. Poor packing is often the culprit. Ask whether the mover offers full-service packing, partial packing, or fragile-only packing.</span></p>
<p><span style="font-weight: 400;">Some companies also use reusable crates, recyclable packing materials, and digital inventories. Unpacking may be as simple as opening boxes, or it may include item placement and debris removal, depending on the package.</span></p>
<h3><b>Furniture Disassembly and Assembly</b></h3>
<p><span style="font-weight: 400;">Beds, sectionals, desks, and modular furniture can turn moving day into a puzzle. Professional movers should label hardware, wrap surfaces, and reassemble everything properly at the new location.</span></p>
<p><span style="font-weight: 400;">This is especially useful for smart home equipment, mounted screens, or complex office furniture. Nobody wants to end the day staring at extra screws and wondering where they came from.</span></p>
<h3><b>Loading, Storage, and Protection Plans</b></h3>
<p><span style="font-weight: 400;">After packing, the risk shifts to loading, transport, and unloading. Good movers use clean trucks, straps, padding, item checks, and tracking tools when available.</span></p>
<p><span style="font-weight: 400;">If your closing date, lease start, or office handover does not line up, storage can save you. Storage answers, “Where does everything go?” Protection plans answer, “What happens if something gets damaged?”</span></p>
<h2><b>Modern Add-On Services Worth Asking About</b></h2>
<p><span style="font-weight: 400;">Once the basics are covered, add-on services can make the move easier, clearer, and better timed.</span></p>
<p><span style="font-weight: 400;">The moving services market size was valued at USD 110.97 billion in 2025 and estimated to grow to reach USD 150.16 billion by 2031, at a CAGR of 5.17% during the forecast period (2026-2031).</span></p>
<h3><b>Virtual Moving Consultations and Quotes</b></h3>
<p><span style="font-weight: 400;">Accurate pricing starts with a good estimate. Many movers now offer video surveys, where you walk through your home on camera and show furniture, boxes, stairs, elevators, and anything bulky.</span></p>
<p><span style="font-weight: 400;">Some platforms offer quick online estimates too. Just do not skip the details. Parking restrictions, long carries, fragile items, and packing needs can all affect the final price.</span></p>
<h3><b>Green Moving Options</b></h3>
<p><span style="font-weight: 400;">Many customers now want a move that creates less waste. Ask about reusable bins, reduced plastic wrap, recycling help, and fuel-efficient vehicles.</span></p>
<p><span style="font-weight: 400;">Green moving should not mean weaker service. The goal is simple: fewer disposable supplies, less waste, and the same careful handling.</span></p>
<h3><b>Relocation Planning, Pets, Vehicles, and International Moves</b></h3>
<p><span style="font-weight: 400;">Large moves need coordination. A move coordinator, shared checklist, and clear timeline can keep your family, team, building manager, and mover on the same page.</span></p>
<p><span style="font-weight: 400;">For international moves, ask about customs paperwork, destination rules, and delivery windows. Pets and vehicles may require separate carriers, health documents, preparation steps, and tighter scheduling.</span></p>
<h2><b>Red Flags and Quality Markers When Reviewing Service Lists</b></h2>
<p><span style="font-weight: 400;">With so many services available, the danger is choosing a company that promises everything but explains very little. A trustworthy mover is clear, licensed where required, insured, and willing to put important terms in writing.</span></p>
<h3><b>Warning Signs to Take Seriously</b></h3>
<p><span style="font-weight: 400;">Watch out for vague estimates, large cash deposits, missing written inventories, or no physical business address. Pushy sales calls are another warning sign.</span></p>
<p><span style="font-weight: 400;">If the company will not explain extra fees for stairs, long carries, packing materials, parking problems, or delays, slow down. A cheap quote can become expensive fast.</span></p>
<h3><b>Signs of a Reliable Mover</b></h3>
<p><span style="font-weight: 400;">For interstate U.S. moves, look for FMCSA registration. ProMover status may also help when applicable. Verified insurance and recent reviews are useful too, especially when customers mention the same strengths repeatedly.</span></p>
<p><span style="font-weight: 400;">The service list should match your move. For example, </span><b>commercial moving company services</b><span style="font-weight: 400;"> should mention IT handling, downtime planning, and secure records, not just “office moving.”</span></p>
<h2><b>Booking and Getting More Value From Your Move</b></h2>
<p><span style="font-weight: 400;">Once you know what to look for, booking becomes much easier. Still, the quality of your move depends on preparation and communication.</span></p>
<h3><b>How to Book Smart With BookMyMove</b></h3>
<p><span style="font-weight: 400;">Start with the basics: your moving date, pickup address, drop-off address, inventory, and any add-ons you want. Then compare verified movers, read the service details, and check whether packing, storage, or vehicle transport is included.</span></p>
<p><span style="font-weight: 400;">With verified partners, price comparisons, online booking, and support, BookMyMove helps you match your needs with the right service provider instead of guessing.</span></p>
<h3><b>Moving Day Prep That Helps</b></h3>
<p><span style="font-weight: 400;">Label boxes by room, keep valuables with you, and set aside medicines, chargers, keys, and important documents. Clear walkways before the crew arrives, and reserve parking if your building or street requires it.</span></p>
<p><span style="font-weight: 400;">After the move, ask about debris removal, basic setup, or move-in cleaning. Even the best </span><b>residential moving services</b><span style="font-weight: 400;"> work better when the space is ready.</span></p>
<h2><b>Final Thoughts on Choosing the Right Moving Services</b></h2>
<p><span style="font-weight: 400;">The right mover should make your day feel organized, not chaotic.</span></p>
<p><span style="font-weight: 400;">Strong </span><b>professional moving company services</b><span style="font-weight: 400;"> include clear pricing, careful packing, safe transport, storage options, and honest protection plans. Do not settle for vague promises and a truck.</span></p>
<p><span style="font-weight: 400;">Compare verified movers through BookMyMove, choose the services that fit your move, and give yourself a calmer start in your new place.</span></p>
<h2><b>Common Questions About Professional Moving Company Services</b></h2>
<h3><b>What will professional movers not move?</b></h3>
<p><span style="font-weight: 400;">Movers usually will not transport hazardous materials, open liquids, perishable food, live plants on some routes, firearms, propane tanks, or valuables like cash and jewelry. Ask for the restricted-items list before packing, because rules vary by company and location.</span></p>
<h3><b>Are you supposed to empty dressers for movers?</b></h3>
<p><span style="font-weight: 400;">Usually, yes, especially if the dresser is heavy, fragile, or going up or down stairs. Some movers allow light clothing to stay inside, but emptying drawers protects the furniture, reduces weight, and lowers the chance of damage.</span></p>
<h3><b>Is unpacking always included, or is it an add-on?</b></h3>
<p><span style="font-weight: 400;">Unpacking is often an add-on, not part of the base price. Some packages include basic placement, while others include full unpacking and debris removal. Always check the written </span><b>moving company service list</b><span style="font-weight: 400;"> so there are no surprises later.</span></p>
<p>The post <a href="https://www.teachmemicro.com/what-services-should-you-expect-from-a-professional-moving-company/">What Services Should You Expect From a Professional Moving Company?</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>From Blinking LEDs to Edge AI: How to Level Up Your ESP32 Projects</title>
		<link>https://www.teachmemicro.com/from-blinking-leds-to-edge-ai-how-to-level-up-your-esp32-projects/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Thu, 05 Nov 2026 21:49:23 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13284</guid>

					<description><![CDATA[<p>If you've been following ESP32 tutorials for a while, you've probably built your share of Wi-Fi weather stations, Bluetooth-controlled robots, and sensor dashboards. The ESP32 has been the go-to board for makers who want connectivity without the complexity of a full Linux SBC like the Raspberry Pi. But here's what's changed in the last couple &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/from-blinking-leds-to-edge-ai-how-to-level-up-your-esp32-projects/">From Blinking LEDs to Edge AI: How to Level Up Your ESP32 Projects</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="font-weight: 400;">If you've been following ESP32 tutorials for a while, you've probably built your share of Wi-Fi weather stations, Bluetooth-controlled robots, and sensor dashboards. The ESP32 has been the go-to board for makers who want connectivity without the complexity of a full Linux SBC like the Raspberry Pi.</span></p>
<p><span style="font-weight: 400;">But here's what's changed in the last couple of years: the bar for "interesting ESP32 project" has moved. Running a small neural network on the chip — locally, without cloud round-trips — is no longer a demo trick. It's becoming a real product requirement. And the latest ESP32 variants were designed with exactly that in mind.</span></p>
<p><span id="more-13284"></span></p>
<h2><b>Why the ESP32 Family Keeps Evolving</b></h2>
<p><span style="font-weight: 400;">The original ESP32 gave us dual-core processing, Wi-Fi, and Bluetooth in a package that cost less than a decent lunch. For most hobby projects, it's still more than enough.</span></p>
<p><span style="font-weight: 400;">But as makers started pushing into voice-controlled devices, camera-based smart sensors, and offline keyword detection, the limitations became clear:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">No hardware acceleration for math-heavy ML operations</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Limited USB support (you often needed a bridge chip)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Camera interfacing was awkward and underpowered</span></li>
</ul>
<p><span style="font-weight: 400;">Espressif addressed these gaps with the ESP32-S3, ESP32-S31, and newer variants. The S3, for instance, added SIMD vector instructions specifically for neural network inference, native USB OTG, and a proper camera interface. The S31 went further with a RISC-V core and Wi-Fi 6.</span></p>
<p><span style="font-weight: 400;">Understanding the full</span><a href="https://tuyaopen.ai/faq/2026/10/07/esp32s-features-use-cases-and-how-to-build-ai-iot-devices"> <span style="font-weight: 400;">esp32 features</span></a><span style="font-weight: 400;"> across these variants matters when you're choosing a board for a project that goes beyond blinking an LED.</span></p>
<h2><b>Where Edge AI Changes the Game</b></h2>
<p><span style="font-weight: 400;">Consider a simple project: a smart doorbell that recognizes whether someone is at the door before sending a notification. With the original ESP32, you'd capture a frame, upload it to a cloud API, wait for the response, and hope your Wi-Fi holds up. Latency, privacy concerns, and dependency on internet connectivity — all problems.</span></p>
<p><span style="font-weight: 400;">With an ESP32-S3 running a lightweight model on-device, the inference happens in milliseconds on the board itself. No cloud needed. No data leaves your hardware. The project goes from "works if everything is perfect" to "works, period."</span></p>
<p><span style="font-weight: 400;">This is the same shift happening in commercial IoT products, and it's a shift you can experiment with on a $5 development board.</span></p>
<h2><b>The Software Side: Don't Reinvent the Wheel</b></h2>
<p><span style="font-weight: 400;">Hardware is only half the story. The other half is the software stack — the SDK, the cloud connectivity, the OTA update mechanism, the AI integration layer.</span></p>
<p><span style="font-weight: 400;">This is where many maker projects stall. You get the model running on the chip, and then you need to figure out:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">How to connect the device to a cloud dashboard</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">How to push firmware updates without physically flashing each board</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">How to integrate an LLM for conversational features</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">How to handle device authentication and data encryption</span></li>
</ul>
<p><span style="font-weight: 400;">That's the kind of infrastructure that's tedious to build from scratch but essential for anything beyond a weekend demo.</span></p>
<p><span style="font-weight: 400;">An open-source framework like</span><a href="https://tuyaopen.ai/"> <span style="font-weight: 400;">TuyaOpen</span></a><span style="font-weight: 400;"> bundles these layers together — a cross-platform C/C++ SDK that works across ESP32, Raspberry Pi, and Tuya's own chips, plus cloud integration, multimodal AI support (ChatGPT, Gemini, Qwen, and others), and OTA update paths. It's designed so you can go from a working prototype to something shippable without rewriting your entire stack.</span></p>
<h2><b>What to Try Next</b></h2>
<p><span style="font-weight: 400;">If you want to start experimenting with AI on ESP32, here's a practical progression:</span></p>
<ol>
<li style="font-weight: 400;" aria-level="1"><b>Start with a basic sensor project</b><span style="font-weight: 400;"> on your current ESP32 board — get comfortable with the Arduino framework and Wi-Fi connectivity</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Move to an ESP32-S3 board</b><span style="font-weight: 400;"> and try running a TinyML model — Espressif's examples and the TuyaOpen SDK both have starter projects</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Add a camera module</b><span style="font-weight: 400;"> and experiment with on-device image classification</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Connect to a cloud AI service</b><span style="font-weight: 400;"> for features that need heavier processing — voice assistants, LLM-based responses</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Build a complete product prototype</b><span style="font-weight: 400;"> with OTA updates, a mobile dashboard, and proper device security</span></li>
</ol>
<p><span style="font-weight: 400;">The gap between "maker project" and "real product" is smaller than it used to be. The tools are better, the chips are more capable, and the open-source ecosystem has caught up. All you need is a board and a weekend to start.</span></p>
<p>The post <a href="https://www.teachmemicro.com/from-blinking-leds-to-edge-ai-how-to-level-up-your-esp32-projects/">From Blinking LEDs to Edge AI: How to Level Up Your ESP32 Projects</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How Automation Works in a Modern Sandwich Panel Production Line</title>
		<link>https://www.teachmemicro.com/how-automation-works-in-a-modern-sandwich-panel-production-line/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Thu, 05 Nov 2026 13:20:50 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13279</guid>

					<description><![CDATA[<p>Making one sandwich panel is fairly straightforward. A manufacturer places an insulating core between two outer skins, bonds the layers, and presses them together. Producing dozens of panels in a shift is a different challenge. Workers must keep the materials aligned, apply the right amount of adhesive, and move heavy assemblies between stations without disrupting &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/how-automation-works-in-a-modern-sandwich-panel-production-line/">How Automation Works in a Modern Sandwich Panel Production Line</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Making one sandwich panel is fairly straightforward. A manufacturer places an insulating core between two outer skins, bonds the layers, and presses them together. Producing dozens of panels in a shift is a different challenge. Workers must keep the materials aligned, apply the right amount of adhesive, and move heavy assemblies between stations without disrupting the process.</p>
<p>That is where industrial automation makes a difference. Instead of asking an operator to start and stop every machine, a control system coordinates conveyors, adhesive pumps, valves, and presses. Sensors tell the controller what is happening on the line, while motor drives and pneumatic actuators carry out its commands.</p>
<p>These are the same basic ideas behind many small electronics projects, but the stakes change when the equipment handles large panels and powerful machinery. Let's look at how the manufacturing process works, then follow the signals that keep an automated sandwich panel production line moving.</p>
<p><em>Sponsored content: This article was prepared in collaboration with GlueStream.</em></p>
<p><span id="more-13279"></span></p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Automation Coordinates the Main Stages of Sandwich Panel Manufacturing</strong></h2>
<p>A sandwich panel usually has two outer skins surrounding a lightweight core. Structural insulated panels (SIPs), for example, commonly pair oriented strand board (OSB) skins with expanded polystyrene (EPS) or another suitable insulating core. Other designs use metal, PVC, or fiberglass-reinforced skins. The materials vary, but the manufacturing challenge remains similar: each layer must reach the right position and form a dependable bond with its neighbors.</p>
<p>A production line divides that work into several stages. Material handling moves the components into place, adhesive equipment coats the required surfaces, and a press holds the assembly together while the bond develops. Automation links those stages so one machine does not interfere with the next.</p>
<h3><strong>Material Handling and Panel Positioning</strong></h3>
<p>Production starts with panels, boards, and insulation cores cut to the required dimensions. Operators may load them by hand, with lifting equipment, or through automated feeders. Once the materials reach the line, powered rollers or movable carriages carry them toward the assembly area. This removes much of the repeated lifting and pushing from the process.</p>
<p>However, moving a panel is only half the task. The line must also know where it is. A photoelectric sensor might detect the leading edge of a board, while a limit switch could confirm that a carriage has reached its stop. The controller uses these signals to stop a motor at the right moment or allow the next operation to begin. If the material never reaches the expected position, the machine should report a fault instead of continuing blindly.</p>
<h3><strong>Automated Adhesive Application</strong></h3>
<p>Once the material reaches the gluing station, the system must spread adhesive across the intended bonding surface. Uneven coverage can leave poorly bonded areas, while too much adhesive adds cost and may complicate handling. Manual application also becomes harder to repeat as panel sizes and production volumes increase.</p>
<p>An automatic applicator addresses this problem with a dosing pump and a controlled application head. The pump meters adhesive from a tank or drum, while the head distributes it through multiple outlets. Electric drives move the applicator or the panel, depending on the machine design. The controller coordinates that motion with dispensing so the equipment applies adhesive where the material actually sits. Some systems also switch nozzle groups on or off to match different panel widths.</p>
<h3><strong>Pressing, Curing, and Unloading</strong></h3>
<p>After adhesive application, workers or handling equipment assemble the skins and core into a stack. The line then moves the stack into a press. Here, the machine applies force across the panel to keep the layers in contact as the adhesive develops strength.</p>
<p>Pneumatic presses use compressed air to drive cylinders. Solenoid valves direct that air, and the control system starts and ends the pressing cycle according to the process settings. The correct pressure and pressing time depend on the adhesive, panel construction, and equipment design. Operators must follow the specified process rather than assume that every panel needs the same cycle.</p>
<p>Once the cycle finishes, the press releases the stack and the handling system transfers it toward unloading. The result is a repeated sequence of movement, dispensing, assembly, pressing, and transfer instead of a collection of unrelated manual steps.</p>
<p><em><img data-dominant-color="dbd9d6" data-has-transparency="false" style="--dominant-color: #dbd9d6;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13281 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/Automated-Sandwich-Panel-Production-Process.avif" alt="" width="869" height="290" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/Automated-Sandwich-Panel-Production-Process.avif 869w, https://www.teachmemicro.com/wp-content/uploads/2026/11/Automated-Sandwich-Panel-Production-Process-300x100.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/Automated-Sandwich-Panel-Production-Process-768x256.avif 768w" sizes="auto, (max-width: 869px) 100vw, 869px" /></em></p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Four Control Requirements for Automated Production Lines</strong></h2>
<p>Connecting these machines is not enough to make the line reliable. The controller must understand where materials and actuators are, decide what should happen next, and handle unexpected conditions. Four requirements shape that design.</p>
<h3><strong>Reliable Sensor Feedback</strong></h3>
<p>A controller cannot directly see a panel or feel the force of a press. It relies on electrical signals from sensors. Photoelectric sensors can detect incoming boards, proximity switches can indicate the position of a moving mechanism, and pressure transducers can report changes in an air system.</p>
<p>The signal type matters as much as the sensor itself. A digital input tells the controller whether a condition is true or false. An analog input provides a changing value, such as pressure. Engineers also need to account for dust, vibration, cable damage, and electrical interference. If a sensor gives a false reading, the controller may stop a good panel or attempt the wrong sequence.</p>
<h3><strong>Coordinated Motion and Process Sequencing</strong></h3>
<p>Industrial controllers, often programmable logic controllers (PLCs), turn sensor readings into actions. Instead of running every motor continuously, they move the line through defined operating states. For example, the controller may wait for a panel-position signal, stop the conveyor, enable the adhesive applicator, and then release the panel for transfer.</p>
<p>This sequence needs conditions between steps. The press should not accept another stack while its previous cycle is still running. Similarly, the conveyor should not move into a work area until the relevant mechanism has cleared it. These conditions, commonly called <strong>interlocks</strong>, prevent conflicting commands and make a complex line easier to diagnose.</p>
<p><img data-dominant-color="ced0d4" data-has-transparency="false" style="--dominant-color: #ced0d4;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13282 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/Sandwich-Panel-Automation-Control-Diagram.avif" alt="" width="887" height="444" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/Sandwich-Panel-Automation-Control-Diagram.avif 887w, https://www.teachmemicro.com/wp-content/uploads/2026/11/Sandwich-Panel-Automation-Control-Diagram-300x150.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/Sandwich-Panel-Automation-Control-Diagram-768x384.avif 768w, https://www.teachmemicro.com/wp-content/uploads/2026/11/Sandwich-Panel-Automation-Control-Diagram-660x330.avif 660w" sizes="auto, (max-width: 887px) 100vw, 887px" /></p>
<h3><strong>Accurate Dosing and Actuator Control</strong></h3>
<p>The controller also needs to match actuator behavior to the process. A conveyor motor moves a panel, but an adhesive pump must deliver the required material at the same time. If panel travel speed changes without a corresponding dosing adjustment, the amount of adhesive per square meter can change too.</p>
<p>Variable-frequency drives help regulate compatible AC motors by controlling their operating frequency and voltage. In an adhesive station, drive control can adjust pump output to suit the required application rate. Pneumatic valves handle a different job: they open or close air paths to move cylinders or operate dispensing mechanisms. Each component serves a specific purpose, but the controller brings their actions together.</p>
<h3><strong>Machine Safety and Fault Detection</strong></h3>
<p>A stopped production line costs time, but an unsafe one can injure people. Presses create crush hazards, conveyors introduce pinch points, and pneumatic equipment can store energy even after a motor stops. Designers therefore need guards, appropriate emergency-stop functions, and safety-rated controls wherever the risk assessment requires them.</p>
<p>Ordinary PLC logic can report a missing sensor or an incomplete press cycle, but it should not replace a properly designed safety function. For example, an interlocked guard may need a safety circuit that prevents hazardous motion when someone opens it. During maintenance, workers must also isolate electrical and pneumatic energy according to the applicable procedures. Good diagnostics help technicians find faults; proper safeguards protect them while they do so.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>GlueStream Equipment for Automated Sandwich Panel Manufacturing</strong></h2>
<p>The control principles above appear in real manufacturing equipment. GlueStream develops machinery for applying adhesives and assembling sandwich panels, with configurations that range from individual workstations to integrated lines. Its published designs provide a useful example of how mechanical equipment and electronic control fit together.</p>
<h3><strong>Automated Adhesive Application Systems</strong></h3>
<p>GlueStream's <a href="https://gluestream.com/">Sandwich panel equipment</a> includes the SPL-10M adhesive-applying portal. Rather than relying on workers to spread adhesive over a large board, this machine uses a moving applicator and a metering system to cover the intended surface. The applicator can adjust its height to suit the material stack, while controlled valves help set the active application width.</p>
<p>The company describes a precision dosing pump that works with frequency converters to regulate adhesive delivery. For the relevant SPL-10M configuration, GlueStream states an application accuracy of <strong>±5 g/m²</strong>. That figure is a manufacturer specification, not an independent measurement, and actual results depend on the material and process setup. Still, it illustrates why manufacturers pay close attention to dosing control: even small variations matter across large bonding surfaces.</p>
<p>The equipment also addresses a problem specific to moisture-curing, one-component polyurethane (PUR) adhesives. Because moisture starts their curing reaction, adhesive left exposed inside a nozzle can harden and block it. GlueStream uses an automatically closing shutter tray with protective liquid to cover the nozzle area during stops. This small mechanism helps the applicator prepare for its next cycle without unnecessary cleaning or material loss.</p>
<h3><strong>Integrated Production Lines and Pneumatic Presses</strong></h3>
<p>An adhesive applicator solves only one part of the process. Panels still need to travel to assembly and pressing stations, and those machines must share a predictable sequence. GlueStream's ASPL-10M.2P <a href="https://gluestream.com/">Sandwich Panel Production Line</a> shows how a manufacturer can connect the stages.</p>
<p>According to its product documentation, the ASPL-10M.2P combines an SPL-10M mobile adhesive portal, a motorized roller conveyor, an automatic distribution platform, two P-type pneumatic presses, a glue pump station, and a control cabinet. The conveyor and distribution platform transfer material through the line, while the presses hold assembled panels during the bonding stage. Operators still take part in the workflow, but the machines handle much of the repeated transport and processing.</p>
<p>This arrangement also shows why overall production speed depends on more than a fast adhesive head. A panel cannot leave the pressing stage before the process allows it, and an incoming stack needs a free destination. By coordinating these stations, the line can reduce unnecessary waiting and keep the equipment working in an orderly sequence. Actual output still depends on panel size, materials, adhesive requirements, staffing, and the selected machine configuration.</p>
<h3><strong>Remote Diagnostics and Production Flexibility</strong></h3>
<p>Even a well-designed line occasionally needs adjustment or troubleshooting. A position sensor may fail, a motor drive may report an error, or a dispensing parameter may need attention. Local diagnostic displays give operators a starting point, while remote support can help specialists investigate problems without immediately traveling to the factory.</p>
<p>GlueStream advertises remote-access modules and online technical support for its machinery. These features can make technical assistance more convenient, although customers should still control network access and define who may change machine settings. Remote connectivity does not replace on-site inspection, routine maintenance, or safety procedures.</p>
<p>Manufacturers also need to choose equipment that fits their process. The right arrangement depends on panel dimensions, adhesive chemistry, expected output, floor space, compressed-air capacity, and how much manual handling the operation can accommodate. Automation works best when engineers design around those practical limits instead of treating every production line as interchangeable.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Conclusion</strong></h2>
<p>An automated sandwich panel line may look very different from a microcontroller project on a workbench, but both rely on the same basic control loop. Sensors report what is happening, a controller chooses the next action, and electrical or pneumatic actuators carry it out. The difference lies in the scale of the machinery and the demands on reliability, timing, and safety.</p>
<p>In panel manufacturing, those controls help coordinate material positioning, adhesive application, pressing, and unloading. GlueStream's equipment shows how manufacturers can combine these functions into a working production system. For anyone studying electronics or embedded control, it is a practical reminder that understanding sensors, motor drives, and sequencing opens the door to much larger industrial applications.</p>
<h2><strong>References</strong></h2>
<ul>
<li><a href="https://gluestream.com/shop/spl-10m-1c-pur-adhesive-applying-portal-with-an-automatic-roller-conveyor-12">GlueStream — SPL-10M.1C.PUR Adhesive-Applying Portal</a></li>
<li><a href="https://gluestream.com/shop/automatic-sandwich-panel-line-aspl-10m-2">GlueStream — ASPL-10M.2P Automatic SIP Panel Production Line</a></li>
<li><a href="https://www.osha.gov/etools/machine-guarding/introduction/guards">OSHA — Machine Guarding: Guards and Interlocks</a></li>
<li><a href="https://www.osha.gov/etools/machine-guarding/introduction/safety-considerations">OSHA — Additional Machine Safety Considerations</a></li>
</ul>
<p>The post <a href="https://www.teachmemicro.com/how-automation-works-in-a-modern-sandwich-panel-production-line/">How Automation Works in a Modern Sandwich Panel Production Line</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Securing Networked Microcontrollers to Prevent Modern IoT Data Breaches</title>
		<link>https://www.teachmemicro.com/securing-networked-microcontrollers-to-prevent-modern-iot-data-breaches/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Wed, 04 Nov 2026 02:51:09 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13274</guid>

					<description><![CDATA[<p>The global population of connected devices surpassed 21 billion at the end of 2025 and is on a trajectory to approach 39 billion by the year 2030. For hardware developers and engineers, getting a microcontroller online to transmit sensor data is an exciting and essential milestone. Edge computing now powers everything from smart agriculture to &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/securing-networked-microcontrollers-to-prevent-modern-iot-data-breaches/">Securing Networked Microcontrollers to Prevent Modern IoT Data Breaches</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The global population of connected devices surpassed 21 billion at the end of 2025 and is on a trajectory to approach 39 billion by the year 2030. For hardware developers and engineers, getting a microcontroller online to transmit sensor data is an exciting and essential milestone. Edge computing now powers everything from smart agriculture to industrial automation. However, the gap between building a successful breadboard prototype and deploying a secure edge ecosystem is vast. Automated attacks targeting internet-connected hardware have escalated rapidly, reaching an average of 820,000 malicious hacking attempts daily. Securing these network endpoints is no longer an optional feature. It is a critical requirement for any modern engineering project, demanding rigorous attention from the initial design phase through to final deployment.</p>
<p><span id="more-13274"></span></p>
<h2><strong>Transitioning from Prototyping to Enterprise Deployment</strong></h2>
<p>While deploying a basic connected device, such as a NodeMCU IoT environment monitor, is often the first step in a hardware prototype, securing the data it transmits requires an enterprise-level approach. Engineers must recognise that the same features making these devices accessible for development also make them attractive targets for malicious actors.</p>
<p>When environmental sensors or industrial microcontrollers are connected to broader corporate networks, they become potential entry points for cybercriminals. Modern eCrime breakout times (the critical window from an attacker gaining initial access via an edge device to moving laterally across a network) have plummeted to just 29 minutes. If a vulnerability in an ESP32 or Raspberry Pi is exploited, attackers can pivot into centralised servers before network administrators even realise a breach is underway. The threat is not just theoretical. In late 2025, a massive distributed denial-of-service attack was launched by the Aisuru botnet, which successfully hijacked over 500,000 poorly secured edge devices globally to orchestrate severe network disruptions.</p>
<h2><strong>Why Edge Endpoints Demand Proactive Defence</strong></h2>
<p>Because microcontrollers often lack the memory and processing power to run traditional endpoint security agents, modern organisations must increasingly rely on dedicated <a href="https://www.nuix.com/solutions/data-privacy/data-breach-readiness"><u>Data breach readiness software</u></a> to monitor their vast data landscapes and instantly detect anomalous activity. Implementing such solutions allows companies to identify unusual traffic patterns originating from seemingly innocuous hardware, thereby neutralising threats before they escalate into catastrophic network compromises.</p>
<p>The stakes for enterprise data ecosystems are incredibly high. A severe IoT data breach involving connected hardware from Mars Hydro recently exposed 2.7 billion records via an unsecured cloud database. This leak included Wi-Fi network credentials and device configurations that could grant attackers direct local network access. Similarly, the high-profile breach of internet-connected security cameras from Verkada serves as a foundational industry case study. It demonstrated exactly how compromising physical edge devices can directly expose highly sensitive internal operations. With approximately 98% of all IoT device traffic currently transmitted unencrypted, bad actors can easily intercept critical network commands and credentials if a single hardware endpoint is compromised.</p>
<h2><strong>Meeting New Australian Security Standards</strong></h2>
<p>In Australia, the regulatory landscape is rapidly shifting to enforce stronger hardware security at the manufacturing level. The Australian Signals Directorate reported a 20% increase in cybersecurity incidents during the 2025 to 2026 financial year, responding to over 1,500 major events. To combat this escalating threat, the Cyber Security (Security Standards for Smart Devices) Rules 2025 now legally mandate baseline cybersecurity requirements for most smart devices acquired in the country.</p>
<p>Under these new regulations, engineers must ensure their connected hardware adheres to three core rules:</p>
<ul>
<li>A strict ban on universal default passwords across all manufactured hardware to prevent trivial automated exploits.</li>
<li>Mandatory vulnerability reporting mechanisms to allow independent researchers to disclose flaws securely and efficiently.</li>
<li>Transparent minimum security update periods clearly communicated to buyers at the point of sale, ensuring long-term device integrity.</li>
</ul>
<p>Furthermore, a government-backed Cybersecurity Labelling Scheme is being implemented across Australia. This initiative helps enterprise buyers easily compare device security before integrating third-party sensors into their networks. The Australian Cyber Security Centre actively advises developers to follow its IoT Secure-by-Design Guidance, which outlines 13 fundamental principles to secure edge technologies before they reach production. Adhering to these guidelines not only ensures compliance but also builds critical trust with enterprise clients who are increasingly wary of hardware vulnerabilities.</p>
<h2><strong>The Financial and Operational Stakes</strong></h2>
<p>The financial fallout from poorly secured IoT infrastructure can cripple an organisation. According to IBM's <a href="https://www.ibm.com/reports/data-breach"><u>Cost of a Data Breach Report 2026</u></a>, the global average cost of a data breach saw a 12% increase over the previous year. These costs reached record highs due to longer escalation times and advanced AI-enabled malware designed specifically to exploit fragmented edge networks.</p>
<p>This economic impact aligns with recent research indicating that IoT-targeted malware attacks surged by 124% year-over-year. Cybercriminals are increasingly weaponising connected edge networks for physical extortion, leading to a nearly 50% surge in targeted ransomware campaigns directed at industrial and operational technology sensors. As the lines between hardware engineering and enterprise IT continue to blur, developers must adopt secure architectures from the ground up. By implementing proper encryption libraries, disabling unnecessary debugging ports, and preparing robust incident response strategies, the hardware community can help prevent the next catastrophic network intrusion and safeguard the future of connected infrastructure.</p>
<p>The post <a href="https://www.teachmemicro.com/securing-networked-microcontrollers-to-prevent-modern-iot-data-breaches/">Securing Networked Microcontrollers to Prevent Modern IoT Data Breaches</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Set Up a ChromeOS Device for Microcontroller Development</title>
		<link>https://www.teachmemicro.com/how-to-set-up-a-chromeos-device-for-microcontroller-development/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Wed, 04 Nov 2026 02:26:26 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13271</guid>

					<description><![CDATA[<p>Many DIY electronics beginners mistakenly assume they need a bulky, expensive Windows or Mac machine to write code and flash boards. However, modern lightweight laptops are more than capable of handling embedded programming. With the education sector now accounting for roughly 46 to 60 percent of the global market for ChromeOS devices, these machines have &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/how-to-set-up-a-chromeos-device-for-microcontroller-development/">How to Set Up a ChromeOS Device for Microcontroller Development</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Many DIY electronics beginners mistakenly assume they need a bulky, expensive Windows or Mac machine to write code and flash boards. However, modern lightweight laptops are more than capable of handling embedded programming. With the education sector now accounting for roughly 46 to 60 percent of the global market for ChromeOS devices, these machines have become a dominant standard for learning and student prototyping in Australia. If you are looking for an affordable, battery-efficient workstation, a <a href="https://www.asus.com/au/laptops/for-home/chromebook/"><u>chromebook laptop</u></a> is fully equipped to serve as your mobile development hub for platforms like Arduino and ESP32. With hardware configurations that deliver between 8 and 14 hours of continuous active use on a single charge, you can enjoy extended prototyping sessions without constantly searching for a power outlet. Furthermore, standard lithium-ion laptop batteries maintain optimal performance for 300 to 500 charge cycles, which equates to roughly a year of heavy use before naturally stabilising at around 80 percent of their initial capacity. This longevity makes them incredibly practical for students and hobbyists alike.</p>
<p><span id="more-13271"></span></p>
<h2><strong>Programming Microcontrollers via the Cloud</strong></h2>
<p>Thanks to recent advancements in browser technology, you no longer need to download heavy desktop clients to start coding. The implementation of the WebSerial API is a game-changing standard that allows your ChromeOS browser to directly read and write to connected USB serial devices. This successfully bypasses the need for complex local driver installations that often frustrate beginners, allowing you to focus entirely on learning the fundamentals of circuit logic and coding.</p>
<p>For early learners, the Arduino Web Editor processes all C++ code compilation securely in the cloud. This means even budget-friendly devices with limited RAM can effortlessly flash binaries down to connected boards. In addition to standard C++, Arduino recently expanded its cloud capabilities with a browser-based application for MicroPython. This allows users to program compatible microcontrollers directly over WebSerial without downloading native desktop clients, making project management incredibly seamless from a unified online dashboard. You can effortlessly switch between devices without losing any saved progress or code.</p>
<h2><strong>Enabling the Linux Development Environment</strong></h2>
<p>If you prefer coding locally or need to run full desktop-class Integrated Development Environments (IDEs), ChromeOS has a robust built-in solution. The native Linux environment, known as Crostini, operates using a custom virtual machine monitor optimised for tight security and low-latency performance. Because it is an integrated feature in the operating system, you can natively install and run Linux command-line tools and code editors without compromising your device's security. To get started, you can follow the official Google documentation to set up Linux on your Chromebook through the developer settings, which opens up a secure Debian terminal for your projects.</p>
<p>As of early 2024, ChromeOS introduced a seamless upgrade path for this container to Debian 12 (Bookworm). This ensures that hardware enthusiasts have access to the latest packages and modern graphical frameworks for their preferred coding setups. Your default Linux container, designated as 'penguin', will securely mount local files and let you run full desktop Linux applications natively. This means you can use industry-standard software like Visual Studio Code or the full Arduino IDE just as you would on a traditional desktop.</p>
<h2><strong>Steps to Configure Your Coding Workspace</strong></h2>
<p>Whether you are participating in local Australian STEM initiatives or just tinkering at home, setting up your device takes only a few minutes. Follow these fundamental steps to get your mobile workstation ready for embedded electronics:</p>
<ul>
<li>Update your operating system to ensure you have the latest browser features required for the WebSerial API.</li>
<li>Enable the Linux development environment in your system settings to generate your secure container.</li>
<li>Allocate sufficient disk space for your Linux partition (reserving at least 10GB is recommended for desktop IDEs).</li>
<li>Download the Linux AppImage or install the official web application for your preferred microcontroller development platform.</li>
<li>Connect your board via USB and approve the system prompt to share the serial port with your Linux container.</li>
</ul>
<h2><strong>Next Steps for Your Electronics Journey</strong></h2>
<p>Australian organisations like the AustSTEM Foundation and award-winning educational groups such as STEM Punks are actively promoting early coding literacy by pairing low-cost laptops with educational microcontrollers. Major Australian electronics distributors, including Pakronics and Little Bird Electronics, now supply curriculum-aligned hardware bundles specifically tested for school-issued devices. You might even encounter unique, locally designed microcontrollers like the Kookaberry being used to teach digital concepts in classrooms across the country. These local resources make it easier than ever to find compatible parts.</p>
<p>Once your development environment is configured, the best way to test it is by diving into a practical, hands-on task. A brilliant starting point for any beginner is to follow a basic sensor wiring tutorial to <a href="https://www.teachmemicro.com/how-to-build-an-iot-light-detector-with-esp32/"><u>build an IoT light detector with ESP32</u></a> hardware. Taking on a project like this will give you immediate experience with writing C++ code to read analogue values, proving just how capable your lightweight, battery-efficient workstation truly is. As you grow more comfortable with the ecosystem, you will quickly discover that ChromeOS is a highly productive platform for turning your electronic ideas into reality.</p>
<p>The post <a href="https://www.teachmemicro.com/how-to-set-up-a-chromeos-device-for-microcontroller-development/">How to Set Up a ChromeOS Device for Microcontroller Development</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Elecrow ESP32-P4 Starter Kit: Setup &#038; Getting Started Guide</title>
		<link>https://www.teachmemicro.com/elecrow-esp32-p4-starter-kit-setup-getting-started-guide/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 22:29:32 +0000</pubDate>
				<category><![CDATA[ESP32 Tutorial]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13087</guid>

					<description><![CDATA[<p>The ESP32-P4 is an unusual member of the ESP32 family: it has no integrated Wi-Fi or Bluetooth radio. On a microcontroller family best known for connected projects, that might seem like an odd omission. But Espressif designed the P4 for a different job. It combines RISC-V processors, camera and display interfaces, and hardware acceleration for &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/elecrow-esp32-p4-starter-kit-setup-getting-started-guide/">Elecrow ESP32-P4 Starter Kit: Setup &#038; Getting Started Guide</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The ESP32-P4 is an unusual member of the ESP32 family: it has no integrated Wi-Fi or Bluetooth radio. On a microcontroller family best known for connected projects, that might seem like an odd omission. But Espressif designed the P4 for a different job. It combines RISC-V processors, camera and display interfaces, and hardware acceleration for graphics and multimedia applications.</p>
<p>Elecrow's <a href="https://www.elecrow.com/all-in-one-starter-kit-for-esp32-p4-with-common-board-design-16-modules-and-ai-lessons.html">All-in-One ESP32-P4 Starter Kit</a> turns those features into a learning platform. Elecrow integrates a 7-inch touchscreen, a 2-megapixel camera, audio hardware, and a common sensor board in one case. That lets you learn the software side without spending the first day wiring a display and several breakout modules.</p>
<p>We'll begin by identifying the kit, its board version, and its chip revision. Then we'll set up ESP-IDF, build a serial-output program, and control the onboard LED. We'll also explain what to expect from the display examples, how wireless expansion works, and which problems to check before blaming the firmware.</p>
<p><span id="more-13087"></span></p>
<p><em>Disclosure: This article contains an affiliate link. We may earn a commission if you purchase through it, at no additional cost to you.</em></p>
<p><img data-dominant-color="b9b3ae" data-has-transparency="false" style="--dominant-color: #b9b3ae;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13239 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/10/esp32-p4-starter-kit-open-overhead-view.avif" alt="ESP32-P4 Starter Kit, opened, overhead view" width="1086" height="1448" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/10/esp32-p4-starter-kit-open-overhead-view.avif 1086w, https://www.teachmemicro.com/wp-content/uploads/2026/10/esp32-p4-starter-kit-open-overhead-view-225x300.avif 225w, https://www.teachmemicro.com/wp-content/uploads/2026/10/esp32-p4-starter-kit-open-overhead-view-768x1024.avif 768w" sizes="auto, (max-width: 1086px) 100vw, 1086px" /></p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>What's Inside the Elecrow ESP32-P4 Starter Kit?</strong></h2>
<p>Elecrow sells this kit as model SEE00804D. The package contains the assembled starter kit in a portable case and a USB Type-C cable. The common board carries 16 sensor and output modules on one PCB, and the lid holds the touchscreen. A 2 MP wide-angle camera and audio hardware extend the kit beyond the usual LED-and-sensor exercises.</p>
<p>The display has a resolution of 1024 × 600 pixels and connects to the P4 over a two-lane MIPI DSI bus. That gives you enough space for a multi-page interface with controls, status information, and charts. A large display also adds software work that a character LCD doesn't need: panel initialization, frame buffers, graphics rendering, and touch input all have to match the actual hardware.</p>
<h3><strong>Starter Kit Specifications</strong></h3>
<table>
<thead>
<tr>
<th scope="col">Specification</th>
<th scope="col">Elecrow SEE00804D</th>
</tr>
</thead>
<tbody>
<tr>
<td>Main microcontroller</td>
<td>ESP32-P4: two high-performance RISC-V cores plus one low-power RISC-V core</td>
</tr>
<tr>
<td>HP CPU clock specified by Elecrow</td>
<td>Up to 360 MHz</td>
</tr>
<tr>
<td>PSRAM</td>
<td>16 MB in-package (Elecrow GitHub); 32 MB in some listings (ESP32-P4NRW32)</td>
</tr>
<tr>
<td>Flash</td>
<td>16 MB NOR flash</td>
</tr>
<tr>
<td>Display</td>
<td>7-inch IPS capacitive touchscreen, 1024 × 600, two-lane MIPI DSI (EK79007 driver IC)</td>
</tr>
<tr>
<td>Camera</td>
<td>2 MP, 100° wide-angle, MIPI CSI</td>
</tr>
<tr>
<td>Audio</td>
<td>Onboard microphone and speaker</td>
</tr>
<tr>
<td>Common board</td>
<td>16 integrated learning modules</td>
</tr>
<tr>
<td>Connectivity</td>
<td>No Wi-Fi or Bluetooth in the ESP32-P4; slot for an optional wireless module; 100 Mbps Ethernet (RJ45)</td>
</tr>
<tr>
<td>Interfaces</td>
<td>USB Type-C, USB Type-A, microSD (TF) slot, I²C and UART connectors, 2 × 20-pin GPIO header, MIPI CSI</td>
</tr>
<tr>
<td>Power input</td>
<td>5 V through USB Type-C</td>
</tr>
<tr>
<td>Development software</td>
<td>ESP-IDF (Elecrow's guide uses 5.4.2) and Arduino course examples</td>
</tr>
<tr>
<td>Documented kit revisions</td>
<td>V1.0 and V1.1</td>
</tr>
</tbody>
</table>
<p>Elecrow's sources disagree on memory. Its GitHub README lists 16 MB of in-package PSRAM, while the launch specifications that CNX Software published name the ESP32-P4NRW32, which pairs the chip with 32 MB. The part number on your chip settles it: NRW16 indicates 16 MB of PSRAM, and NRW32 indicates 32 MB. With PSRAM enabled, the ESP-IDF boot log also reports the size it detects.</p>
<p><img data-dominant-color="dddad9" data-has-transparency="false" style="--dominant-color: #dddad9;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13240 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/10/elecrow_esp32_p4_precise_callouts_1400.avif" alt="Actual overhead photograph of the open kit with precise callouts for its 7-inch touchscreen, camera, ESP32-P4 board, sensor/common PCB, USB-C ports, microSD slot, Ethernet port, and wireless expansion slot." width="1400" height="1187" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/10/elecrow_esp32_p4_precise_callouts_1400.avif 1400w, https://www.teachmemicro.com/wp-content/uploads/2026/10/elecrow_esp32_p4_precise_callouts_1400-300x254.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/10/elecrow_esp32_p4_precise_callouts_1400-1024x868.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/10/elecrow_esp32_p4_precise_callouts_1400-768x651.avif 768w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p>
<h3><strong>Onboard Sensors, Outputs, and Expansion</strong></h3>
<p>Elecrow routes the common board's connections in advance, which makes the basic exercises straightforward. Elecrow's pin list and course material identify these signals:</p>
<table>
<thead>
<tr>
<th scope="col">Module or function</th>
<th scope="col">Connection</th>
<th scope="col">What it is useful for</th>
</tr>
</thead>
<tbody>
<tr>
<td>LED (LED5)</td>
<td>GPIO5, active-low</td>
<td>Checking GPIO output</td>
</tr>
<tr>
<td>PIR motion sensor</td>
<td>GPIO24</td>
<td>Digital input and motion events</td>
</tr>
<tr>
<td>Hall-effect sensor</td>
<td>GPIO7 (shares a selector switch with the touch sensor)</td>
<td>Detecting magnetic-field changes</td>
</tr>
<tr>
<td>Touch sensor</td>
<td>GPIO2 (shares a selector switch with the Hall sensor)</td>
<td>Reading touch input</td>
</tr>
<tr>
<td>User key</td>
<td>GPIO16</td>
<td>Button input</td>
</tr>
<tr>
<td>Servo</td>
<td>GPIO25</td>
<td>PWM servo control</td>
</tr>
<tr>
<td>MQ-2 gas sensor</td>
<td>GPIO17</td>
<td>Gas and smoke detection</td>
</tr>
<tr>
<td>Relay</td>
<td>GPIO42</td>
<td>Switched output control</td>
</tr>
<tr>
<td>DHT20 temperature/humidity sensor</td>
<td>I²C</td>
<td>Environmental measurements</td>
</tr>
<tr>
<td>BH1750 light sensor</td>
<td>I²C</td>
<td>Light-level measurements</td>
</tr>
</tbody>
</table>
<p>The board also carries an ultrasonic distance sensor, an LSM6DS3 accelerometer and gyroscope, a WS2814 RGBW LED, a microphone, and a speaker, and Elecrow's lessons cover each one. Confirm their pins against the board markings and schematic before you write your own code. Elecrow's ultrasonic lesson, for example, lists two different pin pairs in different places.</p>
<p>One hardware detail catches people out: the touch and Hall sensors share a toggle switch next to the wireless-module slot. Elecrow's lessons require the switch in its Hall/touch position before either sensor will work.</p>
<p>A useful ESP32-P4 detail: ESP-IDF assigns GPIO24 and GPIO25 to USB-JTAG by default, and reconfiguring either as an ordinary GPIO disables that debug function. Elecrow puts the PIR sensor and the servo on those pins, so check the ESP-IDF GPIO notes before you combine sensor code with USB-JTAG debugging.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>How the ESP32-P4 Differs from the ESP32 and ESP32-S3</strong></h2>
<p>The familiar ESP32 suits connected control projects. The ESP32-S3 adds newer processing features and useful USB capabilities while keeping wireless connectivity on the chip. The ESP32-P4 takes another direction: it concentrates on local processing, graphics, cameras, and wired peripherals.</p>
<table>
<thead>
<tr>
<th scope="col">Feature</th>
<th scope="col">Original ESP32</th>
<th scope="col">ESP32-S3</th>
<th scope="col">ESP32-P4</th>
</tr>
</thead>
<tbody>
<tr>
<td>Main CPU</td>
<td>Dual-core Xtensa LX6</td>
<td>Dual-core Xtensa LX7</td>
<td>Dual-core RISC-V HP system, plus LP RISC-V core</td>
</tr>
<tr>
<td>Maximum HP clock</td>
<td>240 MHz</td>
<td>240 MHz</td>
<td>360 MHz on v1.x silicon; 400 MHz on v3.x silicon</td>
</tr>
<tr>
<td>Main on-chip RAM</td>
<td>520 KB SRAM</td>
<td>512 KB SRAM</td>
<td>768 KB HP L2 memory, plus separate LP memory</td>
</tr>
<tr>
<td>Integrated Wi-Fi</td>
<td>Yes, Wi-Fi 4</td>
<td>Yes, Wi-Fi 4</td>
<td>No</td>
</tr>
<tr>
<td>Integrated Bluetooth</td>
<td>Classic Bluetooth and BLE</td>
<td>BLE</td>
<td>No</td>
</tr>
<tr>
<td>USB peripheral capability</td>
<td>No native USB OTG</td>
<td>Full-speed USB OTG</td>
<td>High-speed USB OTG</td>
</tr>
<tr>
<td>Display and camera emphasis</td>
<td>General-purpose peripherals</td>
<td>Parallel display/camera support</td>
<td>MIPI DSI, MIPI CSI, ISP, PPA and video-oriented hardware</td>
</tr>
</tbody>
</table>
<p>Elecrow specifies a 360 MHz HP processor for this kit. On May 8, 2026, Espressif announced ESP32-P4 chip revision v3.x, which raises the stable maximum clock to 400 MHz. The newer silicon also changes the ESP-IDF requirements, which we cover in the next section.</p>
<p>More important than the raw clock number is the work the chip can offload. The P4 includes an image signal processor (ISP), a pixel-processing accelerator (PPA), JPEG hardware, and an H.264 encoder. These blocks handle parts of camera and graphics processing so the application cores don't have to do every operation in software.</p>
<p>For example, a touchscreen dashboard benefits from dedicated display transfer and pixel handling. A camera application can use the camera interface and image-processing peripherals rather than routing the whole data path through general-purpose GPIO. That architecture, more than the higher CPU frequency, is the reason to consider the P4.</p>
<p><img data-dominant-color="cdcdcb" data-has-transparency="false" style="--dominant-color: #cdcdcb;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13243 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/10/ESP32-Board-Comparison-Infographic.avif" alt="Comparison diagram showing three actual device/board photographs: classic ESP32 DevKit, ESP32-S3 development board, and the Elecrow ESP32-P4 kit. " width="1180" height="741" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/10/ESP32-Board-Comparison-Infographic.avif 1180w, https://www.teachmemicro.com/wp-content/uploads/2026/10/ESP32-Board-Comparison-Infographic-300x188.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/10/ESP32-Board-Comparison-Infographic-1024x643.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/10/ESP32-Board-Comparison-Infographic-768x482.avif 768w" sizes="auto, (max-width: 1180px) 100vw, 1180px" /></p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Check the Board Version and Chip Revision Before Loading Examples</strong></h2>
<p>Two revision numbers matter on this kit: Elecrow's board version and Espressif's chip revision. Check both before you open the supplied code.</p>
<h3><strong>Board version: V1.0 or V1.1</strong></h3>
<p>Look for the version marking on the PCB. Elecrow publishes separate course material for V1.0 and V1.1, and the two versions ship with different servos:</p>
<table>
<thead>
<tr>
<th scope="col">Kit version</th>
<th scope="col">Supplied servo type</th>
<th scope="col">Relevant course</th>
</tr>
</thead>
<tbody>
<tr>
<td>V1.0</td>
<td>360° continuous-rotation servo</td>
<td>Use the V1.0 Lesson 8 example</td>
</tr>
<tr>
<td>V1.1</td>
<td>180° positional servo</td>
<td>Use the V1.1 Lesson 8 example</td>
</tr>
</tbody>
</table>
<p>A continuous-rotation servo interprets control pulses as speed and direction commands. A positional servo interprets them as a requested angle. If you run the wrong example, the servo can move in confusing ways even though the PWM signal is valid.</p>
<p>The product that was sent to me is the V1.1 as shown on the lower right of the PCB:</p>
<p><img data-dominant-color="a69992" data-has-transparency="false" style="--dominant-color: #a69992;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13254 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-v1.1.avif" alt="" width="1122" height="1402" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-v1.1.avif 1122w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-v1.1-240x300.avif 240w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-v1.1-819x1024.avif 819w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-v1.1-768x960.avif 768w" sizes="auto, (max-width: 1122px) 100vw, 1122px" /></p>
<p>Elecrow's repository currently publishes Eagle schematic files only for V1.0. On a V1.1 board, compare the pin labels against the V1.1 course material and the markings on the PCB.</p>
<h3><strong>Chip revision: v1.x or v3.x</strong></h3>
<p>Espressif's v3.x chip revision requires ESP-IDF v5.5.3 or later (or v6.0 or later), and you must rebuild firmware for it. Elecrow's setup guide uses ESP-IDF 5.4.2, which only suits v1.x chips.</p>
<p>Check the marking on the ESP32-P4 before you install a toolchain. Espressif adds an X suffix to v3.x part numbers, as in ESP32-P4NRW32X. If the board already runs ESP-IDF firmware, the bootloader also prints the chip revision near the top of the boot log. For a v3.x chip, install ESP-IDF v5.5.3 or later instead of 5.4.2, and expect to adapt Elecrow's examples to any API changes.</p>
<p><img data-dominant-color="bdbfc6" data-has-transparency="false" style="--dominant-color: #bdbfc6;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13255 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/ESP32-P4-Circuit-Board-Close-Up.avif" alt="ESP32-P4 Circuit Board Close-Up" width="1086" height="1448" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/ESP32-P4-Circuit-Board-Close-Up.avif 1086w, https://www.teachmemicro.com/wp-content/uploads/2026/11/ESP32-P4-Circuit-Board-Close-Up-225x300.avif 225w, https://www.teachmemicro.com/wp-content/uploads/2026/11/ESP32-P4-Circuit-Board-Close-Up-768x1024.avif 768w" sizes="auto, (max-width: 1086px) 100vw, 1086px" /></p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>First Power-Up: Check the Factory Firmware</strong></h2>
<p>Power the kit through USB Type-C with the supplied cable; Elecrow specifies a 5 V input. Use a suitable USB power source or a computer port, and never apply 5 V directly to a GPIO or signal header.</p>
<p>The factory demonstration gives you a useful baseline. If the display, touch input, and other demonstrations work before you change the firmware, you'll have a reference point when something fails later. A feature missing from the factory menu doesn't prove a module is defective, though; the preloaded firmware may not exercise every peripheral.</p>
<p>Elecrow's repository includes factory_firmware and factory_sourcecode folders. Keep a copy of both, along with any flashing instructions, before you flash another application. You don't need to erase the flash first.</p>
<p>On the included OS, here's what I see when I go to settings &gt; about:</p>
<p><img data-dominant-color="b5b7c2" data-has-transparency="false" style="--dominant-color: #b5b7c2;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13256 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32_p4_display_readable_crop.avif" alt="ESP32-P4 About" width="866" height="496" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32_p4_display_readable_crop.avif 866w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32_p4_display_readable_crop-300x172.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32_p4_display_readable_crop-768x440.avif 768w" sizes="auto, (max-width: 866px) 100vw, 866px" /></p>
<p>This first check establishes what the hardware does before you make software changes. It isn't meant to prove every module works in one sitting.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2 dir="ltr"><strong>Setting Up ESP-IDF for the ESP32-P4</strong></h2>
<p dir="ltr">Elecrow provides both Arduino and ESP-IDF learning material. We’ll use ESP-IDF because it gives direct access to the ESP32-P4 target, FreeRTOS, the peripheral drivers, and the configuration options that matter in later display and camera projects. We’ll run one of Elecrow’s lessons first to confirm the toolchain and USB connection, then create our own project.</p>
<h3 dir="ltr"><strong>Step 1: Install VS Code and ESP-IDF</strong></h3>
<p dir="ltr">Download Visual Studio Code, open Extensions, and install the Python extension followed by Espressif’s ESP-IDF extension. In the Command Palette, run ESP-IDF: Open ESP-IDF Installation Manager and follow the prompts.</p>
<p dir="ltr">Choose ESP-IDF 5.4.2 for a v1.x chip, the version Elecrow used to configure its lessons. For a v3.x chip, choose v5.5.3 or later. Install to a short path with no spaces, such as C:\esp, because ESP-IDF doesn’t support spaces in its paths or in project paths.</p>
<h3 dir="ltr"><strong>Step 2: Clone Elecrow’s Repository to a Short Path</strong></h3>
<p dir="ltr">Elecrow’s lessons nest deeply, and some file paths exceed Windows’ 260-character limit when the repository sits in a long folder. Enable long paths in Git, then clone into a short folder:</p>
<div>
<div dir="ltr" tabindex="0" role="group" aria-label="Code">
<div>
<pre><code>git config --global core.longpaths true
cd C:\esp
git clone https://github.com/Elecrow-RD/All-in-one-Starter-Kit-for-ESP32-P4-with-Common-Board-design.git elecrow-p4</code></pre>
</div>
</div>
</div>
<p dir="ltr">Elecrow’s ESP-IDF lessons are in example\V1.0\idf-code and example\V1.1\idf-code, 20 lessons each. The two sets differ only in Lesson 8, the servo lesson.</p>
<h3 dir="ltr"><strong>Step 3: Open a Lesson as a Project</strong></h3>
<p dir="ltr">Each lesson folder contains a second folder with the same name, and that inner folder is the ESP-IDF project. In VS Code, choose File &gt; Open Folder and select it:</p>
<div>
<div dir="ltr" tabindex="0" role="group" aria-label="Code">
<div>
<pre><code>C:\esp\elecrow-p4\example\V1.1\idf-code\1ESP32P4-dev-kits_gpio\ESP32P4-dev-kits_gpio</code></pre>
</div>
</div>
</div>
<p dir="ltr">Don’t change the target. Elecrow includes a ready-made sdkconfig in each lesson that already selects esp32p4 and sets up the PSRAM, flash size, and partition table. Setting the target again regenerates that file and discards those settings.</p>
<h3 dir="ltr"><strong>Step 4: Connect USB1 and Select the Port</strong></h3>
<p dir="ltr">The kit has two USB-C ports. Connect the one labelled USB1, which feeds a CH340K USB-to-serial chip wired to the P4’s UART0. The other port, USB2, connects to the P4’s high-speed USB peripheral and isn’t used for flashing.</p>
<p dir="ltr">On Windows, the kit should appear under Device Manager &gt; Ports (COM &amp; LPT) as USB-SERIAL CH340K. If it appears as an unknown device instead, install WCH’s CH340 driver. In the ESP-IDF status bar, select that COM port and set the flash method to UART. The CH340’s control lines put the P4 into download mode automatically, so you don’t need to press any buttons.</p>
<h3 dir="ltr"><strong>Step 5: Build, Flash, and Monitor Lesson 1</strong></h3>
<p dir="ltr">Run ESP-IDF: Build your project, then ESP-IDF: Flash your project, then ESP-IDF: Monitor your device. The status bar has buttons for all three. The command-line equivalent in an ESP-IDF terminal is:</p>
<div>
<div dir="ltr" tabindex="0" role="group" aria-label="Code">
<div>
<pre><code>idf.py build
idf.py -p COMx flash monitor</code></pre>
</div>
</div>
</div>
<p dir="ltr">Lessons that use the display, sensors, or camera download components from Espressif’s component registry on their first build, so keep the computer online. When Lesson 1 runs, the monitor prints Elecrow’s start-up messages and the green LED next to GPIO5 blinks every 500 ms.</p>
<h3 dir="ltr"><strong>Step 6: Create Your Own Project</strong></h3>
<p dir="ltr">With the toolchain and connection confirmed, create a project for our own code. Run ESP-IDF: New Project, set the target to esp32p4, save the project to a short path such as C:\esp\p4-hello, and start from the sample_project template. The template doesn’t enable PSRAM, which the serial and LED programs below don’t need. For display work, start from Elecrow’s lessons, which already have PSRAM configured.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Our First ESP32-P4 Program: Serial Output</strong></h2>
<p dir="ltr">Before initializing the 7-inch display, we’ll run a program with as few board-specific dependencies as possible. A counter printed to the serial monitor confirms that a project of our own builds, flashes, and runs. It also gives us somewhere to send diagnostic messages later.</p>
<p dir="ltr">Elecrow’s lessons ship with their own configuration and board drivers. For our code, we’ll start from a clean ESP-IDF project instead.</p>
<h4 dir="ltr"><strong>Create the project</strong></h4>
<p dir="ltr">In VS Code, open the Command Palette and run ESP-IDF: New Project. Then:</p>
<ol dir="ltr">
<li>Choose the ESP-IDF version you installed earlier.</li>
<li>Choose the sample_project template from the ESP-IDF list, then click Create Project Using Template sample_project.</li>
<li>Name the project p4-hello and set the location to C:\esp. Avoid spaces in both, because ESP-IDF doesn’t support them in project paths.</li>
<li>Set the target to esp32p4. The board setting only matters for hardware debugging, so leave it on the generic ESP32-P4 entry.</li>
<li>Select the kit’s USB-SERIAL CH340K port.</li>
<li>Click Create Project, then Open Project.</li>
</ol>
<p dir="ltr">If you prefer the command line, open an ESP-IDF terminal and run:</p>
<div>
<div dir="ltr" tabindex="0" role="group" aria-label="Code">
<div>
<pre><code>cd C:\esp
idf.py create-project p4-hello
cd p4-hello
idf.py set-target esp32p4</code></pre>
</div>
</div>
</div>
<p dir="ltr">The template contains three files:</p>
<div>
<div dir="ltr" tabindex="0" role="group" aria-label="Code">
<div>
<pre><code>p4-hello\
├── CMakeLists.txt
└── main\
    ├── CMakeLists.txt
    └── main.c</code></pre>
</div>
</div>
</div>
<p dir="ltr">The top-level CMakeLists.txt marks the folder as an ESP-IDF project. The main folder is the project’s application component, and its CMakeLists.txt registers main.c as a source file. Setting the target also creates sdkconfig, which stores the project’s configuration. Change it through ESP-IDF: SDK Configuration Editor (Menuconfig) rather than editing it by hand.</p>
<p dir="ltr">The default configuration works for this program as-is. It sends console output to UART0, which is the UART that the kit’s CH340K USB-to-serial chip connects to. One exception: if you’re using ESP-IDF 5.5 or later with a v1.x chip, open the configuration editor, search for REV_LESS_V3, enable it, and save. Newer ESP-IDF versions target v3.x chips by default.</p>
<h4 dir="ltr"><strong>Add the code</strong></h4>
<p dir="ltr">Open main\main.c and replace its contents with:</p>
<div>
<div dir="ltr" tabindex="0" role="group" aria-label="c code">
<div>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main(void)
{
    unsigned int counter = 0;

    while (1) {
        printf("Hello from ESP32-P4! Count: %u\n", counter++);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}</code></pre>
</div>
</div>
</div>
<p dir="ltr">You don’t need to change either CMakeLists.txt file. The template already lists main.c, and every ESP-IDF project includes the components that printf() and the FreeRTOS functions come from.</p>
<p dir="ltr">In ESP-IDF, <code dir="ltr">app_main()</code> is the application’s entry point. There is no Arduino-style <code dir="ltr">setup()</code> and <code dir="ltr">loop()</code> pair to implement. The ESP-IDF runtime initializes the system and then calls <code dir="ltr">app_main()</code> from a FreeRTOS task.</p>
<p dir="ltr">The <code dir="ltr">printf()</code> call sends the counter to the console. <code dir="ltr">pdMS_TO_TICKS(1000)</code> converts 1,000 milliseconds into FreeRTOS ticks, and <code dir="ltr">vTaskDelay()</code> blocks the current task for that many ticks instead of occupying the CPU with a busy-wait loop.</p>
<h4 dir="ltr"><strong>Build, flash, and monitor</strong></h4>
<p dir="ltr">Check that the ESP-IDF status bar shows esp32p4 as the target, the CH340K COM port, and UART as the flash method. Then build, flash, and open the monitor. The status bar has buttons for each step, or you can run them from an ESP-IDF terminal:</p>
<div>
<div dir="ltr" tabindex="0" role="group" aria-label="Code">
<div>
<pre><code>idf.py -p COMx flash monitor</code></pre>
</div>
</div>
</div>
<p dir="ltr">After the boot messages, the monitor prints one line about once per second:</p>
<div>
<div dir="ltr" tabindex="0" role="group" aria-label="text code">
<div>
<pre><code class="language-text">Hello from ESP32-P4! Count: 0
Hello from ESP32-P4! Count: 1
Hello from ESP32-P4! Count: 2
Hello from ESP32-P4! Count: 3</code></pre>
</div>
</div>
</div>
<p dir="ltr">Press Ctrl+] to leave the monitor. If flashing reports success but the terminal stays blank, check the selected port and the cable before changing the application code.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Blinking the Onboard LED on GPIO5</strong></h2>
<p>Serial output tells us the firmware is running. The next step is to drive a real signal from the P4. Elecrow's first lesson drives LED5 from GPIO5, and its LED circuit sinks current into the pin. That makes the LED active-low: driving GPIO5 low turns the LED on, and driving it high turns it off.</p>
<p>This program toggles the LED with a 500 ms delay between transitions:</p>
<pre><code class="language-c">#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_err.h"

#define LED_GPIO GPIO_NUM_5
#define LED_ON 0   /* LED5 is active-low */
#define LED_OFF 1

void app_main(void)
{
    ESP_ERROR_CHECK(gpio_reset_pin(LED_GPIO));
    ESP_ERROR_CHECK(gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT));

    while (1) {
        ESP_ERROR_CHECK(gpio_set_level(LED_GPIO, LED_ON));
        vTaskDelay(pdMS_TO_TICKS(500));

        ESP_ERROR_CHECK(gpio_set_level(LED_GPIO, LED_OFF));
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}</code></pre>
<p>The <em><code>gpio_reset_pin()</code></em> call returns GPIO5 to its default configuration, and <em><code>gpio_set_direction()</code></em> enables output mode. The <em><code>LED_ON</code></em> and <em><code>LED_OFF</code></em> macros hide the active-low polarity, so the loop reads the way the LED behaves. A full on-off cycle takes about one second.</p>
<p>An ESP-IDF template's main component links every component automatically, so this program builds without changes to the CMake files. If you prefer explicit dependencies, or move the LED code into its own component, declare the GPIO driver in that component's <em><code>CMakeLists.txt</code></em>:</p>
<pre><code class="language-cmake">idf_component_register(SRCS "main.c"
    INCLUDE_DIRS "."
    REQUIRES esp_driver_gpio)</code></pre>
<p>If serial output works but the LED never changes, confirm that your board version uses GPIO5 for LED5 and check the project's configuration. A failed LED exercise doesn't mean the MCU or the flashing setup is defective.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Exploring the 7-Inch Touchscreen</strong></h2>
<p>The serial and LED examples barely exercise the P4's main strengths. The touchscreen is where the chip's dedicated multimedia interfaces start to matter.</p>
<p><img data-dominant-color="87888f" data-has-transparency="false" style="--dominant-color: #87888f;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13267 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-lcd.avif" alt="ESP32-P4 Kit LCD" width="1079" height="951" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-lcd.avif 1079w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-lcd-300x264.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-lcd-1024x903.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-lcd-768x677.avif 768w" sizes="auto, (max-width: 1079px) 100vw, 1079px" /></p>
<p>A 1024 × 600 frame contains 614,400 pixels. At 16 bits per pixel, one uncompressed full-screen buffer needs 614,400 × 2 = 1,228,800 bytes, or about 1.17 MiB.</p>
<p>A second full-size buffer doubles that before the application allocates anything else, which is why the display configuration depends on PSRAM. Elecrow's display lesson places LVGL's buffers in PSRAM, and its first lesson enables PSRAM at 200 MHz in <em><code>sdkconfig</code></em> (that option appears once you make experimental features visible). The on-chip RAM alone isn't enough for a large graphics application.</p>
<p>Elecrow's display lesson drives the panel over a two-lane MIPI DSI bus with an EK79007 driver IC, and it supplies the board-specific setup for that combination. Start with Elecrow's example for your board version rather than writing your own initialization sequence. Use this order:</p>
<ol>
<li>Open Elecrow's ESP-IDF course for your V1.0 or V1.1 kit.</li>
<li>Find the LCD project and read its component requirements before building.</li>
<li>Check the project's ESP-IDF version and its display and touch driver dependencies.</li>
<li>Build and flash the unchanged demonstration first.</li>
<li>Record whether the display renders correctly and whether touch coordinates respond as expected.</li>
</ol>
<p>Elecrow's repository lists LVGL 8.3.3 as a dependency. LVGL is a practical next step for dashboards, menus, and interactive controls, but examples that depend on different major LVGL versions can produce API or build errors when mixed.</p>
<p>Running the supplied display example unchanged establishes a working hardware and driver combination before you start modifying the graphics code.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Wireless Connectivity and ESP32-C6 Expansion</strong></h2>
<p>Unlike the original ESP32 or the ESP32-S3, the ESP32-P4 has no Wi-Fi or Bluetooth radio of its own. A P4 application that needs wireless networking has to use another device to provide it.</p>
<p>Elecrow sells plug-in wireless modules for this slot, including an ESP32-C6 version. The module exposes UART transmit and receive pins along with a few GPIOs, so the P4 talks to it over a serial link: the C6 runs the radio, and the P4 handles the user interface, sensors, and application logic. Both chips need matching firmware, so plugging in the module doesn't enable networking by itself.</p>
<p>For a wired connection, the kit has a 100 Mbps Ethernet port. Ethernet suits an HMI panel that stays in one installation and benefits from a predictable network connection.</p>
<p><img data-dominant-color="e6ac76" data-has-transparency="false" style="--dominant-color: #e6ac76;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13268 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-ethernet-port-usb-host-usb-c-in.avif" alt="esp32-p4-kit-ethernet-port-usb-host-usb-c-in" width="1077" height="389" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-ethernet-port-usb-host-usb-c-in.avif 1077w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-ethernet-port-usb-host-usb-c-in-300x108.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-ethernet-port-usb-host-usb-c-in-1024x370.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/esp32-p4-kit-ethernet-port-usb-host-usb-c-in-768x277.avif 768w" sizes="auto, (max-width: 1077px) 100vw, 1077px" /></p>
<p>ESP32-C6 networking deserves its own interface description, driver setup, and connectivity test, so we'll cover it in a separate tutorial. The initial setup in this article doesn't need a wireless module.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Troubleshooting the ESP32-P4 Starter Kit</strong></h2>
<p>Most first-day problems with this kit come down to the cable, the toolchain version, or a board setting. Start with these checks.</p>
<h3><strong>The Computer Powers the Kit but Doesn't Detect It</strong></h3>
<p>Check the USB cable and the USB-C port first. A charge-only cable can supply 5 V without carrying data. Try a known data-capable cable and check Device Manager for a new COM port.</p>
<h3><strong>ESP-IDF Doesn't Recognize the esp32p4 Target</strong></h3>
<p>Check which ESP-IDF installation the terminal or VS Code extension is using. A toolchain set up for another chip family, or an older framework without P4 support, won't accept the target. For Elecrow's examples on a v1.x chip, use ESP-IDF 5.4.2.</p>
<h3><strong>New Firmware Flashes but Won't Boot</strong></h3>
<p>Check the chip revision. A v3.x chip needs ESP-IDF v5.5.3 or later and firmware rebuilt for that revision; firmware from ESP-IDF 5.4.2 doesn't support it.</p>
<h3><strong>Flashing Fails Even Though a Port Appears</strong></h3>
<p>Close other serial-monitor programs, verify the port selection, and retry. If automatic bootloader entry isn't working, follow the kit's download-mode procedure. A flashing failure is a separate problem from a compilation error, so read the last meaningful message in the build or flashing log before making changes.</p>
<h3><strong>The Serial Monitor Is Blank</strong></h3>
<p>A successful build doesn't guarantee that the firmware prints to the port you're monitoring. Check the project's console configuration, the selected port, the cable, and the reset behavior. Early boot messages tell you whether you're connected to the right channel.</p>
<h3><strong>The LED Doesn't Blink</strong></h3>
<p>Confirm GPIO5 for your board version. Remember that LED5 is active-low, so it lights when GPIO5 is low. If the serial counter still runs, the problem more likely concerns the pin, its configuration, or the LED circuit than basic CPU execution.</p>
<h3><strong>The Touch or Hall Sensor Doesn't Respond</strong></h3>
<p>Check the selector switch next to the wireless-module slot. Both sensors need it in the Hall/touch position.</p>
<h3><strong>The Display Goes Blank After the First Program</strong></h3>
<p>The serial and blink programs don't initialize the panel or touch controller, so a blank display after flashing them is expected. Load Elecrow's display example when you want to use the screen again.</p>
<h3><strong>The Servo Moves Continuously Instead of Holding an Angle</strong></h3>
<p>Check the board version. V1.0 kits ship with a continuous-rotation servo and V1.1 kits with a 180° positional servo. Use the matching Lesson 8 example before adjusting pulse widths.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Is the Elecrow ESP32-P4 Starter Kit Worth It?</strong></h2>
<p>The main advantage of the SEE00804D is convenience. Elecrow assembles the touchscreen, camera, audio hardware, and common sensor board for you. That suits a classroom, or a developer who wants to work on firmware and interface design without first wiring several peripherals.</p>
<p>There are tradeoffs. The P4 isn't the easiest choice if all you need is Wi-Fi and a few sensor inputs; a conventional ESP32 or ESP32-S3 may be simpler and less expensive. Wireless expansion takes extra hardware and firmware on a second chip. The fixed circuitry also gives you less freedom to move a sensor to another GPIO than a set of separate modules would.</p>
<p>The development environment is another consideration. A serial-output program is approachable, but graphics, cameras, PSRAM configuration, and multiple drivers take more work than the usual Arduino blink sketch. Elecrow's examples give you a starting point for that more advanced software.</p>
<p>We'd choose this kit for exploring touch interfaces, camera handling, and P4-specific peripherals. For a basic wireless temperature logger or relay controller, we'd choose a simpler board. The kit earns its price when you plan to use the display and multimedia features rather than treating them as extras.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Conclusion</strong></h2>
<p>The ESP32-P4 isn't a replacement for every ESP32 board. It's a different kind of microcontroller, intended for applications where local processing and rich interfaces matter more than an integrated radio.</p>
<p>Elecrow's starter kit gives you a practical way to learn that architecture. Start by identifying the board version and chip revision and saving the factory resources. Then set up the matching ESP-IDF version and confirm serial output and GPIO control. Once those basics work, run the display example before changing its drivers or writing a custom LVGL interface.</p>
<p>Future tutorials will explore the individual sensors, camera processing, and wireless expansion. The important first step is a development setup whose behavior you can reproduce and troubleshoot.</p>
<h2><strong>References</strong></h2>
<ul>
<li><a href="https://www.elecrow.com/all-in-one-starter-kit-for-esp32-p4-with-common-board-design-16-modules-and-ai-lessons.html">Elecrow: All-in-One Starter Kit for ESP32-P4 (SEE00804D)</a></li>
<li><a href="https://www.elecrow.com/wiki/All-in-one_Starter_Kit_for_ESP32-P4_with_Common_Board_design.html">Elecrow Wiki: Setup instructions and V1.0/V1.1 courses</a></li>
<li><a href="https://www.elecrow.com/download/product/SEE00804D/All-in-one_Starter_Kit_for_ESP32-P4_User_Manual.pdf">Elecrow: All-in-One Starter Kit for ESP32-P4 ESP-IDF user manual (PDF)</a></li>
<li><a href="https://github.com/Elecrow-RD/All-in-one-Starter-Kit-for-ESP32-P4-with-Common-Board-design">Elecrow GitHub: Examples, pin definitions, and factory firmware</a></li>
<li><a href="https://www.elecrow.com/wireless-module-for-crowpanel-advanced-series.html">Elecrow: Wireless module for CrowPanel Advanced series</a></li>
<li><a href="https://www.espressif.com/en/products/socs/esp32-p4">Espressif: ESP32-P4 SoC overview</a></li>
<li><a href="https://www.espressif.com/en/news/ESP32_P4_v3.x_Upgrade">Espressif: ESP32-P4 v3.x upgrade announcement (May 2026)</a></li>
<li><a href="https://documentation.espressif.com/esp32-p4-chip-revision-v3.x_user_guide_en.html">Espressif: ESP32-P4 Chip Revision v3.x User Guide</a></li>
<li><a href="https://docs.espressif.com/projects/esp-idf/en/release-v5.4/esp32p4/api-reference/peripherals/gpio.html">Espressif: ESP-IDF GPIO driver reference for ESP32-P4</a></li>
<li><a href="https://www.cnx-software.com/2025/12/19/esp32-p4-learning-and-prototyping-kit-features-7-inch-touchscreen-comes-with-16-modules-and-ai-lessons/">CNX Software: ESP32-P4 learning and prototyping kit specifications</a></li>
</ul>
<p>The post <a href="https://www.teachmemicro.com/elecrow-esp32-p4-starter-kit-setup-getting-started-guide/">Elecrow ESP32-P4 Starter Kit: Setup &#038; Getting Started Guide</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Website Conversion Tracking: How to Set It Up for a Local Business</title>
		<link>https://www.teachmemicro.com/website-conversion-tracking-how-to-set-it-up-for-a-local-business/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 22:15:00 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13262</guid>

					<description><![CDATA[<p>A roofer pays for Google Ads and Facebook ads every month. Both report conversions, but the numbers do not match each other, and neither matches the jobs on the calendar. Usually one platform counts page views, another counts every button click, and nobody counts phone calls. Here is how to decide what counts, set it &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/website-conversion-tracking-how-to-set-it-up-for-a-local-business/">Website Conversion Tracking: How to Set It Up for a Local Business</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A roofer pays for Google Ads and Facebook ads every month. Both report conversions, but the numbers do not match each other, and neither matches the jobs on the calendar. Usually one platform counts page views, another counts every button click, and nobody counts phone calls.</p>
<p>Here is how to decide what counts, set it up in Google Ads, GA4 and the Meta pixel, and test it in 30 minutes.</p>
<p><span id="more-13262"></span></p>
<p><strong>Key takeaways</strong></p>
<ul>
<li>Count only actions that can become a job: a form sent, a call from the site, a booking, a chat. Never a page view.</li>
<li>In Google Ads, set lead actions to Count: One and keep one Primary action per lead.</li>
<li>Google Ads can import only GA4 events marked as key events.</li>
<li>On the Meta pixel, use Lead for forms, Schedule for bookings and Contact for calls and chats.</li>
<li>Booked jobs can go back to Google Ads up to 90 days after the click.</li>
</ul>
<h2><strong>What should a local business count as a conversion?</strong></h2>
<p>A conversion is an action that can turn into paid work. For a local business that means four things: a form sent, a call placed from the website, a booking made and a chat started. Page views, button clicks and time on site are not conversions. They show interest, not a lead.</p>
<table>
<tbody>
<tr>
<th>Conversion</th>
<th>How to track it</th>
<th>Tool</th>
</tr>
<tr>
<td>Form sent</td>
<td>Thank you page view or form submit event</td>
<td>GA4 key event, Meta Lead</td>
</tr>
<tr>
<td>Call from the website</td>
<td>Google forwarding number, minimum call length</td>
<td>Google Ads calls from website</td>
</tr>
<tr>
<td>Booking</td>
<td>Confirmation page, cross domain if the tool is on another site</td>
<td>GA4 key event, Meta Schedule</td>
</tr>
<tr>
<td>Chat started</td>
<td>Chat start event from the widget</td>
<td>GA4 key event, Meta Contact</td>
</tr>
<tr>
<td>Booked job</td>
<td>Upload with the click ID</td>
<td>Google Ads offline conversions</td>
</tr>
</tbody>
</table>
<h2><strong>How to set up Google Ads conversion tracking</strong></h2>
<p>Google Ads Help gives two data sources for website conversions: the Google tag, or importing key events from Google Analytics. Imports can take 24 to 48 hours to appear. Then check four settings on each action:</p>
<ul>
<li><strong>Primary or Secondary.</strong> Primary actions fill the Conversions column and drive bidding. Secondary ones only show in All conversions. If the tag and GA4 both track one form, make only one primary.</li>
<li><strong>Count: One.</strong> Google recommends One for leads and Every for sales.</li>
<li><strong>Conversion window.</strong> The default is 30 days, with a range of 1 to 90. Make it longer if people call back weeks after a click, as with roofs or legal cases.</li>
<li><strong>Calls from website.</strong> A phone snippet swaps your number for a Google forwarding number, only for visitors who clicked an ad. A call counts when it passes the minimum length you set. Set it just under your shortest real booking call.</li>
</ul>
<h2><strong>GA4 key events, the Meta pixel and booking tools</strong></h2>
<p>In GA4, go to Admin, then Events under Data display, and click the star next to the event. For forms, a thank you page is the most reliable signal. Create an event with Create without code, base it on page_view and enter the thank you page address. A form submit event can fire on errors or double clicks.</p>
<p>On the Meta pixel, Meta's pixel reference describes Schedule as booking an appointment and Contact as reaching you by phone, SMS, email or chat. Use Lead for a sent form, one event per action.</p>
<p>If your booking tool runs on its own domain, set up cross domain measurement in GA4 under Data streams, Configure tag settings, Configure your domains. Google Analytics Help says both sites need the same tag ID. If the tool will not take your tag, count its confirmation emails by hand.</p>
<h2><strong>The step after: send booked jobs back</strong></h2>
<p>A lead is not a job. Say a salon gets 40 form leads in a month and 25 of them book. Google Ads sees 40 equal leads, so it bids just as hard for the 15 that went nowhere. Sending booked jobs back fixes that.</p>
<p><img loading="lazy" decoding="async" src="https://observix-static.azureedge.net/guest-posts/2026/11/06-yellowpagecity-com/leads-vs-booked-jobs-sent-back-to-ads-1200w.jpg" alt="Hand-drawn bars showing 40 leads and 25 booked jobs, with a dotted arrow sending the booked jobs back to ads" width="1200" height="670" /></p>
<p>The simple version is a spreadsheet and a weekly upload. When jobs close across a CRM, a booking tool and the phone, a marketing attribution platform such as the one at <a href="https://observix.ai/">observix.ai</a> connects the ad accounts, website and CRM and sends verified conversions back to the ad platforms.</p>
<p>For the spreadsheet route, Google Ads Help on offline conversions says to save the click ID, the gclid, with each lead. Add a hidden gclid field to your form so it lands in your job list next to the name and phone. Auto tagging must be on, and you should wait 4 to 6 hours after creating the import action before the first upload. Jobs uploaded more than 90 days after the click are not accepted, so upload weekly.</p>
<h2><strong>How to test your tracking in 30 minutes</strong></h2>
<h3>1. Connect Tag Assistant (5 minutes)</h3>
<p>Go to tagassistant.google.com, click Add domain, enter your site and click Connect. Your site opens in a debug window, and Tag Assistant lists each tag as you click around.</p>
<h3>2. Send a test form (5 minutes)</h3>
<p>Fill in your own form with the name Test Lead. The conversion tag should fire once on the thank you page. If it fires twice, you are double counting.</p>
<h3>3. Check the phone snippet (5 minutes)</h3>
<p>You will see your normal number, because you did not come from an ad. Check instead that the snippet is on every page that shows your number, including the footer and the contact page.</p>
<h3>4. Open Meta Test events (10 minutes)</h3>
<p>Meta's developer docs place the tool at Events Manager, Data Sources, your pixel, Test Events. Open your site from there, send the form again, and check that a Lead event appears, not only PageView.</p>
<h3>5. Clean up (5 minutes)</h3>
<p>Delete every Test Lead from your job list, so it never gets uploaded as a booked job.</p>
<h2><strong>Common questions</strong></h2>
<h3>Should page views count as conversions in Google Ads?</h3>
<p>No. A page view is interest, not a lead. If it is primary, bidding will chase cheap visits, so set it to secondary or remove it.</p>
<h3>Should I use the Google tag or import GA4 key events?</h3>
<p>If GA4 already tracks your forms well, import them. Use the Google tag if you do not use GA4. Never make both primary for the same form.</p>
<h3>What Meta pixel event should I use for a lead form?</h3>
<p>Lead. Use Schedule for a booked appointment and Contact for a tap on your phone number or chat button.</p>
<h3>Why do Google Ads and GA4 show different conversion numbers?</h3>
<p>Google Ads counts only conversions that follow an ad interaction inside the window. GA4 counts visitors from every channel. Some gap is normal.</p>
<p>Pick one lead form today, make it the only primary action with Count: One, and run the 30 minute test. Once that number matches your inbox for two weeks, add calls, then bookings.</p>
<p>The post <a href="https://www.teachmemicro.com/website-conversion-tracking-how-to-set-it-up-for-a-local-business/">Website Conversion Tracking: How to Set It Up for a Local Business</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Interfacing Industrial Sensors With a Microcontroller: 4–20 mA, PNP/NPN and IO-Link Basics</title>
		<link>https://www.teachmemicro.com/interfacing-industrial-sensors-with-a-microcontroller-4-20-ma-pnp-npn-and-io-link-basics/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Mon, 02 Nov 2026 01:08:37 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13246</guid>

					<description><![CDATA[<p>Tutorial projects usually meet sensors in their friendliest form: a DHT22 on a breakout board, 3.3 V in, clean digital out. Industrial sensors play by different rules — 24 V supplies, current-loop signalling, and outputs designed to survive electrically noisy cabinets. The good news is that the interface circuits are simple once you know what &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/interfacing-industrial-sensors-with-a-microcontroller-4-20-ma-pnp-npn-and-io-link-basics/">Interfacing Industrial Sensors With a Microcontroller: 4–20 mA, PNP/NPN and IO-Link Basics</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Tutorial projects usually meet sensors in their friendliest form: a DHT22 on a breakout board, 3.3 V in, clean digital out. Industrial sensors play by different rules — 24 V supplies, current-loop signalling, and outputs designed to survive electrically noisy cabinets. The good news is that the interface circuits are simple once you know what the sensor is actually doing. This guide covers the three cases you will meet first.</p>
<p><span id="more-13246"></span></p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Case 1: The 4–20 mA current loop</strong></h2>
<p>The 4–20 mA loop is the workhorse of process instrumentation (pressure, temperature, level, flow) because current does not drop over long cable runs and a broken wire is detectable: 4 mA means "zero reading", 0 mA means "fault".</p>
<p>To read it with a microcontroller ADC, pass the loop current through a precision shunt resistor and measure the voltage:</p>
<table>
<thead>
<tr>
<th scope="col">Loop current</th>
<th scope="col">Voltage across 250 Ω shunt</th>
<th scope="col">Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>4 mA</td>
<td>1.0 V</td>
<td>Zero / minimum reading</td>
</tr>
<tr>
<td>12 mA</td>
<td>3.0 V</td>
<td>Mid-scale</td>
</tr>
<tr>
<td>20 mA</td>
<td>5.0 V</td>
<td>Full scale</td>
</tr>
<tr>
<td>0 mA</td>
<td>0 V</td>
<td>Wire break or sensor fault</td>
</tr>
</tbody>
</table>
<p><img data-dominant-color="f4f6f7" data-has-transparency="false" style="--dominant-color: #f4f6f7;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13247 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a3eab13.92081903.avif" alt="" width="1240" height="640" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a3eab13.92081903.avif 1240w, https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a3eab13.92081903-300x155.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a3eab13.92081903-1024x529.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a3eab13.92081903-768x396.avif 768w" sizes="auto, (max-width: 1240px) 100vw, 1240px" /></p>
<p>A 250 Ω, 0.1% resistor converts the loop to a 1–5 V signal. Two practical notes:</p>
<ul>
<li>If your ADC is 3.3 V only, use a 165 Ω shunt instead (0.66–3.3 V) and scale in software.</li>
<li>Most loop transmitters are powered <em>from</em> the loop (2-wire devices). Your interface must supply the 24 V loop power and respect the transmitter's minimum voltage after the shunt drop.</li>
</ul>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Case 2: PNP and NPN discrete outputs</strong></h2>
<p>Proximity, photoelectric and level sensors in 3-wire DC form switch either the positive rail (PNP, "sourcing") or ground (NPN, "sinking"):</p>
<ul>
<li><strong>PNP output</strong> gives you ~24 V when active. Feed a microcontroller pin through a voltage divider (e.g. 10 kΩ / 2.2 kΩ) or, better in a noisy cabinet, an optocoupler.</li>
<li><strong>NPN output</strong> pulls the line to ground when active. Use a pull-up to your logic rail (with an optocoupler if you want isolation) and read it as active-low.</li>
</ul>
<p><img data-dominant-color="f0f3f4" data-has-transparency="false" style="--dominant-color: #f0f3f4;" loading="lazy" decoding="async" class="aligncenter size-full wp-image-13248 not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a4183c3.06728124.avif" alt="" width="1240" height="640" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a4183c3.06728124.avif 1240w, https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a4183c3.06728124-300x155.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a4183c3.06728124-1024x529.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/11/6ae6473a4183c3.06728124-768x396.avif 768w" sizes="auto, (max-width: 1240px) 100vw, 1240px" /></p>
<p>The mistake to avoid: connecting a 24 V sensor output "temporarily" to a 5 V-tolerant pin to see if it works. It works exactly once. A PC817 optocoupler, a series resistor sized for the sensor's output current, and a transistor output stage cost cents and make the interface boring — which is what you want.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Case 3: IO-Link, the digital upgrade</strong></h2>
<p>IO-Link (IEC 61131-9) runs over the same 3 wires as a standard sensor but adds a digital channel: the sensor reports its measured value plus diagnostics (device ID, temperature warnings, signal quality). From the microcontroller side you do not bit-bang it — you use an IO-Link master IC or a ready master module and talk to it over SPI or UART. Choose it when you are designing something new; for retrofits, the analogue and discrete interfaces above are what the installed base speaks.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>A note on replacement parts</strong></h2>
<p>Prototypes and repairs run into one recurring problem: the sensor on the machine is discontinued, and its modern successor has a different output or connector. Before redesigning the interface, check whether the original model is still obtainable — industrial parts catalogues such as <a href="https://indprt.com">INDPRT</a> list current and discontinued sensors by exact model number, which is how the installed base is actually identified. Match the designation character for character; on industrial labels the suffix usually encodes the output type (PNP versus NPN) or the connection style, and "almost the same model" is a different sensor.</p>
<div class="clear"></div><div style="margin-top:20px; margin-bottom:20px;" class="divider divider-solid"></div>
<h2><strong>Summary</strong></h2>
<ul>
<li>4–20 mA → shunt resistor, measure voltage, treat 0 mA as a fault, not a reading.</li>
<li>PNP/NPN → divide or opto-isolate down to logic level; never feed 24 V to a GPIO.</li>
<li>IO-Link → use a master IC; it is a protocol, not a voltage.</li>
<li>Replacements → identify by exact designation first, redesign second.</li>
</ul>
<p>The post <a href="https://www.teachmemicro.com/interfacing-industrial-sensors-with-a-microcontroller-4-20-ma-pnp-npn-and-io-link-basics/">Interfacing Industrial Sensors With a Microcontroller: 4–20 mA, PNP/NPN and IO-Link Basics</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LattePanda Sigma 2 Launches with 180 TOPS AI Performance and RP2350 GPIO</title>
		<link>https://www.teachmemicro.com/lattepanda-sigma-2-launches-with-180-tops-ai-performance-and-rp2350-gpio/</link>
		
		<dc:creator><![CDATA[Roland Pelayo]]></dc:creator>
		<pubDate>Sun, 25 Oct 2026 03:08:06 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<guid isPermaLink="false">https://www.teachmemicro.com/?p=13220</guid>

					<description><![CDATA[<p>LattePanda has launched the Sigma 2, an x86 single-board computer designed for running AI models locally. The new board combines an Intel Core Ultra X7 358H processor, Intel Arc B390 graphics, and an RP2350 microcontroller in a 146 × 102 mm form factor. Announced on October 22, 2026, the Sigma 2 targets developers building autonomous &#8230;</p>
<p>The post <a href="https://www.teachmemicro.com/lattepanda-sigma-2-launches-with-180-tops-ai-performance-and-rp2350-gpio/">LattePanda Sigma 2 Launches with 180 TOPS AI Performance and RP2350 GPIO</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>LattePanda has launched the <strong>Sigma 2</strong>, an x86 single-board computer designed for running AI models locally. The new board combines an Intel Core Ultra X7 358H processor, Intel Arc B390 graphics, and an RP2350 microcontroller in a 146 × 102 mm form factor.</p>
<p>Announced on October 22, 2026, the Sigma 2 targets developers building autonomous robots, industrial equipment, computer vision systems, and private AI servers. It offers up to 180 TOPS of combined peak AI performance, 64GB of LPDDR5X memory, and multiple high-speed expansion interfaces.</p>
<p>Unlike a conventional mini-PC, the Sigma 2 also provides programmable GPIO through its onboard microcontroller. Developers can therefore run AI inference and interact with external electronics from the same board.</p>
<p><span id="more-13220"></span></p>
<h2><img data-dominant-color="c3c4c4" data-has-transparency="false" style="--dominant-color: #c3c4c4;" loading="lazy" decoding="async" class="aligncenter wp-image-13225 size-full not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-2-e1792897471567.avif" alt="" width="1233" height="902" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-2-e1792897471567.avif 1233w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-2-e1792897471567-300x219.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-2-e1792897471567-1024x749.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-2-e1792897471567-768x562.avif 768w" sizes="auto, (max-width: 1233px) 100vw, 1233px" /></h2>
<h2><strong>Intel Core Ultra X7 358H Powers Local AI Processing</strong></h2>
<p>At the center of the Sigma 2 is Intel's Core Ultra X7 358H processor. It has 16 CPU cores, consisting of four performance cores, eight efficiency cores, and four low-power efficiency cores, with a maximum clock speed of 4.8 GHz.</p>
<p>The processor also integrates an Intel Arc B390 GPU with 12 Xe-cores and an NPU dedicated to AI acceleration.</p>
<p>According to LattePanda, the three processing components provide the following peak INT8 performance:</p>
<table>
<tbody>
<tr>
<th>Processing unit</th>
<th>Peak AI performance</th>
</tr>
<tr>
<td>Intel Arc B390 GPU</td>
<td>122 TOPS</td>
</tr>
<tr>
<td>Intel NPU</td>
<td>50 TOPS</td>
</tr>
<tr>
<td>CPU</td>
<td>8 TOPS</td>
</tr>
<tr>
<td><strong>Combined peak</strong></td>
<td><strong>180 TOPS</strong></td>
</tr>
</tbody>
</table>
<p>These figures represent theoretical peak computing capability across the different processing units. They should not be interpreted as the performance available to a single AI model, since actual inference speed depends on the model, framework, memory usage, and execution hardware.</p>
<p>The Sigma 2 includes 64GB of dual-channel LPDDR5X-8533 memory, providing a theoretical bandwidth of 136.5 GB/s. Up to 59GB of system memory can be allocated to the integrated GPU.</p>
<p>This shared-memory architecture allows larger quantized models to run without requiring a separate graphics card with equivalent dedicated VRAM. LattePanda says the board can accommodate 35-billion-parameter-class mixture-of-experts (MoE) models, although real-world performance will depend on the selected model and quantization method.</p>
<p>For developers working with local language models, the additional memory capacity may be particularly useful when running AI agents, retrieval-augmented generation systems, or applications that need to process long conversations.</p>
<h2><strong>RP2350 Microcontroller Adds Hardware Control</strong></h2>
<p>One of the Sigma 2's more interesting features for embedded developers is its integrated RP2350 microcontroller.</p>
<p>While the Intel processor handles operating-system tasks and AI inference, the RP2350 can manage lower-level hardware operations independently. It provides GPIO interfaces for connecting sensors, switches, actuators, and other electronic components.</p>
<p>The microcontroller supports common embedded interfaces, including I2C, SPI, UART, and analog inputs. It also comes with MicroPython firmware preloaded, allowing developers to begin writing hardware-control applications without setting up a separate development environment.</p>
<p>Consider a vision-based sorting system. The Intel processor could run an object-detection model to identify items passing through a camera's field of view. The RP2350 could then read position sensors and control the actuators responsible for sorting those items.</p>
<p>Separating high-level computing from hardware control can also help prevent operating-system scheduling delays from affecting time-sensitive GPIO operations.</p>
<p>This combination makes the Sigma 2 more than a compact AI server. It provides a platform for projects that need substantial computing power alongside direct interaction with physical hardware.</p>
<p><img data-dominant-color="cdcecd" data-has-transparency="false" style="--dominant-color: #cdcecd;" loading="lazy" decoding="async" class="aligncenter wp-image-13222 size-full not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-1-e1792897534179.avif" alt="" width="1290" height="995" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-1-e1792897534179.avif 1290w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-1-e1792897534179-300x231.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-1-e1792897534179-1024x790.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-1-e1792897534179-768x592.avif 768w" sizes="auto, (max-width: 1290px) 100vw, 1290px" /></p>
<h2><strong>High-Speed Networking and Expansion</strong></h2>
<p>The Sigma 2 provides several expansion options for developers who need additional storage, networking, or computing hardware.</p>
<p>It includes three M.2 M-Key slots for NVMe storage and compatible accelerator modules, plus an M.2 E-Key slot for wireless connectivity. The M-Key interfaces support PCIe 5.0 x2, PCIe 4.0 x4, and PCIe 4.0 x1, respectively.</p>
<p>An OCuLink connector exposes PCIe 4.0 x2 for external devices, while two Thunderbolt 4 ports provide additional high-speed connectivity. External graphics docks and AI accelerators can expand the system's capabilities, although developers should account for the bandwidth limits of each interface.</p>
<p>Networking is handled by two 10Gb Ethernet ports. These are useful for applications involving large datasets, network-attached storage, and high-bandwidth camera or sensor systems.</p>
<p>For conventional peripherals and displays, the board provides two USB 3.2 Gen 2 ports, two USB 2.0 ports, HDMI 2.1, DisplayPort 2.1 through USB-C, and an embedded DisplayPort interface.</p>
<p>It also includes an RS-232/485 header, making it suitable for integration with equipment that uses industrial serial communication.</p>
<p>The board measures 146 × 102 mm, allowing it to fit inside relatively compact enclosures despite its extensive connectivity.</p>
<p><img data-dominant-color="ababab" data-has-transparency="false" style="--dominant-color: #ababab;" loading="lazy" decoding="async" class="aligncenter wp-image-13221 size-full not-transparent" src="https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-3-e1792897600883.avif" alt="" width="1600" height="1238" srcset="https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-3-e1792897600883.avif 1600w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-3-e1792897600883-300x232.avif 300w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-3-e1792897600883-1024x792.avif 1024w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-3-e1792897600883-768x594.avif 768w, https://www.teachmemicro.com/wp-content/uploads/2026/10/Sigma-2_Photo-3-e1792897600883-1536x1188.avif 1536w" sizes="auto, (max-width: 1600px) 100vw, 1600px" /></p>
<h2><strong>Software Support and Local AI Development</strong></h2>
<p>The Sigma 2 supports Windows 11 and Ubuntu 24.04 LTS or later.</p>
<p>The available configuration includes a 1TB NVMe SSD with Ubuntu preinstalled. According to LattePanda, the supplied software environment also includes GPU and NPU drivers, OpenVINO Model Server, OpenClaw, and local AI models.</p>
<p>Developers can use AI frameworks such as Intel OpenVINO, Ollama, and llama.cpp to build applications that perform inference on the device.</p>
<p>For instance, OpenVINO provides acceleration options for supported models using Intel processing hardware. Ollama and llama.cpp provide other approaches to running language models locally.</p>
<p>Keeping inference on the device can reduce dependence on external cloud services, particularly in systems where internet connectivity is limited or data must remain within a local network.</p>
<p>However, developers still need to evaluate model compatibility, inference speed, and power consumption for their intended applications.</p>
<h2><strong>Applications Beyond AI Development</strong></h2>
<p>The Sigma 2's combination of computing performance and hardware interfaces makes it suitable for several types of embedded systems.</p>
<p>In autonomous robots, the board could handle camera processing, object recognition, and navigation calculations while the RP2350 manages sensor inputs and actuator-control signals.</p>
<p>For industrial monitoring, its dual 10Gb Ethernet connections and local AI processing capabilities could support equipment that collects large amounts of sensor data and analyzes it without sending everything to the cloud.</p>
<p>The same hardware could also serve as a private AI server for running language models, document-processing systems, or automation agents within a local network.</p>
<p>Developers building measurement instruments may find the combination of high-speed processing, serial interfaces, and GPIO useful when connecting custom electronics to data-processing software.</p>
<p>Of course, these capabilities come with higher cost and power requirements than a typical microcontroller board. The Sigma 2 is better suited to applications that genuinely need x86 computing performance, substantial memory, and local AI acceleration.</p>
<h2><strong>LattePanda Sigma 2 Pricing and Availability</strong></h2>
<p>The LattePanda Sigma 2 is available for pre-order at <strong>$2,599</strong>, with promotional pricing scheduled to continue through mid-November 2026. After the pre-sale period, the listed price will increase to $2,799.</p>
<p>The advertised configuration includes the Intel Core Ultra X7 358H processor, 64GB LPDDR5X RAM, and a 1TB NVMe SSD.</p>
<p>For system integration, developers should also consider power and thermal requirements. LattePanda specifies a 15–20V DC supply rated for at least 120W, or a compatible 20V USB-C Power Delivery supply rated for at least 100W. The specified operating temperature range is 0–40°C.</p>
<p>At this price, the Sigma 2 is clearly aimed at professional development, specialized computing, and embedded AI applications rather than entry-level electronics projects.</p>
<p>Its main advantage is the ability to combine local AI processing, extensive expansion, high-speed networking, and microcontroller-based hardware control on a single platform.</p>
<p>More information is available through the <a href="https://www.lattepanda.com/lattepanda-sigma-2">official LattePanda Sigma 2 product page</a> and <a href="https://docs.lattepanda.com/content/sigma2_edition/specification/">technical documentation</a>.</p>
<p>The board can also be ordered through <a href="https://www.dfrobot.com/product-3164.html?marketing=prlpsigma2teachmicro">DFRobot's LattePanda Sigma 2 product listing</a>.</p>
<p><em>Editor's note: This article is based on the manufacturer's launch information and published technical specifications. TeachMeMicro has not independently tested the Sigma 2 or verified its AI performance claims.</em></p>
<p>The post <a href="https://www.teachmemicro.com/lattepanda-sigma-2-launches-with-180-tops-ai-performance-and-rp2350-gpio/">LattePanda Sigma 2 Launches with 180 TOPS AI Performance and RP2350 GPIO</a> appeared first on <a href="https://www.teachmemicro.com">Teach Me Microcontrollers!</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: www.teachmemicro.com @ 2026-11-06 11:00:42 by W3 Total Cache
-->