<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>GNU Linux on project392.net</title>
        <link>https://www.project392.net/tags/gnu-linux/</link>
        <description>Recent content in GNU Linux on project392.net</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Wed, 10 Jun 2026 00:00:00 +0100</lastBuildDate><atom:link href="https://www.project392.net/tags/gnu-linux/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Tool: Elektor T-962 Reflow Oven</title>
        <link>https://www.project392.net/p/tool-elektor-t-962-reflow-oven/</link>
        <pubDate>Wed, 10 Jun 2026 00:00:00 +0100</pubDate>
        
        <guid>https://www.project392.net/p/tool-elektor-t-962-reflow-oven/</guid>
        <description>&lt;img src="https://www.project392.net/various/t-962_elektor.jpg" alt="Featured image of post Tool: Elektor T-962 Reflow Oven" /&gt;&lt;h1 id=&#34;let-it-flow-let-it-flow-let-it-flow&#34;&gt;Let It Flow, Let it Flow, Let it Flow
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;lsquo;Cause you&amp;rsquo;re hot, then you&amp;rsquo;re cold&lt;br&gt;
You&amp;rsquo;re yes, then you&amp;rsquo;re no&lt;br&gt;
You&amp;rsquo;re in, then you&amp;rsquo;re out&lt;br&gt;
You&amp;rsquo;re up, then you&amp;rsquo;re down&lt;br&gt;
You&amp;rsquo;re wrong when it&amp;rsquo;s right&lt;br&gt;
It&amp;rsquo;s black, and it&amp;rsquo;s white &lt;br&gt;
— &lt;cite&gt;Katy Perry&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this post I will share my experience with the Elektor&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; branded T-962 V2.0 reflow oven. Spoiler: I wasn&amp;rsquo;t too pleased with it. Regardless of my opinions about the product, it is not my intention to throw shade on Elektor with this post. Their products are generally of good quality and their customer service department were friendly and helpful when I reached out to them. In the end however, the product disappointed.&lt;/p&gt;
&lt;p&gt;I invested quite some time in trying to get the oven to work and found some useful information about how to communicate with it from a Linux system. For that reason I felt like sharing my experience. I may have just been unlucky with my T-962 and yours may be perfectly fine, so don&amp;rsquo;t be afraid to give it a try. If you want to program your Elektor T-962 from a Linux box you might find something of interest below.&lt;/p&gt;
&lt;h2 id=&#34;better-baking&#34;&gt;Better Baking?
&lt;/h2&gt;&lt;p&gt;After promising myself never to hand-solder a &lt;a class=&#34;link&#34; href=&#34;https://www.project392.net/p/party-lights-led-boards-build-and-test/&#34; &gt;large batch&lt;/a&gt; of circuit boards again, I considered the option of using a small reflow oven. The initial idea was a &lt;abbr title=&#34;Do It Yourself&#34;&gt;DIY&lt;/abbr&gt; solution but upon reflection I realized that would add another item to my ever growing project backlog. With that in mind, buying an off-the-shelf reflow oven seemed like the sensible thing to do. I choose the well known T-962 oven.&lt;/p&gt;
&lt;p&gt;The T-962: lauded for its attractive price point and functionality, but not so much for its build quality and electrical safety. These ovens are known for being build using masking tape to hold the thermal insulation in place (said tape will go up in smoke the first time the device is used) and often without proper protective earthing.&lt;/p&gt;
&lt;p&gt;There are many online guides for improving the original T-962 but there also exists an improved version. Dutch electronics publisher Elektor sells a version with all the upgrades already installed. The device is produced by the Chinese company Puhui&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; and is being sold by Elektor with their logo on the front panel. It is available from their web shop. I decided to order one for my home workshop.&lt;/p&gt;
&lt;p&gt;The T-962 V2.0 comes with a serial port to upload two custom reflow profiles to the device. The device ships with a &lt;abbr title=&#34;Universal Serial Bus&#34;&gt;USB&lt;/abbr&gt; flash drive that contains a spreadsheet to convert a temperature profile to a series of hexadecimal numbers that can then be copied to a serial communication application (also on the flash drive). That in turn communicates the temperature data to the device. Only the problem (for me anyway) was that this application runs on Windows while I run &lt;abbr title=&#34;GNU&#39;s Not Unix&#34;&gt;GNU&lt;/abbr&gt; Linux on all of my computers.&lt;/p&gt;
&lt;h2 id=&#34;talk-to-the-hand&#34;&gt;Talk to the Hand
&lt;/h2&gt;&lt;p&gt;Because the oven isn&amp;rsquo;t listening&amp;hellip;&lt;/p&gt;
&lt;p&gt;I did a couple of internet searches to learn about the communication protocol for the Elektor T-962 V2.0 (which was said do differ from the original T-962). I didn&amp;rsquo;t manage to find and answer and eventually descended to prompting an &lt;abbr title=&#34;Artificial Intelligence&#34;&gt;AI&lt;/abbr&gt; agent to do the work for me. It confidently gave me the wrong answer.&lt;/p&gt;
&lt;p&gt;The oven supposedly expects text-based serial data and always responds with either an &amp;lsquo;ACK&amp;rsquo; (on success) or an &amp;lsquo;ERR&amp;rsquo; (on failure). However, regardless of what I tried to feed it, the oven wouldn&amp;rsquo;t respond. I checked the port settings and wiring, which all seemed in order. A quick look at the signals with my oscilloscope revealed a perfectly clean, 9600 Baud &lt;abbr title=&#34;Recommended Standard&#34;&gt;RS&lt;/abbr&gt;-232 signal. But no response still.&lt;/p&gt;
&lt;p&gt;The serial application that came with the device wouldn&amp;rsquo;t run in Wine or on ReactOS and I ended up installing Windows 10 in Virtual Box to run it. To spy on the outgoing data, the &lt;em&gt;socat&lt;/em&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; tool came in handy. Running &lt;code&gt;socat -d -d pty,raw,echo=0 pty,raw,echo=0&lt;/code&gt; creates two character devices (in my case &lt;em&gt;/dev/pts/1&lt;/em&gt; and &lt;em&gt;/dev/pts/2&lt;/em&gt;). One of those can mimic a serial port for the virtual machine by filling its path into the serial port settings page and setting the port mode to &lt;em&gt;Raw file&lt;/em&gt;. In a second terminal window the data that the virtual machine sends to its serial port can be sniffed by the ever so helpful cat&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;: &lt;code&gt;cat /dev/pts/1 &amp;gt; logfile&lt;/code&gt; (with logfile being the file to log the data to). This trick only snoops outbound traffic, but it&amp;rsquo;s good enough to get an idea of how the communication is initiated.&lt;/p&gt;
&lt;p&gt;A look at the contents of the log file quickly made clear that the oven speaks Binary. Not &lt;abbr title=&#34;American Standard Code for Information Interchange&#34;&gt;ASCII&lt;/abbr&gt;. After passing the captured binary data to &lt;em&gt;hexdump&lt;/em&gt;&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;, it became obvious what the serial com app actually does. Let&amp;rsquo;s have a look at it.&lt;/p&gt;
&lt;p&gt;The hexadecimal numbers below were generated by the spreadsheet:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                 01 10 00 00 03
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1C 1F 23 26 29 2D 32 37	3C 41 46 4B 50 55 5A 5F
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64 69 6A 6C 6E 6F 71 73	73 74 75 76 77 78 7A 7D
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;7F 82 84 87 8A 8D 91 94	97 9B 9F A3 A7 AB AF B4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;B9 BE C3 C8 CD D2 D6 DA	DE E2 E6 EB E9 E7 E6 E4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;E2 E1 DC D7 D2 CD C8 C3	BE B9 B4 AF AA A5 A0 9B
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;96 91 8C 87 82 7E 7A 76	72 6E 69 65 61 5D 59 00
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is what &lt;em&gt;hexdump&lt;/em&gt; had to say about the data sent to the serial port:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00000000  01 10 00 00 03 1c 1f 23  26 29 2d 32 37 3c 41 46  |.......#&amp;amp;)-27&amp;lt;AF|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00000010  4b 50 55 5a 5f 64 69 6a  6c 6e 6f 71 73 73 74 75  |KPUZ_dijlnoqsstu|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00000020  76 77 78 7a 7d 7f 82 84  87 8a 8d 91 94 97 9b 9f  |vwxz}...........|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00000030  a3 a7 ab af b4 b9 be c3  c8 cd d2 d6 da de e2 e6  |................|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00000040  eb e9 e7 e6 e4 e2 e1 dc  d7 d2 cd c8 c3 be b9 b4  |................|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00000050  af aa a5 a0 9b 96 91 8c  87 82 7e 7a 76 72 6e 69  |..........~zvrni|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00000060  65 61 5d 59 00                                    |ea]Y.|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;00000065
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s not hard to see the similarities between the two.&lt;/p&gt;
&lt;p&gt;Luckily, the GNU toolbox comes with everything we need to convert the temperature profile to something the oven can understand. In fact, you don&amp;rsquo;t actually need the serial communication tool that ships with the oven. Just paste the hexadecimal numbers from the spreadsheet into a text file, for example, &lt;code&gt;profile.txt&lt;/code&gt;. Then run that file through &lt;em&gt;awk&lt;/em&gt;&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt; and pass the output to the serial port (/dev/ttyUSB0 in my case, but it may differ on your system).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;echo -e &amp;#34;&amp;#39;$(awk &amp;#39;{for (i=1; i&amp;lt;=NF; i++) printf &amp;#34;\\x%s&amp;#34;,$i}&amp;#39; profile.txt)&amp;#39;&amp;#34; &amp;gt; /dev/ttyUSB0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This command reads the hexadecimal values from the file one by one, converts them to binary and then sends the data on the serial port. Compared to a &lt;abbr title=&#34;Graphical User Interface&#34;&gt;GUI&lt;/abbr&gt; application this command line trick may seem awkward, but at least your not dependent on third party tools.&lt;/p&gt;
&lt;p&gt;I gave this a try and it fed the data nicely to the oven, which then gave a satisfied beep and showed the temperature profile on its display. The oven does send a binary acknowledgement but this command line hack is a quick and dirty approach that&amp;rsquo;s too impatient to wait for a response. The beep suffices for now.&lt;/p&gt;
&lt;p&gt;A look under the hood of the spreadsheet tool gave another bit of insight about the protocol. The packet starts with a five byte fixed header. After that the temperature data follows. The oven expects a data point for every 5 second interval of the profile and the sequence must be terminated with a null character.&lt;/p&gt;
&lt;p&gt;The temperature profile send to the device is offset by -25 degrees Celsius with respect to the actual profile.  Temperatures below 50 degrees are not allowed (the oven won&amp;rsquo;t accept them). Surprisingly, the spreadsheet tool takes a data point for every 30 seconds and  interpolates the gradient between two points to generate data points at 5 second intervals. The spreadsheet in effect reduces the reflow profile resolution.&lt;/p&gt;
&lt;p&gt;The T-962 allows for two user-defined profiles to be stored, &lt;em&gt;Wave 7&lt;/em&gt; and &lt;em&gt;Wave 8&lt;/em&gt;. To differentiate between the two, the most significant bit for each data point is either set (for Wave 7) or cleared (for Wave 8).&lt;/p&gt;
&lt;p&gt;In a somewhat cryptic symbolic description the data would look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0x01, 0x10, 0x00, 0x00, 0x03, { (T [n] - 25) | W }, 0x00
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;With T [n] being an array with the temperature data points and W the value to be set to the &lt;abbr title=&#34;Most Significant Bit&#34;&gt;MSB&lt;/abbr&gt; (0x80 for Wave 7 or 0x00 for Wave 8).&lt;/p&gt;
&lt;h2 id=&#34;no-state-of-flow&#34;&gt;No State of Flow
&lt;/h2&gt;&lt;p&gt;With the oven now willing to listen to the computer it was time to start baking. I bought myself some solder paste, acquired the datasheet and started filling out a spreadsheet to convert the data to Ovenish.&lt;/p&gt;
&lt;p&gt;I opted for Chip Quick TS391LT&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt; which is a low temperature paste. The datasheet advises the following profile (note that, annoyingly, the horizontal axis is non-linear).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.project392.net/various/ts391lt.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Chip Quick TS391LT&#34;
	
	
&gt;&lt;em&gt;Chip Quick TS391LT reflow profile&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;After communicating the profile to the T-962 I applied some paste to a spare board, placed some 0603 resistors on it and let the oven do its work. The result was&amp;hellip; disappointing.&lt;/p&gt;
&lt;p&gt;While I had expected that some fine tuning would be needed, I had pictured to at least see some form of solder joint at the end of the baking process. What I found instead was a board with loose resistors sitting in half-molted solder paste. Something obviously went wrong. I tried tweaking the profile somewhat by extending the relflow zone and increasing the peak temperature by 5 and 10 degrees Celsius respectively. Only until I increased the temperature by 20 degrees Celsius did I end up with what looked like a solder joint.&lt;/p&gt;
&lt;p&gt;To learn what was actually happening I decided to do some measurements by attaching a thermocouple to a board and running the reflow cycle again. An Arduino with a MAX6675&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt; thermocouple interface helped with logging the actual temperature gradient. The Arduino sketch is simple enough to embed into this post. No need to upload it to Git repository:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#include &amp;#34;max6675.h&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;int tcDO = 12;      // Data Out at pin 12
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;int tcCLK = 13;     // Clock at pin 13
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;int tcCS = 8;       // Chip Select at pin 8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MAX6675 thermocouple (tcCLK, tcCS, tcDO);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;void setup() {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  // Initialize the serial port
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Serial.begin (9600);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  delay (500);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;void loop() {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  // Read the temperature and send on serial port
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  static int n = 0;     // Sample time in seconds
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Serial.print (n);     // Write sample time
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Serial.print (&amp;#34;  &amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  n+=5;                 // Increase counter
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Serial.println (thermocouple.readCelsius());   // Read and send temperature
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  delay (5000);         // Wait 5 seconds   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This could then be logged using using the by now familiar trick: &lt;code&gt;cat /dev/ttyUSB0 &amp;gt; temperature_log&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The graphs below show the results for some test profiles. The blue curves show the profile that was programmed into the oven. The red curves show the temperatures logged by the Arduino.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.project392.net/p/tool-elektor-t-962-reflow-oven/profile1.png&#34;
	width=&#34;1022&#34;
	height=&#34;341&#34;
	srcset=&#34;https://www.project392.net/p/tool-elektor-t-962-reflow-oven/profile1_hu9254905787246393424.png 480w, https://www.project392.net/p/tool-elektor-t-962-reflow-oven/profile1_hu4508396700864009758.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Profile 1&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;299&#34;
		data-flex-basis=&#34;719px&#34;
	
&gt; &lt;img src=&#34;https://www.project392.net/p/tool-elektor-t-962-reflow-oven/profile2.png&#34;
	width=&#34;1022&#34;
	height=&#34;341&#34;
	srcset=&#34;https://www.project392.net/p/tool-elektor-t-962-reflow-oven/profile2_hu2482019880978824241.png 480w, https://www.project392.net/p/tool-elektor-t-962-reflow-oven/profile2_hu1047689994436447613.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Profile 2&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;299&#34;
		data-flex-basis=&#34;719px&#34;
	
&gt; &lt;img src=&#34;https://www.project392.net/p/tool-elektor-t-962-reflow-oven/profile3.png&#34;
	width=&#34;1022&#34;
	height=&#34;341&#34;
	srcset=&#34;https://www.project392.net/p/tool-elektor-t-962-reflow-oven/profile3_hu11628373052050821101.png 480w, https://www.project392.net/p/tool-elektor-t-962-reflow-oven/profile3_hu9782471748337995892.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Profile 3&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;299&#34;
		data-flex-basis=&#34;719px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;The curves show a noticeable time lag between set and actual temperatures. Also the slope of the curve during heat-up appears to be less steep than that of the programmed curve. During cool-down the difference is even greater. Both curves satisfy the the criterion for a maximum allowed slope of 3 degrees per second that Puhui specify. With the first profile the peak temperature is never reached. This explains my solder paste not melting. The seconds profile holds the temperature at a constant level for some time. In this case the temperature eventually overshoots. The initial oven temperature also seems to have effect on the total error. Profile one was executed first, when the oven was at room temperature. The latter two profiles were run after that (but with a cool down period in between).&lt;/p&gt;
&lt;p&gt;You may be wondering: could the problem lay in the reverse engineered protocol or the way it was sent to the oven? I asked myself that same question. However, the graph on the oven &lt;abbr title=&#34;Liquid-Crystal Display&#34;&gt;LCD&lt;/abbr&gt; clearly shows the profile that was sent to it. The oven itself shows its current setpoint and the actual temperature it measures in the oven compartment. The setpoint matches the profile and according to the oven, so does the temperature gradient it creates. I would dare to draw the conclusion that the device measured its temperature incorrectly. Either due to a calibration issue or a hardware fault.&lt;/p&gt;
&lt;h2 id=&#34;solder-by-hand&#34;&gt;Solder by hand
&lt;/h2&gt;&lt;p&gt;&amp;hellip; Because the oven isn&amp;rsquo;t soldering.&lt;/p&gt;
&lt;p&gt;After I concluded that I was not going to get the oven to reflow solder reliably, I reached out to the Elektor support desk. After discussing the matter internally they kindly offered me the choice between getting a replacement unit or a refund. Because both my enthusiasm and my fate in the product had waned I decided to go for the refund.&lt;/p&gt;
&lt;p&gt;Looks like I will have to go for the DIY solution after all. Or maybe a hot plate. Or a DIY hot plate.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t deny that the experience was disappointing. Not least because I already have two boards lying around, ready to be populated. On the plus side: I did get to work out the communication protocol, played with an Arduino and learned something new in the process. So it wasn&amp;rsquo;t a complete waste of time after all.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.elektor.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Elektor website&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://puhuit.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Puhui wesite&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://duckduckgo.com/&amp;amp;q=socat%20man%20page?ia=web&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Socat man page&lt;/a&gt;  (Socat requires manual installation)&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://duckduckgo.com/&amp;amp;q=cat%20man%20page?ia=web&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cat man page&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://duckduckgo.com/&amp;amp;q=hexdump%20man%20page?ia=web&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hexdump man page&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://duckduckgo.com/&amp;amp;q=awk%20man%20page?ia=web&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Awk man page&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:7&#34;&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://chipquik.com/datasheets/TS391LT.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chip Quick TS391LT datasheet&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:8&#34;&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://duckduckgo.com/?q=analog&amp;#43;devices&amp;#43;MAX6675&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MAX6675 datasheet&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
        </item>
        
    </channel>
</rss>
