<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PCB Design |</title><link>https://creciunel.github.io/tags/pcb-design/</link><atom:link href="https://creciunel.github.io/tags/pcb-design/index.xml" rel="self" type="application/rss+xml"/><description>PCB Design</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 26 Oct 2023 12:00:00 +0300</lastBuildDate><image><url>https://creciunel.github.io/media/icon_hu_cbc7c08f5ace9ca7.png</url><title>PCB Design</title><link>https://creciunel.github.io/tags/pcb-design/</link></image><item><title>Temperature Controller</title><link>https://creciunel.github.io/projects/temperature-controller/</link><pubDate>Thu, 26 Oct 2023 12:00:00 +0300</pubDate><guid>https://creciunel.github.io/projects/temperature-controller/</guid><description>&lt;p&gt;Real-time temperature controller designed for industrial and laboratory applications. The system leverages the dual-core architecture of the &lt;strong&gt;ESP32&lt;/strong&gt; to separate deterministic PID regulation logic from the asynchronous communication stack.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-challenge-legacy--manual-thermal-oxidation"&gt;The Challenge: Legacy &amp;amp; Manual Thermal Oxidation&lt;/h2&gt;
&lt;p&gt;In semiconductor research, material synthesis requires strict thermal profiles. Initially, our laboratory used an open &lt;strong&gt;800W thermal reactor&lt;/strong&gt;. The system suffered from critical limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Manual Control:&lt;/strong&gt; Power regulation was handled via a manual autotransformer (LATR).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Closed-Loop Feedback:&lt;/strong&gt; Temperature tracking relied entirely on a basic digital multimeter with a thermocouple.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconsistency:&lt;/strong&gt; Human error and environmental fluctuations made it impossible to achieve repeatable ramp-up and soak times, directly degrading the crystalline quality of the synthesized nanostructures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The objective was to design a low-cost, automated, closed-loop PID controller capable of driving high-power heating elements while exposing a web interface for real-time monitoring and data logging.&lt;/p&gt;
&lt;div class="gallery-pro-wrapper my-12"&gt;
&lt;div class="flex items-center justify-between mb-4 px-1 border-b border-slate-200 dark:border-slate-800 pb-2"&gt;
&lt;span class="text-[10px] font-mono uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400"&gt;
Initial setup
&lt;/span&gt;
&lt;/div&gt;
&lt;div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6" id="gallery-0"&gt;
&lt;a data-fancybox="gallery-0" href="TermalReactor2.jpg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="TermalReactor2.jpg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-0" href="TermalReactor.jpg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="TermalReactor.jpg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-0" href="InitialTemperatureMasurment.jpg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="InitialTemperatureMasurment.jpg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.css" /&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.umd.js"&gt;&lt;/script&gt;
&lt;script&gt;
if (typeof Fancybox !== 'undefined') {
Fancybox.bind("[data-fancybox^='gallery-']", {
dragToClose: false,
Toolbar: {
display: {
left: ["infobar"],
middle: ["zoomIn", "zoomOut", "toggle1to1"],
right: ["slideshow", "fullscreen", "close"]
}
},
Images: {
Panzoom: { maxScale: 3 }
}
});
}
&lt;/script&gt;
&lt;hr&gt;
&lt;h2 id="hardware-evolution-from-breadboard-to-production"&gt;Hardware Evolution: From Breadboard to Production&lt;/h2&gt;
&lt;p&gt;The hardware went through an iterative engineering process to move from a risky laboratory prototype to an industrial-grade control board:&lt;/p&gt;
&lt;h3 id="1-proof-of-concept--prototyping"&gt;1. Proof of Concept &amp;amp; Prototyping&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prototypes No. 1 &amp;amp; 1B:&lt;/strong&gt; Built on perfboards (prototyping boards with pre-drilled holes) to validate the thermocouple conditioning circuit and the zero-crossing triac driver.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prototype No. 2 (Toner Transfer):&lt;/strong&gt; To reduce noise on the analog lines, a custom double-sided PCB layout was designed and etched in-house using the thermal toner transfer method.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="gallery-pro-wrapper my-12"&gt;
&lt;div class="flex items-center justify-between mb-4 px-1 border-b border-slate-200 dark:border-slate-800 pb-2"&gt;
&lt;span class="text-[10px] font-mono uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400"&gt;
Hardware Engineering &amp;amp; Layout
&lt;/span&gt;
&lt;/div&gt;
&lt;div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6" id="gallery-1"&gt;
&lt;a data-fancybox="gallery-1" href="PrototipeNr1A.jpg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="PrototipeNr1A.jpg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-1" href="prototipN1B.jpg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="prototipN1B.jpg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-1" href="PrototipeNr2LUTCuperLayer.jpg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="PrototipeNr2LUTCuperLayer.jpg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-1" href="PrototipeNr2.jpg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="PrototipeNr2.jpg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-1" href="PrototipeNr2display.jpg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="PrototipeNr2display.jpg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.css" /&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.umd.js"&gt;&lt;/script&gt;
&lt;script&gt;
if (typeof Fancybox !== 'undefined') {
Fancybox.bind("[data-fancybox^='gallery-']", {
dragToClose: false,
Toolbar: {
display: {
left: ["infobar"],
middle: ["zoomIn", "zoomOut", "toggle1to1"],
right: ["slideshow", "fullscreen", "close"]
}
},
Images: {
Panzoom: { maxScale: 3 }
}
});
}
&lt;/script&gt;
&lt;h3 id="2-industrial-grade-production-jlcpcb"&gt;2. Industrial Grade Production (JLCPCB)&lt;/h3&gt;
&lt;p&gt;The final iteration was optimized for mass manufacturing and professionally manufactured. The design incorporates galvanic isolation to decouple the high-voltage AC mains (driving the 800W load) from the low-voltage DC microcontroller section.&lt;/p&gt;
&lt;div class="gallery-pro-wrapper my-12"&gt;
&lt;div class="flex items-center justify-between mb-4 px-1 border-b border-slate-200 dark:border-slate-800 pb-2"&gt;
&lt;span class="text-[10px] font-mono uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400"&gt;
Hardware Engineering &amp;amp; Layout
&lt;/span&gt;
&lt;/div&gt;
&lt;div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6" id="gallery-2"&gt;
&lt;a data-fancybox="gallery-2" href="Schematic_termicControl-for-fabrication_2026-06-11.png" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="Schematic_termicControl-for-fabrication_2026-06-11.png" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-2" href="PCB_PCB_termicControl-copy_2026-06-11.png" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="PCB_PCB_termicControl-copy_2026-06-11.png" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-2" href="Photo-View_2026-06-11.svg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="Photo-View_2026-06-11.svg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.css" /&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.umd.js"&gt;&lt;/script&gt;
&lt;script&gt;
if (typeof Fancybox !== 'undefined') {
Fancybox.bind("[data-fancybox^='gallery-']", {
dragToClose: false,
Toolbar: {
display: {
left: ["infobar"],
middle: ["zoomIn", "zoomOut", "toggle1to1"],
right: ["slideshow", "fullscreen", "close"]
}
},
Images: {
Panzoom: { maxScale: 3 }
}
});
}
&lt;/script&gt;
&lt;hr&gt;
&lt;h2 id="firmware-architecture--web-ui"&gt;Firmware Architecture &amp;amp; Web UI&lt;/h2&gt;
&lt;p&gt;The firmware is built on top of &lt;strong&gt;FreeRTOS&lt;/strong&gt;, taking advantage of the ESP32&amp;rsquo;s dual-core processor to ensure that network latency never interferes with the critical timing of the control loop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core 0 (Control Loop):&lt;/strong&gt; Executes a high-priority, deterministic FreeRTOS task every 100ms to sample the thermocouple, update the custom-tuned PID algorithm, and adjust the PWM/Triac firing angle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core 1 (Communication Stack):&lt;/strong&gt; Hosts an &lt;code&gt;ESPAsyncWebServer&lt;/code&gt; that serves an interactive web interface. It utilizes WebSockets to stream live temperature data to the client and handles asynchronous HTTP requests for system configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="gallery-pro-wrapper my-12"&gt;
&lt;div class="flex items-center justify-between mb-4 px-1 border-b border-slate-200 dark:border-slate-800 pb-2"&gt;
&lt;span class="text-[10px] font-mono uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400"&gt;
System Interface and Data Visualization
&lt;/span&gt;
&lt;/div&gt;
&lt;div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6" id="gallery-3"&gt;
&lt;a data-fancybox="gallery-3" href="featured.jpg" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="featured.jpg" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-3" href="main%20windows.png" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="main%20windows.png" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-3" href="Setting_page.png" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="Setting_page.png" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;a data-fancybox="gallery-3" href="CSV%20page.png" class="group relative block overflow-hidden rounded-md border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm"&gt;
&lt;img src="CSV%20page.png" alt="Technical Visual" class="w-full h-auto block transition-all duration-300 group-hover:brightness-110"&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.css" /&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.umd.js"&gt;&lt;/script&gt;
&lt;script&gt;
if (typeof Fancybox !== 'undefined') {
Fancybox.bind("[data-fancybox^='gallery-']", {
dragToClose: false,
Toolbar: {
display: {
left: ["infobar"],
middle: ["zoomIn", "zoomOut", "toggle1to1"],
right: ["slideshow", "fullscreen", "close"]
}
},
Images: {
Panzoom: { maxScale: 3 }
}
});
}
&lt;/script&gt;
&lt;p&gt;Users can real-time monitor the current temperature graph, tune PID parameters ($K_p$, $K_i$, $K_d$) on the fly, and download complete experimental data logs directly as CSV files for analytical post-processing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="practical-application-zinc-oxide-zno-synthesis"&gt;Practical Application: Zinc Oxide (ZnO) Synthesis&lt;/h2&gt;
&lt;p&gt;In the field of semiconductor research, precise thermal control is critical for processes such as &lt;strong&gt;thermal oxidation&lt;/strong&gt;. Using the interactive simulator below, I have modeled the interaction between Zinc and Oxygen atoms under the influence of thermal energy regulated by our PID system.&lt;/p&gt;
&lt;div id="atomic-lab-container" class="my-8 p-4 rounded-xl border border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-950 shadow-inner"&gt;
&lt;div id="lab-controls" class="flex flex-wrap gap-2 mb-4 border-b border-slate-100 dark:border-slate-800 pb-3"&gt;
&lt;button onclick="addAtom('H')" class="px-3 py-1 bg-sky-100 dark:bg-sky-900 text-sky-700 dark:text-sky-200 rounded-md text-sm font-mono hover:bg-sky-200"&gt;Inject H&lt;/button&gt;
&lt;button onclick="addAtom('O')" class="px-3 py-1 bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-200 rounded-md text-sm font-mono hover:bg-red-200"&gt;Inject O&lt;/button&gt;
&lt;button onclick="addAtom('Zn')" class="px-3 py-1 bg-slate-200 dark:bg-slate-700 text-slate-700 dark:text-slate-200 rounded-md text-sm font-mono hover:bg-slate-300"&gt;Inject Zn&lt;/button&gt;
&lt;div class="flex-grow"&gt;&lt;/div&gt;
&lt;button onclick="clearChamber()" class="px-3 py-1 bg-amber-100 dark:bg-amber-950 text-amber-700 dark:text-amber-200 rounded-md text-sm font-mono"&gt;Clear&lt;/button&gt;
&lt;/div&gt;
&lt;canvas id="atomic-canvas" width="800" height="500" class="w-full h-auto bg-slate-50 dark:bg-slate-900 rounded-lg border border-slate-100 dark:border-slate-800"&gt;&lt;/canvas&gt;
&lt;div class="mt-4 flex items-center gap-4 border-t border-slate-100 dark:border-slate-800 pt-3"&gt;
&lt;label class="text-[10px] font-mono uppercase text-slate-500"&gt;Temp:&lt;/label&gt;
&lt;input type="range" id="temp-slider" min="0.1" max="5" step="0.1" value="1" class="flex-grow"&gt;
&lt;span id="temp-value" class="text-xs font-mono font-bold w-8 text-red-500"&gt;1x&lt;/span&gt;
&lt;/div&gt;
&lt;div class="mt-2 text-[10px] font-mono text-slate-400 text-right uppercase"&gt;
Particles: &lt;span id="atom-count"&gt;0&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
const canvas = document.getElementById('atomic-canvas');
if (!canvas) return;
const ctx = canvas.getContext('2d');
const atomCountDisplay = document.getElementById('atom-count');
const tempSlider = document.getElementById('temp-slider');
const tempValue = document.getElementById('temp-value');
let atoms = [];
let tempMultiplier = 1;
const elementData = {
'H': { mass: 1, radius: 8, color: '#7dd3fc', maxBonds: 1 },
'O': { mass: 16, radius: 14, color: '#f87171', maxBonds: 2 },
'Zn': { mass: 65, radius: 22, color: '#94a3b8', maxBonds: 1 }
};
class Atom {
constructor(type, x, y) {
const data = elementData[type];
this.type = type;
this.mass = data.mass;
this.radius = data.radius;
this.baseColor = data.color;
this.color = data.color;
this.maxBonds = data.maxBonds;
this.x = x || Math.random() * (canvas.width - this.radius * 2) + this.radius;
this.y = y || Math.random() * (canvas.height - this.radius * 2) + this.radius;
const speedFactor = type === 'H' ? 2 : 0.8;
this.vx = (Math.random() - 0.5) * speedFactor;
this.vy = (Math.random() - 0.5) * speedFactor;
this.bonds = [];
}
update() {
this.bonds.forEach(partner =&gt; {
const dx = partner.x - this.x;
const dy = partner.y - this.y;
const dist = Math.sqrt(dx*dx + dy*dy);
const targetDist = this.radius + partner.radius + 2;
if (dist &gt; targetDist) {
const springForce = 0.05 + (tempMultiplier * 0.01);
this.vx += (dx / dist) * springForce;
this.vy += (dy / dist) * springForce;
}
});
if (tempMultiplier &gt; 2.5) {
this.vx += (Math.random() - 0.5) * 0.3;
this.vy += (Math.random() - 0.5) * 0.3;
}
this.x += this.vx * tempMultiplier;
this.y += this.vy * tempMultiplier;
if (this.x + this.radius &gt; canvas.width || this.x - this.radius &lt; 0) this.vx *= -1;
if (this.y + this.radius &gt; canvas.height || this.y - this.radius &lt; 0) this.vy *= -1;
const damping = Math.min(0.99, 0.96 + (tempMultiplier * 0.01));
this.vx *= damping;
this.vy *= damping;
}
draw() {
this.bonds.forEach(partner =&gt; {
ctx.beginPath();
ctx.moveTo(this.x, this.y);
ctx.lineTo(partner.x, partner.y);
ctx.strokeStyle = "rgba(255,255,255,0.4)";
ctx.lineWidth = 2;
ctx.stroke();
});
ctx.beginPath();
ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
ctx.fillStyle = this.color;
ctx.fill();
ctx.fillStyle = '#ffffff';
ctx.font = `bold ${this.radius * 0.7}px monospace`;
ctx.textAlign = 'center';
ctx.fillText(this.type, this.x, this.y + this.radius/3);
}
}
function handleCollisions() {
const rawVal = parseFloat(tempSlider.value);
const currentCelsius = Math.round((rawVal - 0.1) * (2273 / 4.9) - 273);
for (let i = 0; i &lt; atoms.length; i++) {
for (let j = i + 1; j &lt; atoms.length; j++) {
const a1 = atoms[i], a2 = atoms[j];
const dx = a2.x - a1.x;
const dy = a2.y - a1.y;
const distance = Math.sqrt(dx * dx + dy * dy);
const minDistance = a1.radius + a2.radius;
const isBonded = a1.bonds.includes(a2);
if (isBonded) {
let shouldBreak = false;
if ((a1.type === 'H' || a2.type === 'H') &amp;&amp; currentCelsius &gt; 300) {
shouldBreak = true;
}
if ((a1.type === 'Zn' || a2.type === 'Zn') &amp;&amp; currentCelsius &gt; 1800) {
shouldBreak = true;
}
if (shouldBreak) {
a1.bonds = a1.bonds.filter(b =&gt; b !== a2);
a2.bonds = a2.bonds.filter(b =&gt; b !== a1);
a1.color = a1.baseColor;
a2.color = a2.baseColor;
const force = currentCelsius / 500;
a1.vx -= (dx / distance) * force;
a1.vy -= (dy / distance) * force;
continue;
}
}
if (!isBonded) {
if (currentCelsius &lt; 100 &amp;&amp; distance &lt; minDistance + 12) {
if ((a1.type === 'O' &amp;&amp; a2.type === 'H' &amp;&amp; a1.bonds.length &lt; 2 &amp;&amp; a2.bonds.length &lt; 1) ||
(a1.type === 'H' &amp;&amp; a2.type === 'O' &amp;&amp; a1.bonds.length &lt; 1 &amp;&amp; a2.bonds.length &lt; 2)) {
a1.bonds.push(a2);
a2.bonds.push(a1);
a1.color = "#38bdf8"; a2.color = "#38bdf8";
}
}
if (currentCelsius &gt; 400 &amp;&amp; currentCelsius &lt; 1800 &amp;&amp; distance &lt; minDistance + 12) {
if ((a1.type === 'Zn' &amp;&amp; a2.type === 'O' &amp;&amp; a1.bonds.length &lt; 1 &amp;&amp; a2.bonds.length &lt; 2) ||
(a1.type === 'O' &amp;&amp; a2.type === 'Zn' &amp;&amp; a1.bonds.length &lt; 2 &amp;&amp; a2.bonds.length &lt; 1)) {
a1.bonds.push(a2);
a2.bonds.push(a1);
a1.color = "#e2e8f0"; a2.color = "#e2e8f0";
}
}
}
if (distance &lt; minDistance &amp;&amp; !isBonded) {
const overlap = minDistance - distance;
const nx = dx / distance;
const ny = dy / distance;
a1.x -= nx * (overlap / 2); a1.y -= ny * (overlap / 2);
a2.x += nx * (overlap / 2); a2.y += ny * (overlap / 2);
const v1n = a1.vx * nx + a1.vy * ny;
const v2n = a2.vx * nx + a2.vy * ny;
const m1 = a1.mass, m2 = a2.mass;
const newV1n = (v1n * (m1 - m2) + 2 * m2 * v2n) / (m1 + m2);
const newV2n = (v2n * (m2 - m1) + 2 * m1 * v1n) / (m1 + m2);
a1.vx += (newV1n - v1n) * nx; a1.vy += (newV1n - v1n) * ny;
a2.vx += (newV2n - v2n) * nx; a2.vy += (newV2n - v2n) * ny;
}
}
}
}
window.addAtom = function(type) {
atoms.push(new Atom(type));
if(atomCountDisplay) atomCountDisplay.innerText = atoms.length;
};
window.clearChamber = function() {
atoms = [];
if(atomCountDisplay) atomCountDisplay.innerText = 0;
};
function updateTempDisplay(val) {
const celsius = Math.round((val - 0.1) * (2273 / 4.9) - 273);
tempValue.innerText = celsius + "°C";
}
tempSlider.addEventListener('input', (e) =&gt; {
const val = parseFloat(e.target.value);
tempMultiplier = Math.pow(val, 1.6);
updateTempDisplay(val);
});
function animate() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
handleCollisions();
atoms.forEach(atom =&gt; { atom.update(); atom.draw(); });
requestAnimationFrame(animate);
}
updateTempDisplay(1);
animate();
})();
&lt;/script&gt;
&lt;h3 id="the-mechanism-of-zinc-oxidation"&gt;The Mechanism of Zinc Oxidation&lt;/h3&gt;
&lt;p&gt;The oxidation of Zinc is a thermally activated process that depends on overcoming a specific &lt;strong&gt;activation energy barrier&lt;/strong&gt;. In the simulation above, you can observe this phenomenon by adjusting the temperature slider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agitation Phase:&lt;/strong&gt; At lower temperatures (below &lt;strong&gt;400°C&lt;/strong&gt;), the &lt;strong&gt;Zn&lt;/strong&gt; atoms (grey) and &lt;strong&gt;O&lt;/strong&gt; atoms (red) undergo elastic collisions, maintaining their individual chemical identities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activation Energy:&lt;/strong&gt; As the PID controller ramps up the temperature, the average kinetic energy of the particles increases according to the kinetic theory of gases:
$$E_k = \frac{3}{2}kT$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chemical Reaction:&lt;/strong&gt; Upon reaching the critical threshold, collisions become energetic enough to overcome electron shell repulsion, facilitating the formation of &lt;strong&gt;ZnO&lt;/strong&gt; (visualized as white-grey particles).&lt;/li&gt;
&lt;/ul&gt;
$$2Zn + O_2 \xrightarrow{\Delta T &gt; 400^\circ C} 2ZnO$$&lt;h3 id="importance-in-semiconductors"&gt;Importance in Semiconductors&lt;/h3&gt;
&lt;p&gt;Zinc oxide ($ZnO$) is a fundamental wide-bandgap building block for advanced electronic and optoelectronic nanostructures. By precisely controlling the temperature profile (&lt;strong&gt;Ramp-up&lt;/strong&gt; and &lt;strong&gt;Soak&lt;/strong&gt; times), we can directly influence the morphology and crystalline quality of the resulting $ZnO$.&lt;/p&gt;
&lt;p&gt;This project demonstrates why the thermal stability provided by the &lt;strong&gt;FreeRTOS + PID&lt;/strong&gt; algorithm is essential: even a minor fluctuation of a few degrees can halt the reaction or lead to incomplete oxidation, which would drastically alter the final electrical properties of the semiconductor.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="related-publications"&gt;Related Publications&lt;/h2&gt;
&lt;p&gt;The engineering outcomes and material characterization data resulting from this thermal control platform have been published in the following academic frameworks. You can explore the detailed research papers below:&lt;/p&gt;
&lt;h3 id="1-thermal-treatment-control-systems"&gt;1. Thermal Treatment Control Systems&lt;/h3&gt;
&lt;p&gt;Detailed analysis of the remote-controlled temperature setup and its application specifically optimized for Zinc foils oxidation.
&lt;/p&gt;
&lt;h3 id="2-physics-of-materials"&gt;2. Physics of Materials&lt;/h3&gt;
&lt;p&gt;Presentation of the optimized embedded solution designed to automate the thermal treatment process.
&lt;/p&gt;
&lt;h3 id="3-porous-gallium-oxide-nanostructures"&gt;3. Porous Gallium Oxide Nanostructures&lt;/h3&gt;
&lt;p&gt;Expansion of the thermal oxidation methodology applied to other wide-bandgap semiconductors ($GaP$ to $Ga_2O_3$ transition).
&lt;/p&gt;</description></item></channel></rss>