<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: fluidwire</title>
    <description>The latest articles on DEV Community by fluidwire (@fluidwire).</description>
    <link>https://dev.to/fluidwire</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3967842%2F5829d021-3550-4119-a8d1-cc439023d244.png</url>
      <title>DEV Community: fluidwire</title>
      <link>https://dev.to/fluidwire</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fluidwire"/>
    <language>en</language>
    <item>
      <title>SPI: The Embedded Bus With No Official Spec</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Sat, 26 Sep 2026 21:16:18 +0000</pubDate>
      <link>https://dev.to/fluidwire/spi-the-embedded-bus-with-no-official-spec-1gk9</link>
      <guid>https://dev.to/fluidwire/spi-the-embedded-bus-with-no-official-spec-1gk9</guid>
      <description>&lt;p&gt;Open almost any embedded project today -- an ESP32 reading a temperature sensor, an Arduino driving a small display, a data logger writing to an SD card -- and you will find SPI wiring it all together. It is one of the most widely used interfaces in embedded systems and IoT hardware. It is also, officially, not a standard at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where SPI came from
&lt;/h2&gt;

&lt;p&gt;SPI (Serial Peripheral Interface) traces back to Motorola in the mid-1980s, where engineers needed a simple, fast way for a microcontroller to talk to peripheral chips -- shift registers, ADCs, EEPROMs, and later displays and sensors -- without the overhead of a more complex bus. It first became widely known through Motorola's 68HC11 microcontroller family, which built SPI hardware directly into the chip and documented it in application notes and datasheets.&lt;/p&gt;

&lt;p&gt;That is the key detail: Motorola documented SPI well enough for engineers to implement it, but never submitted it to a standards body for ratification. There is no SPI specification maintained by an IEEE working group, no formal document with a version number that vendors are required to conform to. Compare that to I2C, which Philips (now NXP) formally specified and continues to publish and update, or USB, which is governed by the USB Implementers Forum. SPI has none of that. It became universal purely because it was simple enough to implement in silicon cheaply, fast enough for most peripheral communication, and useful enough that chipmaker after chipmaker copied the idea into their own parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "no official spec" actually costs you
&lt;/h2&gt;

&lt;p&gt;For most day-to-day embedded work, this is invisible -- until it isn't. Because there was never a governing document, the details that a real specification would pin down were left to each vendor to decide independently, and they did not always decide the same way. Clock polarity and clock phase, commonly called SPI "modes" 0 through 3, describe whether data is sampled on a rising or falling clock edge and whether the clock idles high or low. A sensor that expects mode 0 and a microcontroller driver defaulting to mode 3 will produce garbled or silent output, and the failure looks electrical -- a wiring or noise problem -- long before it looks like a software configuration mismatch.&lt;/p&gt;

&lt;p&gt;Chip-select behavior varies just as much. Most SPI peripherals use an active-low select line, but not all, and there is no universal rule for how multiple devices share a bus: separate chip-select lines per device is common, but some parts expect daisy-chaining instead. Word size, bit ordering (MSB-first versus LSB-first), and maximum clock speed are all left to the datasheet of whatever chip you happen to be wiring up. Two chips can both correctly claim to speak "SPI" and still fail to talk to each other until every one of these parameters is matched by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical lesson for IoT and embedded engineering
&lt;/h2&gt;

&lt;p&gt;This is a useful case study in how de facto standards behave differently from formal ones. Modbus and I2C were each published as documented specifications that other vendors could implement against with confidence. SPI spread the opposite way -- through sheer adoption, with the actual behavior defined by whatever a given chip's datasheet says, not by a shared rulebook. Both paths can produce a standard that lasts decades, but only one of them requires reading the datasheet every single time.&lt;/p&gt;

&lt;p&gt;For engineers building embedded products or IoT devices -- whether it is a university thesis prototype in the Philippines wiring an ESP32 to an off-the-shelf sensor breakout, or a production PCB design integrating a dozen SPI peripherals -- the practical takeaway is simple: never assume "SPI" alone means two parts will interoperate. Check the mode, the idle clock state, the bit order, and the chip-select convention in the datasheet before you power anything on. It is one of the most common sources of "it should just work" debugging sessions in embedded firmware, and it exists precisely because SPI never had an official spec to standardize those details in the first place.&lt;/p&gt;

&lt;p&gt;If you are debugging a stubborn SPI interface, choosing between SPI, I2C, or another bus for a new design, or need help getting a PCB and firmware from prototype to production, &lt;a href="https://fluidwire.com/contact" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt; -- protocol-level embedded debugging and hardware bring-up is part of the &lt;a href="https://fluidwire.com/services" rel="noopener noreferrer"&gt;IoT and embedded development work&lt;/a&gt; we do at Fluidwire.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>embedded</category>
      <category>electronics</category>
      <category>hardware</category>
    </item>
    <item>
      <title>Why Byte Order Is Named After Gulliver's Travels</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Fri, 25 Sep 2026 21:12:18 +0000</pubDate>
      <link>https://dev.to/fluidwire/why-byte-order-is-named-after-gullivers-travels-pp6</link>
      <guid>https://dev.to/fluidwire/why-byte-order-is-named-after-gullivers-travels-pp6</guid>
      <description>&lt;p&gt;Every multi-byte number a computer stores has to answer a small, unglamorous question: which byte comes first? The value &lt;code&gt;0x1234&lt;/code&gt; is two bytes, &lt;code&gt;0x12&lt;/code&gt; and &lt;code&gt;0x34&lt;/code&gt;, and a machine has to put one of them at the lower memory address. There is no physically correct answer. Different processor families picked different conventions, and the terms we use for the two choices come from a joke about eggs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lilliputians went to war over which end of an egg to crack
&lt;/h2&gt;

&lt;p&gt;In 1980, engineer Danny Cohen was working on network protocol design and needed a way to talk precisely about byte ordering without describing it from scratch every time. He borrowed a pair of terms from Jonathan Swift's 1726 satire &lt;em&gt;Gulliver's Travels&lt;/em&gt;, in a short paper called "On Holy Wars and a Plea for Peace." In the book, the tiny island of Lilliput is split by a bitter, decades-long conflict over which end of a boiled egg is correct to crack: the big end or the little end. Swift meant it as a jab at pointless religious and political wars fought over trivial distinctions. Cohen meant it as a joke about processor architects doing exactly the same thing over byte order, and it worked a little too well: the names stuck permanently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Big-endian&lt;/strong&gt; stores the most significant byte at the lowest memory address, the way you would naturally write the number down: &lt;code&gt;0x12&lt;/code&gt; then &lt;code&gt;0x34&lt;/code&gt;. &lt;strong&gt;Little-endian&lt;/strong&gt; stores the least significant byte first: &lt;code&gt;0x34&lt;/code&gt; then &lt;code&gt;0x12&lt;/code&gt;. Neither is more correct. Motorola's 68000 family and, historically, IBM mainframes went big-endian. Intel's x86 line went little-endian, which is why it is the default most developers meet first. Many modern ARM cores, including the Cortex-M chips inside a huge share of today's microcontrollers, are technically bi-endian and can be configured either way, though little-endian is the overwhelmingly common default in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a naming joke turns into a real bug
&lt;/h2&gt;

&lt;p&gt;This would be pure trivia if byte order stayed inside one chip. It does not. The moment two systems exchange multi-byte data — over a network, over a serial bus, or across a memory-mapped register — both sides have to agree on the order, and nothing enforces that agreement automatically.&lt;/p&gt;

&lt;p&gt;The clearest example is networking itself. RFC 1700 fixed big-endian as "network byte order" for TCP/IP decades ago, which is why C's &lt;code&gt;htons()&lt;/code&gt; and &lt;code&gt;ntohs()&lt;/code&gt; functions exist at all: they convert a little-endian host's numbers into network byte order before sending, and back again on receipt. Skip that conversion on a little-endian host and a port number or IP address field silently becomes a different number — not an error, just wrong, which is a much harder class of bug to catch.&lt;/p&gt;

&lt;p&gt;Embedded and IoT development hits the same failure mode constantly, just with sensors instead of sockets. A lot of common I2C and SPI peripherals — accelerometers, pressure sensors, ADCs — document their raw output registers as big-endian, because the datasheet author's convention or the sensor's internal DSP core dictated it, while the microcontroller reading them (an ESP32, an STM32, most anything built around Cortex-M) is little-endian. Read two register bytes in the wrong order and a real, sane pressure or temperature value turns into a value that is off by orders of magnitude, or wraps to something absurd. Because the read itself succeeds — no I2C NACK, no SPI error, no fault the debugger flags — it looks like a sensor problem or a wiring problem, and teams spend hours reseating connectors and re-checking pull-up resistors before someone thinks to print the raw bytes and notices they are reversed. The fix is a one-line byte swap once you know to look for it: the expensive part is not knowing.&lt;/p&gt;

&lt;p&gt;This is worth building into review habits rather than relearning per project. Any time firmware reads a multi-byte field across a boundary it does not fully control — a sensor register, a radio payload, a file format, a config blob shared with another device — check the datasheet or spec for its byte order explicitly, and do not assume it matches your MCU's native order just because everything compiled and nothing crashed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The etymology outlived the hardware debate
&lt;/h2&gt;

&lt;p&gt;The "holy war" framing turned out to be apt in one more way: which endianness is &lt;em&gt;better&lt;/em&gt; was argued for years and never settled, because there is no universally correct answer — big-endian reads naturally in a hex dump, little-endian makes certain arithmetic operations marginally cheaper in hardware, and both claims are true and both are minor. What did settle, permanently, was the vocabulary. Forty-five years after a paper that was partly a joke, "big-endian" and "little-endian" are the standard technical terms in every processor manual, every network RFC, and every sensor datasheet — a rare case of satire becoming the official name for the thing it was mocking.&lt;/p&gt;

&lt;p&gt;If your team is bringing up a new sensor, radio module, or cross-platform data format and the numbers coming back look scrambled rather than simply wrong, byte order is worth checking before anything else. Fluidwire works on exactly this layer of embedded and IoT development — from firmware and PCB bring-up through the cloud services devices talk to — for teams building connected hardware in the Philippines and beyond. If you are debugging a similar mismatch or planning a new device from scratch, &lt;a href="https://fluidwire.com/contact" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt; or take a look at our &lt;a href="https://fluidwire.com/services" rel="noopener noreferrer"&gt;embedded and IoT development services&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>embedded</category>
      <category>iot</category>
      <category>electronics</category>
      <category>programming</category>
    </item>
    <item>
      <title>Modbus: Why a 1979 Protocol Still Runs Industrial IoT</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Thu, 24 Sep 2026 21:14:43 +0000</pubDate>
      <link>https://dev.to/fluidwire/modbus-why-a-1979-protocol-still-runs-industrial-iot-16cb</link>
      <guid>https://dev.to/fluidwire/modbus-why-a-1979-protocol-still-runs-industrial-iot-16cb</guid>
      <description>&lt;p&gt;Walk into almost any factory, water treatment plant, or power substation and, somewhere underneath the modern dashboards and cloud connections, you will find a protocol older than most of the engineers maintaining it. Modbus was published in 1979, and instead of fading out like most technology from that era, it has become the closest thing industrial IoT has to a universal language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Modbus came from
&lt;/h2&gt;

&lt;p&gt;Modbus was created by Modicon, the company that had built the first programmable logic controller (PLC), the Modicon 084, a decade earlier in 1968. PLCs from different manufacturers could not talk to each other, and even different product lines from the same vendor often used incompatible, proprietary communication schemes. Modicon designed Modbus as a simple, well-documented request-response protocol for its own PLCs to exchange data with sensors, actuators, and other controllers over a serial line.&lt;/p&gt;

&lt;p&gt;The decision that mattered more than the protocol's technical design was what Modicon did next: it published the specification openly, with no licensing fee and no requirement to buy Modicon hardware to implement it. In an industry used to proprietary, vendor-locked communication schemes, that openness was unusual, and it is the single biggest reason Modbus is still around 45 years later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an open, simple protocol outlasted its competitors
&lt;/h2&gt;

&lt;p&gt;Modbus works on a master-slave (today more commonly called client-server) model. A controller asks a device for data at a specific register address, or writes a value to one, using a short, fixed set of function codes: read coils, read registers, write single register, write multiple registers, and a handful of others. There is no encryption, no service discovery, no complex handshake. That simplicity meant a manufacturer could implement Modbus support in a sensor, drive, or meter with minimal firmware and minimal engineering cost, and be confident it would talk to control systems from other vendors.&lt;/p&gt;

&lt;p&gt;Because the specification was open and free, competing PLC and automation vendors adopted it too, rather than trying to displace it with something proprietary. Once enough of an industry standardizes on a shared protocol, the cost of replacing it stops being about the protocol's technical merits and starts being about the sheer number of installed devices, trained technicians, and existing wiring that would need to change. Modbus reached that critical mass decades ago, in factories, building automation, solar and battery installations, and utility SCADA systems, and it has stayed there since.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modbus RTU and Modbus TCP
&lt;/h2&gt;

&lt;p&gt;The original Modbus ran over serial links (RS-232 and later RS-485) using a binary framing format called Modbus RTU, which is still common on the factory floor for connecting drives, meters, and I/O modules along a single twisted pair. As Ethernet became standard in industrial environments, Modbus TCP wrapped the same request-response messages in a TCP/IP packet instead of a serial frame, letting the same simple protocol run over the same network as everything else in a plant, including the gateways and edge devices that now forward that data to cloud platforms. A great deal of what looks like "smart factory" or industrial IoT infrastructure today is, underneath, a Modbus TCP gateway translating decades-old register reads into an MQTT topic or a REST API call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The IoT and embedded lesson
&lt;/h2&gt;

&lt;p&gt;For anyone designing embedded systems or connected devices today, Modbus is a useful case study in protocol design. It did not win because it was the most capable or the most secure option available in 1979 — by modern standards it has neither authentication nor encryption built in, which is exactly why Modbus TCP deployments need to sit behind a properly segmented network or a secure gateway rather than being exposed directly. It won because it was open, simple enough to implement cheaply, and good enough for the job, and because that openness let an entire industry standardize around it instead of fragmenting into incompatible proprietary schemes. Firmware and protocol choices made on a project today, including in Philippines-based manufacturing and process industries adopting industrial IoT retrofits, often outlive the original hardware, the original team, and sometimes the original company, in exactly the way Modbus has.&lt;/p&gt;

&lt;p&gt;If you're specifying a communication protocol for a new embedded product, or trying to get an old PLC or sensor talking to a modern IoT platform, &lt;a href="https://fluidwire.com/contact" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt; — bridging legacy industrial protocols like Modbus with modern cloud and IoT systems is a core part of the &lt;a href="https://fluidwire.com/services" rel="noopener noreferrer"&gt;IoT and embedded development work&lt;/a&gt; we do at Fluidwire.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>embedded</category>
      <category>hardware</category>
      <category>electronics</category>
    </item>
    <item>
      <title>CAN Bus History: Why Bosch Invented It in 1986</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Wed, 23 Sep 2026 21:03:22 +0000</pubDate>
      <link>https://dev.to/fluidwire/can-bus-history-why-bosch-invented-it-in-1986-38nk</link>
      <guid>https://dev.to/fluidwire/can-bus-history-why-bosch-invented-it-in-1986-38nk</guid>
      <description>&lt;p&gt;A modern car carries dozens of small computers: one for the engine, one for the brakes, others for the airbags, windows, dashboard and climate control. They constantly need to share information. The reason they can do it without a wiring harness the size of a tree trunk goes back to a protocol Bosch presented in 1986: the Controller Area Network, better known as CAN bus.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wiring problem Bosch set out to solve
&lt;/h2&gt;

&lt;p&gt;By the early 1980s, cars were gaining electronic control units (ECUs) quickly, and each new feature tended to bring its own point-to-point wires. Every extra connection added copper, weight, cost and another connector that could corrode or fail. Bosch began work on a shared serial bus in 1983. In February 1986 it presented the Controller Area Network at the SAE Congress in Detroit.&lt;/p&gt;

&lt;p&gt;The idea was simple to describe and hard to engineer: put every ECU on one shared twisted pair of wires and let them all talk, reliably, in a vehicle full of electrical noise from ignition systems, motors and alternators.&lt;/p&gt;

&lt;p&gt;Semiconductor makers followed quickly, with the first CAN controller chips from Intel and Philips arriving in 1987. The first production car built around CAN was the 1991 Mercedes-Benz S-Class (W140), and the protocol was standardised internationally as ISO 11898 in 1993.&lt;/p&gt;

&lt;h2&gt;
  
  
  How CAN bus arbitration works
&lt;/h2&gt;

&lt;p&gt;The feature that made CAN last is how it decides who gets to talk. On most shared buses, if two devices transmit at the same moment, both messages are corrupted and both have to back off and try again. CAN avoids that with &lt;strong&gt;non-destructive bitwise arbitration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every message starts with an identifier. On the wire, a 0 bit is "dominant" and a 1 bit is "recessive": if any node drives a 0, the whole bus reads 0. While transmitting its identifier, each node listens to the bus at the same time. The moment a node sends a 1 but reads back a 0, it knows a higher-priority message is on the wire, stops sending, and waits to retry.&lt;/p&gt;

&lt;p&gt;The result is that the message with the &lt;strong&gt;lowest identifier always wins&lt;/strong&gt;, and it goes through intact with no delay. Nothing is lost and no bandwidth is wasted on collisions. Priority is built into the physics of the bus, which is exactly what you want when a brake message and a seat-heater message happen to start at the same instant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Differential signalling and built-in error handling
&lt;/h2&gt;

&lt;p&gt;CAN uses two wires, CAN_H and CAN_L, driven as a differential pair and terminated with a 120-ohm resistor at each end of the bus. Noise that hits both wires equally cancels out, because the receiver only looks at the difference between them. That is why CAN copes so well near motors, relays and long cable runs.&lt;/p&gt;

&lt;p&gt;The protocol also has error detection built in: a CRC on every frame, acknowledgement bits, bit stuffing checks, and fault confinement that eventually takes a misbehaving node off the bus so one bad board cannot bring down the whole network. Classic CAN runs at up to 1 Mbit/s with up to 8 data bytes per frame; the newer CAN FD, introduced by Bosch in 2012, allows up to 64 bytes and faster data phases.&lt;/p&gt;

&lt;h2&gt;
  
  
  CAN bus beyond cars: industrial IoT and embedded systems
&lt;/h2&gt;

&lt;p&gt;CAN escaped the car decades ago. You will find it in agricultural and construction machinery, elevators, medical devices, marine electronics, robots and factory automation, often through higher-level protocols such as CANopen and J1939. In the US, CAN has been mandatory on the OBD-II diagnostic port of new cars since the 2008 model year, which is why a cheap OBD-II dongle can read live engine data.&lt;/p&gt;

&lt;p&gt;For IoT development, CAN is closer than many people think. The ESP32 includes a CAN-compatible controller (Espressif calls it TWAI), and pairing it with a small transceiver such as the SN65HVD230 is enough to put a Wi-Fi-connected microcontroller on a CAN network. That opens up projects like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fleet telematics&lt;/strong&gt;: reading vehicle data and forwarding it to a cloud dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Industrial monitoring&lt;/strong&gt;: bridging machines on a CAN network to MQTT for remote alerts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robotics and motor control&lt;/strong&gt;: coordinating multiple motor drivers over one noise-resistant bus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thesis prototypes&lt;/strong&gt;: engineering students in the Philippines building vehicle, e-trike or solar-charge monitoring systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Designing a CAN-connected device
&lt;/h2&gt;

&lt;p&gt;Getting CAN right is mostly about the physical layer and the firmware. Terminate both ends of the bus and only the ends. Keep stubs short. Use twisted pair. Pick a sensible identifier scheme, since your ID choices are also your priority choices. In firmware, handle bus-off recovery and filter incoming IDs in hardware so the microcontroller is not flooded with frames it does not need.&lt;/p&gt;

&lt;p&gt;If you are planning a device that has to live on a CAN network, or bridge one to the cloud, Fluidwire can help with the &lt;a href="https://fluidwire.com/services" rel="noopener noreferrer"&gt;PCB design, firmware and IoT development services&lt;/a&gt; needed to take it from prototype to production. &lt;a href="https://fluidwire.com/contact" rel="noopener noreferrer"&gt;Tell us about your project&lt;/a&gt; and we will help you scope it.&lt;/p&gt;

&lt;p&gt;Forty years after Bosch showed it in Detroit, the same two-wire idea is still quietly deciding, bit by bit, which message gets to speak first.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>embedded</category>
      <category>hardware</category>
      <category>electronics</category>
    </item>
    <item>
      <title>Hamming Code: How Weekend Crashes Invented Error Correction</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Tue, 22 Sep 2026 21:04:24 +0000</pubDate>
      <link>https://dev.to/fluidwire/hamming-code-how-weekend-crashes-invented-error-correction-n9e</link>
      <guid>https://dev.to/fluidwire/hamming-code-how-weekend-crashes-invented-error-correction-n9e</guid>
      <description>&lt;p&gt;Every time your laptop reads RAM, an ESP32 pulls a firmware image off flash, or a LoRa sensor packet survives a noisy rooftop in Quezon City, some form of error correction is quietly fixing bits that arrived wrong. The idea behind all of it started with one engineer, one unreliable machine, and a string of ruined weekends.&lt;/p&gt;

&lt;h2&gt;
  
  
  A relay computer that gave up on weekends
&lt;/h2&gt;

&lt;p&gt;In the late 1940s, Richard Hamming was a mathematician at Bell Labs. He had access to one of the lab's electromechanical relay computers, but only for low-priority work, which in practice meant jobs that ran unattended over the weekend.&lt;/p&gt;

&lt;p&gt;The machine could already detect certain errors. Its input and internal checks would notice when something did not add up. During the week, an operator would see the alarm, fix the problem and restart the job. On weekends, with nobody watching, the machine did the only thing it was designed to do: it dropped the failed job and moved to the next one in the queue.&lt;/p&gt;

&lt;p&gt;Hamming would come in on Monday to find his work abandoned. After this happened more than once, he asked the question that changed computing: if a machine can tell that an error happened, why can it not work out &lt;em&gt;where&lt;/em&gt; it happened and fix it?&lt;/p&gt;

&lt;p&gt;His answer was published in 1950 in the &lt;em&gt;Bell System Technical Journal&lt;/em&gt; as "Error Detecting and Error Correcting Codes." It is one of the founding papers of coding theory, and it is a large part of why Hamming later received the Turing Award.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a Hamming code finds the flipped bit
&lt;/h2&gt;

&lt;p&gt;Simple parity was already well known. Add one extra bit so the total number of 1s is even, and if a single bit flips, the count comes out odd. That tells you &lt;em&gt;something&lt;/em&gt; went wrong, but not what.&lt;/p&gt;

&lt;p&gt;Hamming's trick was to use several parity bits, each covering a different, overlapping subset of the data. The classic version is &lt;strong&gt;Hamming(7,4)&lt;/strong&gt;: 4 data bits plus 3 check bits, 7 bits total.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The check bits sit at positions 1, 2 and 4 (the powers of two).&lt;/li&gt;
&lt;li&gt;Each check bit covers every position whose binary number has that bit set.&lt;/li&gt;
&lt;li&gt;When a word is read back, you recompute the three checks. The pattern of which ones fail, read as a binary number, &lt;em&gt;is the position of the flipped bit&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If check bits 1 and 4 fail but 2 passes, that is binary 101, position 5. Flip bit 5 back and the data is correct. No retransmission, no human, no lost weekend.&lt;/p&gt;

&lt;p&gt;Three extra bits to protect four is expensive, but the overhead drops fast as words get longer. Add one more overall parity bit and you get &lt;strong&gt;SECDED&lt;/strong&gt;: single-error correction, double-error detection. That extended form is the basis of classic ECC memory, where 64 data bits travel with 8 check bits and a server can shrug off a bit flipped by a cosmic ray.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where error correction shows up in IoT and embedded systems
&lt;/h2&gt;

&lt;p&gt;Hamming codes themselves are the simplest member of a large family, but the thinking runs through almost every layer of a connected device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flash storage.&lt;/strong&gt; NAND flash wears out and leaks charge over time, so bit errors are expected, not exceptional. Controllers use stronger descendants such as BCH and LDPC codes, but the principle is Hamming's: store extra check bits and repair on read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wireless links.&lt;/strong&gt; LoRa lets you pick a coding rate from 4/5 to 4/8, literally trading airtime for redundancy so packets survive interference and distance. Wi-Fi, Bluetooth and cellular all use forward error correction for the same reason. In the Philippines, where devices often sit in humid enclosures, on rooftops or at the edge of coverage, that margin is the difference between a sensor that reports and one that goes silent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firmware and OTA updates.&lt;/strong&gt; CRCs and hashes do not correct errors, but they apply the detection half of the same idea: never boot an image you cannot verify. A good OTA design checks before it switches partitions, and keeps the old image when the check fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Harsh environments.&lt;/strong&gt; Industrial and automotive microcontrollers increasingly ship with ECC on internal SRAM and flash, because electrical noise, heat and radiation all flip bits in the field that never flip on the bench.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson for anyone building devices
&lt;/h2&gt;

&lt;p&gt;Hamming did not make the relay computer more reliable. He accepted that it would fail and designed around the failure. That is still the right mindset for IoT: assume bits will flip, links will drop and power will sag, then build detection and recovery into the hardware, firmware and protocol from the start.&lt;/p&gt;

&lt;p&gt;If you are building a connected product, thesis prototype or sensor network and want that reliability designed in rather than debugged in the field, &lt;a href="https://fluidwire.com/contact" rel="noopener noreferrer"&gt;talk to our engineers&lt;/a&gt; or look at our &lt;a href="https://fluidwire.com/services" rel="noopener noreferrer"&gt;IoT and embedded development services&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fluidwire.com/blog/hamming-code-how-error-correction-was-invented/" rel="noopener noreferrer"&gt;fluidwire.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>embedded</category>
      <category>iot</category>
      <category>electronics</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why Wire Gauge Numbers Run Backwards (12 AWG Is Thicker Than 24 AWG)</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Mon, 21 Sep 2026 21:08:30 +0000</pubDate>
      <link>https://dev.to/fluidwire/why-wire-gauge-numbers-run-backwards-12-awg-is-thicker-than-24-awg-30dd</link>
      <guid>https://dev.to/fluidwire/why-wire-gauge-numbers-run-backwards-12-awg-is-thicker-than-24-awg-30dd</guid>
      <description>&lt;p&gt;Every other measurement in electronics gets bigger as the thing gets bigger. Wire gauge does the opposite. A 12 AWG conductor is more than four times the cross-section of a 24 AWG one, and it carries the smaller number.&lt;/p&gt;

&lt;p&gt;This is not an oddity anyone designed on purpose. It is a manufacturing count that escaped into the spec sheets and never left.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number counts trips through a die
&lt;/h2&gt;

&lt;p&gt;Wire is not cast to size. It is drawn: a rod of copper is pulled through a hardened die with a hole slightly smaller than the rod, which squeezes the diameter down and stretches the length out. One pass only reduces the diameter by a modest fraction, so thin wire is made by repeating the operation through a series of progressively smaller dies.&lt;/p&gt;

&lt;p&gt;The gauge number is that repeat count. One draw gives you thick wire with a low number. Twenty-four draws give you something you can barely see, with a high number. The scale was never measuring the wire — it was tallying the process.&lt;/p&gt;

&lt;p&gt;Joseph R. Brown and Lucian Sharpe formalised the version still in use, publishing what became the American Wire Gauge (originally the Brown &amp;amp; Sharpe gauge) in 1857. Before that, every wire mill had its own gauge plate and its own numbers, so "number 10 wire" meant whatever your supplier said it meant. The standard mattered more than its logic, which is usually how these things survive.&lt;/p&gt;

&lt;h2&gt;
  
  
  It is a geometric scale, and that is the useful part
&lt;/h2&gt;

&lt;p&gt;AWG is not an arbitrary lookup table. It is a geometric progression, anchored at two points: 36 AWG is 0.005 inches in diameter, and 0000 (4/0) AWG is 0.46 inches. There are 39 steps between them, and 0.46 divided by 0.005 is 92, so each gauge step changes the diameter by the 39th root of 92 — about 1.123.&lt;/p&gt;

&lt;p&gt;That single ratio gives you three rules of thumb worth memorising, because they let you do wire sizing in your head:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Six gauges up, the diameter doubles.&lt;/strong&gt; 1.123 to the sixth power is 2.005.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three gauges up, the cross-sectional area doubles.&lt;/strong&gt; Area goes as the square of diameter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ten gauges up, the area changes by roughly ten times.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The area rule is the one that matters, because area is what sets resistance. Resistance sets voltage drop, and voltage drop and heat are what actually kill a design. Going from 24 AWG to 18 AWG is not a slight upgrade — it is four times the copper and a quarter of the resistance per metre.&lt;/p&gt;

&lt;p&gt;You also occasionally meet 0, 00, 000 and 0000 on thick welding and battery cable. Those exist because the scale ran out of room at the bottom: a wire thicker than "1" would need zero draws, then a negative number of them, so the convention piles on zeros instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this bites embedded and IoT work
&lt;/h2&gt;

&lt;p&gt;Wire gauge feels like an electrician's concern until a prototype starts misbehaving in ways the firmware cannot explain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brownouts blamed on software.&lt;/strong&gt; A standard breadboard jumper is 26 to 28 AWG, sometimes worse, with contact resistance at both ends on top. That is fine for signals. It is marginal for an ESP32 that pulls 300 to 500 mA in a Wi-Fi transmit burst. The rail sags, the brownout detector fires, the board resets, and an afternoon disappears into the firmware looking for a bug that is actually a wire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long sensor runs.&lt;/strong&gt; Voltage drop is current times resistance times twice the run length, because the current has to come back. A 50 metre run of 24 AWG to a remote sensor is not the same circuit as the 30 cm of it on your bench. This is a large part of why 4-20 mA current loops persist in industrial installations: a current loop is immune to the voltage drop that would corrupt a voltage signal over the same cable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Battery and motor leads.&lt;/strong&gt; Anything with an inrush — a pump, a solenoid, a motor, a big capacitor bank — asks for peak current the average figure hides. Size for the peak, not the datasheet's typical draw.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The PCB version of the same problem.&lt;/strong&gt; Copper on a board is specified by trace width and copper weight rather than gauge, but the physics is identical, and IPC-2221 exists to tell you how wide a trace has to be for a given current and acceptable temperature rise. On a 1 oz board, a power trace carrying an amp needs meaningfully more width than the 8 mil default your router happily gives every net.&lt;/p&gt;

&lt;p&gt;None of this appears in a simulation that assumes ideal conductors. It appears at bring-up, on a bench, at hour six. If you want that caught during design review rather than during deployment, &lt;a href="https://fluidwire.com/contact/" rel="noopener noreferrer"&gt;talk to us about your hardware&lt;/a&gt; — and our &lt;a href="https://fluidwire.com/services/" rel="noopener noreferrer"&gt;IoT and embedded engineering services&lt;/a&gt; cover the boring parts of this that decide whether a fleet survives its first year in the field.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wider habit
&lt;/h2&gt;

&lt;p&gt;The interesting thing about AWG is not the reversal. It is that a number describing a factory process became a number describing a product, and then outlived the process it was counting by a century and a half.&lt;/p&gt;

&lt;p&gt;Engineering is full of this. Baud rates that encode 1970s crystal divisors. Screen resolutions inherited from broadcast video. Protocol fields sized for links nobody runs any more. The units we work in are fossils of the constraints that made them, and reading them as literal descriptions of the present is a reliable way to be surprised.&lt;/p&gt;

&lt;p&gt;The wire does not know how many times it went through the die. Your design still has to.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>embedded</category>
      <category>hardware</category>
      <category>electronics</category>
    </item>
    <item>
      <title>Why Solder Melts Lower Than Tin or Lead</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Sun, 20 Sep 2026 21:13:13 +0000</pubDate>
      <link>https://dev.to/fluidwire/why-solder-melts-lower-than-tin-or-lead-2aj0</link>
      <guid>https://dev.to/fluidwire/why-solder-melts-lower-than-tin-or-lead-2aj0</guid>
      <description>&lt;p&gt;Here is a fact that sounds like it should be impossible: solder melts at a lower temperature than either of the metals it is made from.&lt;/p&gt;

&lt;p&gt;Pure tin melts at 232 °C. Pure lead melts at 327 °C. Mix them together at exactly 63 percent tin and 37 percent lead, and the resulting alloy melts at 183 °C — nearly fifty degrees below the lower of its two ingredients, and almost 150 degrees below the higher one.&lt;/p&gt;

&lt;p&gt;Mixing two metals does not average their properties. It produces a new one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The eutectic point
&lt;/h2&gt;

&lt;p&gt;That specific 63/37 ratio is called the &lt;strong&gt;eutectic composition&lt;/strong&gt;, from the Greek for "easily melted". Every tin-lead mixture melts somewhere below pure lead, but 63/37 is the single lowest point on the whole curve, and it has a second property that matters far more to anyone holding a soldering iron.&lt;/p&gt;

&lt;p&gt;Most alloys do not have a melting &lt;em&gt;point&lt;/em&gt;. They have a melting &lt;em&gt;range&lt;/em&gt;. Heat a 60/40 tin-lead mix and it starts going soft around 183 °C but is not fully liquid until about 190 °C. In between, it is neither — a slushy, grainy paste of solid crystals suspended in liquid metal. Metallurgists call this the plastic or pasty range.&lt;/p&gt;

&lt;p&gt;At the eutectic ratio, that range collapses to zero. The alloy goes from fully solid to fully liquid at one temperature, and back again the same way. There is no slush.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the slush is the enemy
&lt;/h2&gt;

&lt;p&gt;This is not a metallurgical curiosity. It is the difference between a joint that lasts twenty years and a joint that fails in the field.&lt;/p&gt;

&lt;p&gt;Consider what happens as a solder joint cools. With a pasty range, there is a window of several seconds where the metal is partly frozen and partly liquid. If the component or the board moves during that window — a bumped bench, a flexing panel, a vibrating conveyor — the crystals that have already formed get torn apart from each other as the rest solidifies around them. The result is a &lt;em&gt;disturbed joint&lt;/em&gt;: dull, grainy, often visibly crazed, and mechanically weak.&lt;/p&gt;

&lt;p&gt;Worse, it usually still conducts. It passes continuity checks. It works on the bench. Then thermal cycling in a deployed device gradually opens the microfractures, and eighteen months later a sensor node in a warehouse ceiling stops reporting for no reason anyone can reproduce.&lt;/p&gt;

&lt;p&gt;A eutectic joint cannot be disturbed this way, because there is no in-between state to disturb. It sets instantly and it sets crystalline. That sharp freeze is why 63/37 became the default for hand soldering and rework for decades, and why an experienced technician can tell a good joint from a bad one at a glance: a proper eutectic joint is shiny and smoothly concave.&lt;/p&gt;

&lt;h2&gt;
  
  
  What lead-free changed
&lt;/h2&gt;

&lt;p&gt;The EU's RoHS directive pushed most commercial electronics to lead-free solder in 2006, and the industry standard became SAC305 — 96.5 percent tin, 3 percent silver, 0.5 percent copper.&lt;/p&gt;

&lt;p&gt;SAC305 melts at about 217 °C, a full 34 degrees hotter than 63/37. It is also &lt;strong&gt;not&lt;/strong&gt; eutectic in practice: it has a plastic range of a few degrees, and it wets copper less eagerly than tin-lead does.&lt;/p&gt;

&lt;p&gt;Every one of those properties makes life harder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hotter iron tips, which means more thermal stress on components and a shorter window before you cook a plastic connector or lift a pad.&lt;/li&gt;
&lt;li&gt;A reflow profile with far less headroom, since the gap between "solder is liquid" and "the part is damaged" has narrowed.&lt;/li&gt;
&lt;li&gt;Joints that look dull and slightly rough even when they are perfect, so the old visual test for a bad joint no longer applies.&lt;/li&gt;
&lt;li&gt;Tin whiskers, a long-term reliability problem that the lead in tin-lead solder had quietly been suppressing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this makes lead-free wrong — the environmental and health case for getting lead out of the waste stream is real. But it explains why reflow oven profiles for modern connected devices are tuned so obsessively, and why plenty of prototyping benches still keep a spool of 63/37 next to the lead-free one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for IoT hardware
&lt;/h2&gt;

&lt;p&gt;IoT devices are deployed and forgotten. A gateway goes into a ceiling void, a sensor goes onto a machine frame, and nobody looks at either again until something stops working. They also live somewhere thermally unpleasant: outdoors, near motors, in equipment rooms that swing twenty degrees between day and night.&lt;/p&gt;

&lt;p&gt;Thermal cycling is exactly the load that finds weak solder joints. A device's uptime is decided partly by metallurgy, at the moment its joints froze, long before a single line of firmware runs.&lt;/p&gt;

&lt;p&gt;That is the argument for caring about assembly quality on a prototype and not just on a production run — the prototype is usually what ends up running in a pilot deployment for six months. Our &lt;a href="https://fluidwire.com/services/" rel="noopener noreferrer"&gt;approach to IoT hardware and firmware development&lt;/a&gt; treats board assembly and thermal profile as part of the design, not as a step that happens afterward.&lt;/p&gt;

&lt;p&gt;If you have a connected-device project where reliability in the field matters more than the demo, &lt;a href="https://fluidwire.com/contact/" rel="noopener noreferrer"&gt;talk to us about what you are building&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Fluidwire builds IoT hardware and web services, from PCB design to cloud dashboards.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>electronics</category>
      <category>iot</category>
      <category>embedded</category>
    </item>
    <item>
      <title>Why IoT Modems Still Use AT Commands From 1981</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Tue, 08 Sep 2026 21:13:43 +0000</pubDate>
      <link>https://dev.to/fluidwire/why-iot-modems-still-use-at-commands-from-1981-1mi9</link>
      <guid>https://dev.to/fluidwire/why-iot-modems-still-use-at-commands-from-1981-1mi9</guid>
      <description>&lt;p&gt;Open the datasheet for almost any cellular module shipping in 2026 -- a Quectel LTE Cat-M radio, a SIMCom NB-IoT modem, an ESP32 running the stock AT firmware -- and you will find the same thing on page one: a table of commands, every one of them beginning with the letters &lt;code&gt;AT&lt;/code&gt;. Type &lt;code&gt;AT&lt;/code&gt; into a serial terminal, hit enter, and the module answers &lt;code&gt;OK&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That handshake is older than the World Wide Web. It was designed in 1981, for a device that talked to a telephone line at 300 bits per second, and nobody has ever managed to replace it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem Dennis Hayes had to solve
&lt;/h2&gt;

&lt;p&gt;In 1981 Hayes Communications, founded by Dennis Hayes and Dale Heatherington, released the Smartmodem. Earlier modems were dumb peripherals: to place a call you physically dialled the phone yourself and dropped the handset into an acoustic coupler. The Smartmodem's selling point was in the name -- software on the computer could dial, answer, and hang up on its own.&lt;/p&gt;

&lt;p&gt;That created an awkward engineering problem. The computer had exactly one serial link to the modem, and that link was already carrying data. How does the modem know whether the bytes arriving on it are meant to be sent down the phone line, or are instructions meant for the modem itself?&lt;/p&gt;

&lt;p&gt;Hayes' answer was a mode switch plus a prefix. In command mode, every instruction begins with the two characters &lt;code&gt;AT&lt;/code&gt;, short for "attention". &lt;code&gt;ATDT5551234&lt;/code&gt; dialled a number using tone dialling. &lt;code&gt;ATH&lt;/code&gt; hung up. &lt;code&gt;ATA&lt;/code&gt; answered an incoming call. Once a connection was up, the modem flipped into data mode and passed bytes straight through -- and a carefully timed &lt;code&gt;+++&lt;/code&gt; escape sequence, guarded by a pause on either side so it could not be triggered by ordinary data, brought it back to command mode.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;AT&lt;/code&gt; prefix did double duty. Because the ASCII bit patterns for &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;T&lt;/code&gt; are distinctive, the modem could measure them and auto-detect the host's baud rate and parity from the first two characters of every command. The prefix was not decoration; it was a calibration signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it never got replaced
&lt;/h2&gt;

&lt;p&gt;Competitors cloned the Hayes command set almost immediately -- "Hayes compatible" became a checkbox on modem boxes throughout the 1980s and 90s -- and once the entire industry spoke it, the syntax stopped belonging to any one vendor. Standards bodies eventually caught up and wrote it down: the ITU-T formalised it as V.250 (originally published as V.25ter), and when mobile networks needed a control interface for GSM data, 3GPP simply extended the same grammar in TS 27.007 rather than inventing something new.&lt;/p&gt;

&lt;p&gt;That decision is why the pattern survived the jump from copper phone lines to cellular. A GSM module needed commands for things a 1981 modem never imagined -- SIM status, signal quality, network registration, SMS -- so the standard added them as extended commands with a &lt;code&gt;+&lt;/code&gt; after the prefix: &lt;code&gt;AT+CSQ&lt;/code&gt; for signal quality, &lt;code&gt;AT+CGATT?&lt;/code&gt; to ask whether the device is attached to the packet network, &lt;code&gt;AT+CMGS&lt;/code&gt; to send a text message. New capabilities, same envelope.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you build connected devices
&lt;/h2&gt;

&lt;p&gt;For anyone doing embedded systems or firmware work, the practical consequences are worth appreciating rather than just tolerating.&lt;/p&gt;

&lt;p&gt;The syntax is human-debuggable. When a device will not get on the network, you can open a serial terminal, type &lt;code&gt;AT+CREG?&lt;/code&gt; by hand, and read a plain-text answer. No packet capture, no proprietary tooling, no vendor SDK required. During bring-up on a new board, being able to talk directly to the radio is often the fastest way to work out whether a problem sits in the module, the antenna, the SIM, or your own code.&lt;/p&gt;

&lt;p&gt;The knowledge transfers. A developer who learned AT commands on a 2G module a decade ago is productive on an LTE Cat-1 module today, because roughly eighty percent of the command set is the same standardised core. That is unusual in hardware, where tooling normally churns every few years, and it is a genuine argument for choosing modules that expose a clean AT interface when you are planning a deployment meant to run for a decade.&lt;/p&gt;

&lt;p&gt;The tradeoff is real too. AT commands are line-oriented text over a serial link with no framing, no checksums, and vendor-specific quirks lurking at the edges of the standard. Parsing responses robustly -- handling unsolicited result codes that arrive mid-transaction, timeouts, modules that echo, modules that do not -- is a recurring source of bugs. Most production firmware ends up wrapping the interface in a small state machine rather than calling it directly, and it is worth budgeting time for that instead of discovering it late.&lt;/p&gt;

&lt;h2&gt;
  
  
  A pattern worth noticing
&lt;/h2&gt;

&lt;p&gt;The AT command set has outlived the acoustic coupler, the dial-up ISP, 2G, and 3G. It survived because it was simple enough to clone, text-based enough to debug, and extensible enough that each new generation of radio could bolt on what it needed without breaking what came before. Those are the same properties that make MQTT and HTTP durable, and they are worth keeping in mind whenever you design an interface that other people will have to live with.&lt;/p&gt;

&lt;p&gt;Fluidwire designs IoT hardware and the web services behind it, from silicon to cloud. If you are bringing up a cellular or Wi-Fi module and want a second pair of eyes on the firmware, &lt;a href="https://fluidwire.com/services/" rel="noopener noreferrer"&gt;have a look at what we do&lt;/a&gt; or &lt;a href="https://fluidwire.com/contact/" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>embedded</category>
      <category>hardware</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why CD Audio Is 44,100 Hz: It Came From Videotape</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Mon, 07 Sep 2026 21:14:01 +0000</pubDate>
      <link>https://dev.to/fluidwire/why-cd-audio-is-44100-hz-it-came-from-videotape-48n</link>
      <guid>https://dev.to/fluidwire/why-cd-audio-is-44100-hz-it-came-from-videotape-48n</guid>
      <description>&lt;p&gt;Open any audio file on your phone and there is a good chance it is sampled at 44,100 times per second. It is such a universal number that it feels like it must be derived from something fundamental about human hearing. It is not. The 44.1 kHz sample rate is an accident of videotape geometry, and the story is one of the cleanest illustrations we know of a rule that governs every embedded project: theory sets the floor, but the hardware you can actually get sets the number you ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  The floor: what Nyquist actually requires
&lt;/h2&gt;

&lt;p&gt;The Nyquist-Shannon sampling theorem says that to reconstruct a signal without aliasing you must sample at more than twice its highest frequency component. Human hearing tops out somewhere around 20 kHz, so the theoretical minimum is a little over 40 kHz.&lt;/p&gt;

&lt;p&gt;But "a little over" is doing real work in that sentence. A sampler needs an anti-aliasing low-pass filter in front of it to kill everything above half the sample rate, and analog filters do not have vertical walls. A brickwall filter that goes from full passband at 20 kHz to full stopband at 20.001 kHz does not exist. You need a transition band — some headroom between the top of your signal and the Nyquist frequency — so the filter has room to roll off.&lt;/p&gt;

&lt;p&gt;That is why 40 kHz was never a serious candidate and why the real answer lives somewhere in the low-to-mid 40s. Nyquist narrows the field. It does not pick the winner.&lt;/p&gt;

&lt;h2&gt;
  
  
  The medium: no hard drive was big enough
&lt;/h2&gt;

&lt;p&gt;Here is the constraint that actually decided it. In the late 1970s, when Sony and Philips were working toward what became the Compact Disc, there was no practical way to store a digital audio master. Stereo audio at CD quality is roughly 10 megabytes per minute. A full album is around 600 MB. Commercial hard drives at the time held a few tens of megabytes and cost more than a car.&lt;/p&gt;

&lt;p&gt;What did exist, in every recording studio and broadcast facility on earth, was videotape. A professional video recorder was already a high-bandwidth, reasonably reliable, mass-produced digital-ish transport — it just happened to expect a video signal on its input.&lt;/p&gt;

&lt;p&gt;So engineers built PCM adaptors: boxes that took digital audio samples and encoded them as a fake black-and-white video signal, a pattern of black and white blobs standing in for ones and zeros, which a standard U-matic videocassette recorder would happily record as if it were a picture. Sony's PCM-1600, introduced in 1978, is the canonical example. Play the tape back through the adaptor and you got your bits out again.&lt;/p&gt;

&lt;p&gt;This is a beautiful hack, and it is also how the sample rate got locked in. Once your storage medium is a video frame, your sample rate is no longer a free parameter. It is determined by how many samples you can fit into a scan line, multiplied by how many usable lines are in a field, multiplied by how many fields go by per second.&lt;/p&gt;

&lt;h2&gt;
  
  
  The arithmetic that made 44,100 inevitable
&lt;/h2&gt;

&lt;p&gt;The engineers settled on three samples per scan line as the density that packed reliably without errors. From there the numbers fall out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NTSC&lt;/strong&gt; (North America, Japan): 60 fields per second, about 245 usable scan lines per field, 3 samples per line.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;60 x 245 x 3 = 44,100&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PAL&lt;/strong&gt; (Europe): 50 fields per second, about 294 usable scan lines per field, 3 samples per line.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;50 x 294 x 3 = 44,100&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Two incompatible broadcast standards, developed independently on different continents for entirely unrelated reasons, converge on the exact same number. That coincidence is what makes 44,100 Hz more than an arbitrary choice — it was the one rate that let a studio in Tokyo and a studio in Hamburg exchange digital masters on tape without a rate conversion step. It also sat comfortably above the Nyquist floor with about 2 kHz of transition band for the anti-aliasing filter.&lt;/p&gt;

&lt;p&gt;Sony and Philips wrote it into the Compact Disc Red Book specification in 1980. Four decades later, long after U-matic decks became museum pieces, the number is still the default on your phone, in your browser, and in the &lt;code&gt;anullsrc&lt;/code&gt; default of every ffmpeg command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters when you are choosing an ADC sample rate
&lt;/h2&gt;

&lt;p&gt;We think about this story a lot when scoping IoT hardware, because the same shape of decision comes up on nearly every project.&lt;/p&gt;

&lt;p&gt;Say you are building a vibration monitor for industrial machinery. Nyquist tells you that if you care about a fault signature at 4 kHz you need to sample above 8 kHz. That is the floor. Then the real constraints arrive:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The clock you can divide down.&lt;/strong&gt; Most microcontroller ADCs derive their sample rate from a peripheral clock divided by an integer prescaler. If your crystal and PLL settings produce nice divisions at 10 kHz and 12.5 kHz but nothing sane at 11 kHz, you are picking from that menu, not from the number you wrote in the spec. The same logic that made 44,100 fall out of scan-line arithmetic makes your real sample rate fall out of the clock tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The transport.&lt;/strong&gt; How much of that data actually leaves the device? A sensor sampling at 20 kHz on a LoRaWAN link with a few hundred bytes per uplink is not going to stream raw samples anywhere. Either you do the FFT on-device and ship features instead of waveforms, or you drop the rate. The link budget is the modern equivalent of the videocassette.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Power.&lt;/strong&gt; Higher sample rates mean the ADC and the CPU stay awake longer per measurement window. On a battery-powered node with a multi-year target, the sample rate is a line item in the energy budget, not just a signal-processing parameter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage and cost.&lt;/strong&gt; Same as 1978, scaled down. Flash on an MCU is finite, and the difference between 8 kHz and 48 kHz is the difference between buffering ten seconds and buffering two.&lt;/p&gt;

&lt;p&gt;The pattern is identical to the CD story: the textbook gives you an inequality, and then the parts you can actually buy collapse that inequality into a single number. Engineers who only know the theory tend to over-specify and end up with a design that cannot ship. Engineers who only know the parts tend to under-specify and end up aliasing garbage into their data. The job is holding both.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson worth keeping
&lt;/h2&gt;

&lt;p&gt;The interesting thing about 44,100 Hz is not that it is arbitrary — it is that it is &lt;em&gt;not&lt;/em&gt; arbitrary. Every digit of it is a consequence of a real, physical constraint that mattered enormously in 1979 and stopped mattering entirely by about 1995. The constraint disappeared. The number stayed, because by then a hundred million CD players had been built around it.&lt;/p&gt;

&lt;p&gt;That is worth remembering when you are early in a hardware design and choosing a value that feels temporary. Sample rates, packet formats, register maps, and message schemas have a way of outliving the reason they exist. Pick them as if someone will still be living with them after the constraint that produced them is gone, because that is usually what happens.&lt;/p&gt;

&lt;p&gt;If you are working through those tradeoffs on a connected-device project — sensor selection, sample rates, on-device processing versus cloud, link budget — that is exactly the kind of problem our &lt;a href="https://fluidwire.com/services/" rel="noopener noreferrer"&gt;IoT and embedded services&lt;/a&gt; are built around. We work from schematic and PCB through firmware to the dashboard, so the sampling decision and the bandwidth decision get made in the same conversation instead of two months apart. &lt;a href="https://fluidwire.com/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt; and tell us what you are measuring.&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>embedded</category>
      <category>electronics</category>
      <category>iot</category>
    </item>
    <item>
      <title>Why a Kilobyte Is 1,024 Bytes, Not 1,000</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Sun, 06 Sep 2026 21:13:51 +0000</pubDate>
      <link>https://dev.to/fluidwire/why-a-kilobyte-is-1024-bytes-not-1000-48m5</link>
      <guid>https://dev.to/fluidwire/why-a-kilobyte-is-1024-bytes-not-1000-48m5</guid>
      <description>&lt;p&gt;Ask most people how many bytes are in a kilobyte and you will get 1,000. Ask a firmware engineer and you will get 1,024, followed by a sigh. Both answers are defensible, which is exactly the problem — and it is a problem that still costs real hours in embedded and IoT projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why memory landed on powers of two
&lt;/h2&gt;

&lt;p&gt;Computer memory is addressed in binary. A chip with 10 address lines can select 2^10 distinct locations, and 2^10 is 1,024. Add an address line and you double it: 2,048, 4,096, 8,192. Memory capacities do not arrive at round decimal numbers because nothing in the hardware produces round decimal numbers — the address decoder counts in twos, all the way down.&lt;/p&gt;

&lt;p&gt;So when engineers in the late 1950s and 1960s needed a shorthand for "1,024 bytes," they reached for the nearest thing at hand: the SI prefix &lt;em&gt;kilo&lt;/em&gt;, meaning 1,000. The error was only 2.4 percent, nobody was measuring anything to that precision, and the convention stuck hard enough that sixty years later it is still the default in every discussion about RAM.&lt;/p&gt;

&lt;p&gt;The trouble is that the error compounds. A megabyte at 2^20 is 1,048,576 — 4.9 percent off. A gigabyte at 2^30 is off by 7.4 percent. A terabyte at 2^40 is off by 10 percent. The bigger storage gets, the wider the gap between the two definitions grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 1998 fix almost nobody adopted
&lt;/h2&gt;

&lt;p&gt;In 1998 the International Electrotechnical Commission published binary prefixes to end the ambiguity: &lt;strong&gt;kibibyte (KiB) = 1,024 bytes&lt;/strong&gt;, &lt;strong&gt;mebibyte (MiB) = 1,048,576 bytes&lt;/strong&gt;, &lt;strong&gt;gibibyte (GiB)&lt;/strong&gt;, &lt;strong&gt;tebibyte (TiB)&lt;/strong&gt;, and so on. Under that scheme &lt;em&gt;kilobyte&lt;/em&gt; means exactly 1,000 bytes and &lt;em&gt;kibibyte&lt;/em&gt; means exactly 1,024, with no overlap.&lt;/p&gt;

&lt;p&gt;It is a clean solution. It is also, outside of standards documents and a handful of Linux tools, almost entirely ignored. Most datasheets, marketing pages, and engineers still say "KB" and leave you to infer which one they meant from context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the two definitions collide
&lt;/h2&gt;

&lt;p&gt;The most familiar collision happens on the desktop. Storage manufacturers sell in decimal, so a "1 TB" SSD contains 1,000,000,000,000 bytes. Windows reports capacity in binary units while still labelling them "GB," so it divides by 2^30 and shows roughly 931. No bytes went missing; two different definitions were applied to the same number. macOS sidestepped the complaint in 2009 by switching to decimal reporting, which is why the same drive reads differently on the two operating systems.&lt;/p&gt;

&lt;p&gt;In embedded work the collision is less cosmetic. Flash and RAM on a microcontroller are genuinely binary — always. When an ESP32 module is described as having 4 MB of flash, that is 4,194,304 bytes, not 4,000,000. The 194,304-byte difference is not a rounding curiosity; it is roughly the size of a small OTA staging slot.&lt;/p&gt;

&lt;p&gt;That matters the moment you write a partition table. Over-the-air update schemes typically need two application slots plus an NVS region and a filesystem partition, all of which have to fit inside real flash with alignment respected. Size those partitions with decimal arithmetic and the numbers will look fine in a spreadsheet, then fail at flash time — or worse, pass on the bench and fail on the first field update, when a device tries to stage an image that does not fit. Debugging that from a rooftop sensor node in Cebu is a genuinely bad afternoon.&lt;/p&gt;

&lt;p&gt;The same trap shows up in throughput budgeting. Cellular and LPWAN plans are usually sold in decimal megabytes, while your firmware counts payload buffers in binary. If your monthly data budget is calculated one way and your telemetry accounting the other, the 4.9 percent gap quietly eats your margin.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical rule
&lt;/h2&gt;

&lt;p&gt;Assume binary for anything inside the device — RAM, flash, buffers, partition tables, filesystem images. Assume decimal for anything sold to you by a vendor — drive capacity, data plans, network speeds. When you write the numbers down for someone else, write the actual byte count next to the unit. &lt;code&gt;4 MB (4,194,304 bytes)&lt;/code&gt; takes three seconds to type and removes the ambiguity permanently.&lt;/p&gt;

&lt;p&gt;It is a small discipline, and it is the kind of thing that separates firmware that survives its first OTA campaign from firmware that does not. If you are planning an IoT deployment and want the flash budget sized correctly before boards get ordered, &lt;a href="https://fluidwire.com/contact/" rel="noopener noreferrer"&gt;talk to us about your project&lt;/a&gt; — partition planning is part of how we approach &lt;a href="https://fluidwire.com/services/" rel="noopener noreferrer"&gt;embedded and IoT development&lt;/a&gt;, from silicon to cloud.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>embedded</category>
      <category>hardware</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why Enter Sends Two Characters, Not One</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Sat, 05 Sep 2026 21:13:59 +0000</pubDate>
      <link>https://dev.to/fluidwire/why-enter-sends-two-characters-not-one-4jei</link>
      <guid>https://dev.to/fluidwire/why-enter-sends-two-characters-not-one-4jei</guid>
      <description>&lt;p&gt;Press Enter in a text editor and, depending on the machine, you may have just written two characters into the file rather than one: carriage return (CR, &lt;code&gt;0x0D&lt;/code&gt;) followed by line feed (LF, &lt;code&gt;0x0A&lt;/code&gt;). Nothing about a modern screen requires two. The reason is a machine almost nobody has touched since the 1970s.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two mechanical jobs, two codes
&lt;/h2&gt;

&lt;p&gt;The Teletype Model 33, introduced in 1963, was the terminal that ASCII was designed around. It printed onto a paper roll with a print head that travelled along a carriage. Ending a line meant doing two physically distinct things: slide the carriage back to the left margin, and roll the paper up by one line. Those were separate mechanisms driven by separate solenoids, so ASCII gave them separate control codes. CR moved the carriage. LF advanced the paper.&lt;/p&gt;

&lt;p&gt;Keeping them separate was not an oversight — it was useful. Sending LF without CR gave you a new line at the current column, which is how you produced tables and indented output. Sending CR without LF re-printed over the line you had just typed, which is how early terminals did overstrike, bold, and underline. And the carriage return itself was slow: sliding a physical print head across the platen took longer than the time budgeted for one character at 110 baud, so software commonly padded the sequence with a NUL or two to give the mechanism time to finish before the next printable character arrived. Send LF first and the next line would begin printing mid-sweep, smeared across the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the split survived the hardware
&lt;/h2&gt;

&lt;p&gt;When operating systems moved off paper, each one picked a convention and froze it.&lt;/p&gt;

&lt;p&gt;Multics used LF alone as a line terminator; Unix inherited that decision, and so did Linux, BSD, and eventually macOS. CP/M kept the CR+LF pair because it was written for teletype-style hardware, MS-DOS copied CP/M, and Windows has carried CR+LF ever since. Classic Mac OS through Mac OS 9 went the third way and used CR alone. Three families, three answers, all still in circulation as file artefacts.&lt;/p&gt;

&lt;p&gt;The network protocols made the more consequential choice. HTTP, SMTP, FTP, and IRC all specify CR+LF as the line terminator in their grammars, and they still do. A protocol has to be unambiguous across every operating system that will ever speak it, so the specification names the exact octets rather than deferring to a local convention. Every HTTP header you have ever sent ended with two bytes chosen because of a printing mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that costs embedded teams an afternoon
&lt;/h2&gt;

&lt;p&gt;In IoT and embedded work, line endings stop being trivia and become a bug class. A few places it reliably bites:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AT commands.&lt;/strong&gt; Cellular and Wi-Fi modules — SIM7600, quectel modems, the classic ESP-AT firmware — parse commands terminated with CR+LF. Send &lt;code&gt;AT+CSQ&lt;/code&gt; with a bare newline and the module does not error, it simply does not answer, because as far as its parser is concerned the command has not ended yet. The symptom is a timeout, which sends people hunting for a wiring or baud-rate fault that is not there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Serial logs that print a staircase.&lt;/strong&gt; A device that emits only LF looks fine in most IDE serial monitors, because the monitor translates on your behalf. Open the same port in a raw terminal, or pipe it to a file and open it on a machine that does no translation, and every line starts where the last one ended — descending diagonally down the screen. The device is not broken; the terminal is doing exactly what LF means without an accompanying CR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invisible trailing bytes in config files.&lt;/strong&gt; A settings file, a CSV of calibration values, or a provisioning list edited on Windows and parsed on a Linux gateway carries a CR at the end of every line. String comparisons fail against values that look identical on screen. Numeric parsers may succeed, hiding the problem until a field that happens to be compared as text — a device ID, an MQTT topic, an API key — silently stops matching. This is worth a linter rule and a &lt;code&gt;.gitattributes&lt;/code&gt; entry rather than a debugging session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocol framing on a UART.&lt;/strong&gt; If your own device-to-device protocol delimits messages by newline, decide which bytes terminate a frame and write it in the spec, not in the reader's head. A parser that splits on LF and leaves the CR attached to the previous field will work perfectly against one sender and mysteriously fail against another.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical rule
&lt;/h2&gt;

&lt;p&gt;Be strict in what you send and lenient in what you accept. Emit CR+LF when talking to anything that specifies it — modems, HTTP, SMTP, most serial terminals — and when parsing, strip both characters from the end of every line regardless of which arrived. Two lines of defensive trimming at the edge of the firmware removes an entire category of field failure that is nearly impossible to see once the device is installed somewhere inconvenient.&lt;/p&gt;

&lt;p&gt;It is also a reasonable illustration of how embedded systems age. The Model 33 is a museum piece. Its carriage timing is still in your HTTP stack, your modem driver, and your serial console, because compatibility is cheaper to keep than to break — which is exactly why the odd corners of a protocol usually turn out to have a mechanical explanation rather than an arbitrary one.&lt;/p&gt;

&lt;p&gt;If you are building connected hardware and want the serial, protocol, and firmware layers to hold up in the field, &lt;a href="https://fluidwire.com/contact/" rel="noopener noreferrer"&gt;talk to us about your project&lt;/a&gt; or see &lt;a href="https://fluidwire.com/services/" rel="noopener noreferrer"&gt;what we build&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>embedded</category>
      <category>iot</category>
      <category>hardware</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why Resistors Have Color Bands, Not Numbers</title>
      <dc:creator>fluidwire</dc:creator>
      <pubDate>Fri, 04 Sep 2026 21:13:59 +0000</pubDate>
      <link>https://dev.to/fluidwire/why-resistors-have-color-bands-not-numbers-2mge</link>
      <guid>https://dev.to/fluidwire/why-resistors-have-color-bands-not-numbers-2mge</guid>
      <description>&lt;p&gt;Pick up any through-hole resistor and you are holding a solution to a labelling problem that most engineers never consciously notice. The component has no printed value on it. Instead it wears four or five colored stripes wrapped all the way around the body, encoding a number in a scheme you have to memorise or look up.&lt;/p&gt;

&lt;p&gt;It looks like an inconvenience. It is the opposite: it is a fix for two constraints that printed text could not survive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraint one: the part is too small to print on
&lt;/h2&gt;

&lt;p&gt;The color code dates to the era of carbon-composition resistors, standardised by the Radio Manufacturers Association in the 1920s and 30s as the industry moved from hand-built radio sets to volume manufacturing. A quarter-watt axial resistor has a body a few millimetres long and a couple of millimetres across, and the printing technology of the period could not put a legible multi-character value on a curved surface that small.&lt;/p&gt;

&lt;p&gt;Worse, whatever you did print had to survive the rest of the part's life: handling, insertion, solder flux, heat from the iron, decades sitting in a chassis. Ink on a curved ceramic-and-carbon body rubs off. Pigment fired into the coating as a band does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraint two: nobody controls which way up it goes
&lt;/h2&gt;

&lt;p&gt;This is the constraint people miss, and it is the more interesting one. An axial component has leads coming out of both ends and no defined orientation. An assembler — human or machine — grabs it off a reel or a tape strip and inserts it into two holes. There is no top. There is no front.&lt;/p&gt;

&lt;p&gt;If you print a value on one side of a cylinder, roughly half the parts on a finished board end up with the marking rotated away from you, face-down against the substrate, or twisted just far enough to be unreadable. On a board with two hundred resistors, that is a hundred components you cannot verify without desoldering something.&lt;/p&gt;

&lt;p&gt;A band solves this by wrapping the entire circumference. Rotation stops mattering. Whatever angle you view the part from, and however it landed in the holes, the full code is visible. The only thing you have to establish is which end to read from, and the convention handles that too: the bands are grouped toward one end, with a wider gap before the tolerance band, so the reading direction is unambiguous.&lt;/p&gt;

&lt;p&gt;That is a genuinely elegant piece of design. The marking is invariant under the one transformation the manufacturing process cannot constrain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The colors were not arbitrary either
&lt;/h2&gt;

&lt;p&gt;The digit assignments — black 0, brown 1, red 2, through to white 9 — run roughly in order of increasing brightness, which made them easier to learn and to distinguish under the poor lighting of a mid-century workshop. Gold and silver, sitting outside the digit sequence, took on the multiplier and tolerance roles precisely because they are metallic and could not be confused with a digit color.&lt;/p&gt;

&lt;p&gt;The scheme has aged imperfectly. It is hard to read under warm incandescent light, brutal on anyone with red-green color vision deficiency, and ambiguous on brown-bodied parts where a brown band can vanish into the body. Every experienced technician eventually stops trusting their eyes and reaches for a multimeter. The code was never meant to be the final authority — it was meant to be faster than the alternative, which was no marking at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then surface-mount undid the whole thing
&lt;/h2&gt;

&lt;p&gt;Here is the part that matters if you are designing hardware now rather than restoring a radio.&lt;/p&gt;

&lt;p&gt;Surface-mount resistors are too small for bands. An 0402 package is one millimetre by half a millimetre. There is no room for four stripes, and the part has a defined flat top face anyway because it is placed by machine, not inserted by hand — so the orientation constraint that motivated bands in the first place no longer exists.&lt;/p&gt;

&lt;p&gt;So the industry went back to printed numbers: three-digit and four-digit codes on larger packages, the EIA-96 three-character system on smaller ones, and on the smallest parts, nothing at all. A 0201 resistor is a bare rectangle. There is no marking scheme, because there is no surface.&lt;/p&gt;

&lt;p&gt;The consequence is that &lt;strong&gt;component identity has moved off the component and into the paperwork&lt;/strong&gt;. You cannot look at a populated board and read the values. You are trusting the reel label, the pick-and-place file, the BOM, and the discipline of whoever loaded the feeders.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means on a real build
&lt;/h2&gt;

&lt;p&gt;Every prototype shop learns this the same way. The most expensive hardware failures are usually not design errors — the schematic was fine, the layout was fine — but a 10k where a 1k should have been, placed by a machine that did exactly what the file told it to do, on a board where nothing looks wrong under a microscope.&lt;/p&gt;

&lt;p&gt;The practical defences are all process, not eyesight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep parts in labelled bags or on original reels. An unlabelled loose SMD resistor is scrap, because identifying it costs more than replacing it.&lt;/li&gt;
&lt;li&gt;Treat the BOM as the source of truth and version it alongside the schematic. A BOM that drifts from the design is a latent field failure.&lt;/li&gt;
&lt;li&gt;Measure critical values in-circuit during bring-up rather than assuming placement was correct — pull-ups, current-sense shunts, feedback dividers and anything setting a regulator output.&lt;/li&gt;
&lt;li&gt;Keep through-hole parts for jigs, test fixtures and prototype rework, where being able to read a value at a glance is still genuinely worth something.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 1920s solved this problem by making the part self-describing from every angle. Modern packaging traded that away for density, and handed the responsibility to your documentation instead. That is a reasonable trade — but only if you actually keep up your end of it.&lt;/p&gt;

&lt;p&gt;If you are building connected hardware and want the board, the firmware and the BOM to arrive as one coherent thing rather than three loosely related files, that is &lt;a href="https://fluidwire.com/services/" rel="noopener noreferrer"&gt;the kind of work we do&lt;/a&gt;. Fluidwire builds IoT, embedded and PCB prototypes out of Parañaque — &lt;a href="https://fluidwire.com/contact/" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt; if you have a project that needs to exist as real hardware.&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>electronics</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
