<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Amine Ben Hariz]]></title><description><![CDATA[WebDev / Security / Photography / Tunisia]]></description><link>https://aminebenhariz.com/</link><image><url>https://aminebenhariz.com/favicon.png</url><title>Amine Ben Hariz</title><link>https://aminebenhariz.com/</link></image><generator>Ghost 5.52</generator><lastBuildDate>Sat, 11 Apr 2026 18:44:26 GMT</lastBuildDate><atom:link href="https://aminebenhariz.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Razer BlackWidow 2013: from dustbin to desktop]]></title><description><![CDATA[<p></p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4082-1.jpg" width="2000" height="1325" loading="lazy" alt srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4082-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4082-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4082-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4082-1.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4089.jpg" width="2000" height="1325" loading="lazy" alt srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4089.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4089.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4089.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4089.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>I found this keyboard in the flea market. To my surprise, it was a very expensive mechanical keyboard: the <strong>Razer BlackWidow 2013</strong>.</p><p>Unfortunately, it was in a very bad shape. Some buttons were missing, and others were damaged. It looks like that this keyboard was exposed to heat source. The</p>]]></description><link>https://aminebenhariz.com/razer-blackwidow-2013-restore/</link><guid isPermaLink="false">635bb1d757570d189fa19d77</guid><category><![CDATA[Tinkering]]></category><category><![CDATA[Tech]]></category><category><![CDATA[Keyboard]]></category><category><![CDATA[Blackwidow]]></category><category><![CDATA[Razer]]></category><category><![CDATA[Mechanical Keyboard]]></category><category><![CDATA[USB]]></category><category><![CDATA[Cherry MX]]></category><category><![CDATA[Restoration]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Sun, 26 Feb 2023 13:12:18 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2023/02/DSC_4160-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2023/02/DSC_4160-2.jpg" alt="Razer BlackWidow 2013: from dustbin to desktop"><p></p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4082-1.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4082-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4082-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4082-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4082-1.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4089.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4089.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4089.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4089.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4089.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>I found this keyboard in the flea market. To my surprise, it was a very expensive mechanical keyboard: the <strong>Razer BlackWidow 2013</strong>.</p><p>Unfortunately, it was in a very bad shape. Some buttons were missing, and others were damaged. It looks like that this keyboard was exposed to heat source. The case was melted and deformed around the affected area.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4092-1.jpg" class="kg-image" alt="Razer BlackWidow 2013: from dustbin to desktop" loading="lazy" width="2000" height="1325" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4092-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4092-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4092-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4092-1.jpg 2400w" sizes="(min-width: 1200px) 1200px"></figure><p>The last time I saw a mechanical keyboard lying around was back in 2018, although it needed fixing, You can check the article I wrote about that keyboard in the link below.</p><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://aminebenhariz.com/steelseries-6gv2-mechanical-keyboard/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">How I got my SteelSeries 6GV2 mechanical keyboard</div><div class="kg-bookmark-description">Few months ago, on a beautiful Sunday morning, I visited a local flea market. Iwas not looking for something in particular, but what I found that day wasbeyond my expectation: a SteelSeries 6GV2 mechanical keyboard. The vendor was an old man, and the items he was selling were</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://aminebenhariz.com/favicon.ico" alt="Razer BlackWidow 2013: from dustbin to desktop"><span class="kg-bookmark-author">Amine Ben Hariz</span><span class="kg-bookmark-publisher">Amine Ben Hariz</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_9432.jpg" alt="Razer BlackWidow 2013: from dustbin to desktop"></div></a><figcaption>My first mechanical keyboard, restored in 2018</figcaption></figure><p>Despite having slim hopes for this keyboard to be fully restored, I went ahead and bought it for 8 TND (around $2.5). I can make profit by solely salvaging those Cherry MX Blue switches.</p><p>In this article, I will share how I managed to restore this excellent keyboard, and give it a second life.</p><p></p><h2 id="keyboard-specification">Keyboard specification</h2><ul><li>Model: Razer BlackWidow 2013</li><li>Type: Mechanical</li><li>Switches: Cherry MX Blue</li><li>1000Hz Ultrapolling</li><li>Audio and USB pass-through</li><li>Weight: 1500g</li></ul><p></p><h2 id="fixing-the-keyboard">Fixing the keyboard</h2><h3 id="step-1-disassembly">Step 1: Disassembly</h3><p>I started by removing all the keycaps. As I mentioned, some of the keycaps were missing, and others deformed. Luckily the switches below them are fully functional. The missing blocks were the numpad, arrow keys, and the escape key.</p><p>The keyboard was very dirty, and that could be explained by the duration it was exposed to the elements.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4100-1.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4100-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4100-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4100-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4100-1.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4107-1.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4107-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4107-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4107-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4107-1.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>After that, I proceeded to remove the cover, exposing the circuit board. The more I go deeper the more I discover more dirt. There were even insects inside.</p><p>Since this keyboard will need a thoroughly cleaning, I decided to take out the circuit board. The black cable was soldered, which made this step a little bit trickier.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/IMG20230108172733.jpg" width="2000" height="1500" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/IMG20230108172733.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/IMG20230108172733.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/IMG20230108172733.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/IMG20230108172733.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/IMG20230108174420.jpg" width="2000" height="1500" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/IMG20230108174420.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/IMG20230108174420.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/IMG20230108174420.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/IMG20230108174420.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><h3 id="step-2-cleaning">Step 2: Cleaning</h3><p>The plastic case was cleaned using a wet tissue. The circuit board was also cleaned with a special care not to let water leak to the switches or electronic components. A special brush was used to remove dust and debris around corners and difficult spots.</p><p>Below is the result after the cleaning operation.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4115.jpg" class="kg-image" alt="Razer BlackWidow 2013: from dustbin to desktop" loading="lazy" width="2000" height="1325" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4115.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4115.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4115.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4115.jpg 2400w" sizes="(min-width: 1200px) 1200px"></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4114.jpg" class="kg-image" alt="Razer BlackWidow 2013: from dustbin to desktop" loading="lazy" width="2000" height="1325" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4114.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4114.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4114.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4114.jpg 2400w" sizes="(min-width: 1200px) 1200px"></figure><p>Keycaps were soaked in diluted soap for 24 hours, and the rinsed with clean water. Then, they were left to dry on a paper towel.</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4149.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4149.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4149.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4149.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4149.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4150.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4150.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4150.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4150.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4150.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>Cleaning original keycaps</figcaption></figure><h3 id="step-3-removing-damaged-parts">Step 3: Removing damaged parts </h3><p>The cover was damaged. The plastic separator of the numpad was melted and deformed. Since this part is not absolutely necessary, I decided to cut it off. I smoothed the edges to hide cutting marks.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4142.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4142.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4142.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4142.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4142.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4144.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4144.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4144.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4144.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4144.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4145.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4145.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4145.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4145.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4145.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><h3 id="step-4-reassembly">Step 4: Reassembly</h3><p>Putting everything together was easy. I used my trusty Chinese 25W soldering iron to attach the wire back. At this point, I attached the keyboard to my computer to see if everything is working. I also tested all the switches to identify any faulty one.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4147.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4147.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4147.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4147.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4147.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4148.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4148.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4148.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4148.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4148.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>All is good! let&apos;s continue then.</p><h3 id="step-5-new-keycaps">Step 5: New Keycaps</h3><p>The Razer BlackWidow has 5 additional macro keys M1-M5, and custom marking on the F1-F12 keys for its gaming features. Replacing all the keycaps will waist those labels, and will make remembering and using those features difficult. So I decided to replace only the damaged keys.</p><p>So, I decided to buy a set of white keycaps: Redragon A130-WH. This set was relatively cheap (30 TND or $10). For aesthetic reasons, alpha keys were also replaced.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4158.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4158.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4158.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4158.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4158.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4154.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4154.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4154.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4154.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4154.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4157.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4157.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4157.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4157.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4157.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p></p><h2 id="before-after">Before / After</h2><p>The keyboard was successfully restored. I&apos;m currently using it to write this post.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4092-2.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4092-2.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4092-2.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4092-2.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4092-2.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4165.jpg" width="2000" height="1325" loading="lazy" alt="Razer BlackWidow 2013: from dustbin to desktop" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4165.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4165.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4165.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4165.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://aminebenhariz.com/content/images/2023/02/DSC_4160.jpg" class="kg-image" alt="Razer BlackWidow 2013: from dustbin to desktop" loading="lazy" width="2000" height="1325" srcset="https://aminebenhariz.com/content/images/size/w600/2023/02/DSC_4160.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2023/02/DSC_4160.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2023/02/DSC_4160.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2023/02/DSC_4160.jpg 2400w" sizes="(min-width: 1200px) 1200px"></figure><div class="kg-card kg-audio-card"><img src alt="Razer BlackWidow 2013: from dustbin to desktop" class="kg-audio-thumbnail kg-audio-hide"><div class="kg-audio-thumbnail placeholder"><svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.33a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM15 13.83a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm-2.25.75a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M14.486 6.81A2.25 2.25 0 0 1 17.25 9v5.579a.75.75 0 0 1-1.5 0v-5.58a.75.75 0 0 0-.932-.727.755.755 0 0 1-.059.013l-4.465.744a.75.75 0 0 0-.544.72v6.33a.75.75 0 0 1-1.5 0v-6.33a2.25 2.25 0 0 1 1.763-2.194l4.473-.746Z"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3 1.5a.75.75 0 0 0-.75.75v19.5a.75.75 0 0 0 .75.75h18a.75.75 0 0 0 .75-.75V5.133a.75.75 0 0 0-.225-.535l-.002-.002-3-2.883A.75.75 0 0 0 18 1.5H3ZM1.409.659A2.25 2.25 0 0 1 3 0h15a2.25 2.25 0 0 1 1.568.637l.003.002 3 2.883a2.25 2.25 0 0 1 .679 1.61V21.75A2.25 2.25 0 0 1 21 24H3a2.25 2.25 0 0 1-2.25-2.25V2.25c0-.597.237-1.169.659-1.591Z"/></svg></div><div class="kg-audio-player-container"><audio src="https://aminebenhariz.com/content/media/2023/02/razer-blackwidow.mp3" preload="metadata"></audio><div class="kg-audio-title">Recorded keystrokes</div><div class="kg-audio-player"><button class="kg-audio-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-audio-pause-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-audio-current-time">0:00</span><div class="kg-audio-time">/<span class="kg-audio-duration">0:15</span></div><input type="range" class="kg-audio-seek-slider" max="100" value="0"><button class="kg-audio-playback-rate">1&#xD7;</button><button class="kg-audio-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-audio-mute-icon kg-audio-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-audio-volume-slider" max="100" value="100"></div></div></div><p>Blue switches have a tactile bump followed by a loud audible click to give a feedback when a keystroke has registered. The typing feels good and the sound is amazing.</p>]]></content:encoded></item><item><title><![CDATA[Tetris Cube Part 1: Fixing]]></title><description><![CDATA[<p>This will be the first post of a multi-part article. The reason for this is that I want to include all the steps I went through: fixing, working the theory, writing scripts, optimizing. If you want to have an idea of what I&apos;m talking about, here is a</p>]]></description><link>https://aminebenhariz.com/tetris-cube-part-1-fixing/</link><guid isPermaLink="false">60c5d4d72be35a752a5e099c</guid><category><![CDATA[Puzzle]]></category><category><![CDATA[Tetris Cube]]></category><category><![CDATA[Flea Market]]></category><category><![CDATA[WebDev]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Fri, 28 Jan 2022 15:49:56 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2022/01/IMG_1910-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2022/01/IMG_1910-1.jpg" alt="Tetris Cube Part 1: Fixing"><p>This will be the first post of a multi-part article. The reason for this is that I want to include all the steps I went through: fixing, working the theory, writing scripts, optimizing. If you want to have an idea of what I&apos;m talking about, here is a very similar article:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://aminebenhariz.com/soma-cube-solving-the-puzzle-3d/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Solving the Soma cube in 3D</div><div class="kg-bookmark-description">I bought this wooden puzzle few weeks ago from the flea market for 3 TND ($1). The build quality is quite good. It&#x2019;s composed of 7 different pieces that must be assembled in a 3x3x3 cube. Solving this puzzle manually is complicated. There is no apparent solution other than brute-force.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://aminebenhariz.com/favicon.ico" alt="Tetris Cube Part 1: Fixing"><span class="kg-bookmark-author">Amine Ben Hariz</span><span class="kg-bookmark-publisher">Amine Ben Hariz</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://aminebenhariz.com/content/images/2018/11/IMG_0468.jpg" alt="Tetris Cube Part 1: Fixing"></div></a></figure><p> So, grab the popcorn and hold on to your seat. This is going to be a long journey.</p><h2 id="introduction">Introduction</h2><p>First, let&apos;s introduce the new puzzle &quot;Tetris Cube&quot;.</p><p>This puzzle is composed of:</p><ul><li>54 x &quot;T&quot; shaped pieces, all the same</li><li>a red wooden mount</li></ul><p>The goal is to arrange the pieces in a way to form a solid 6x6x6 cube. </p><h2 id="fixing-the-mount">Fixing the mount</h2><p>Sadly, when I first saw the puzzle on the flea market, it was broken. A side panel was detached. I made sure that it was not missing pieces, and bought it.</p><blockquote>Fixing things is rescuing them from the garbage dump, giving them a second life.</blockquote><p>We will be using super-glue to fix the mount. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://aminebenhariz.com/content/images/2022/01/IMG_1905-1.jpg" class="kg-image" alt="Tetris Cube Part 1: Fixing" loading="lazy" width="2000" height="1333" srcset="https://aminebenhariz.com/content/images/size/w600/2022/01/IMG_1905-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2022/01/IMG_1905-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2022/01/IMG_1905-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2022/01/IMG_1905-1.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>Gluing the mount pieces together</figcaption></figure><p>Here is the mount after letting the glue set for a few minutes. I tried not to put too much glue so that it won&apos;t overrun and make a mess.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://aminebenhariz.com/content/images/2022/01/IMG_1910.jpg" class="kg-image" alt="Tetris Cube Part 1: Fixing" loading="lazy" width="2000" height="1333" srcset="https://aminebenhariz.com/content/images/size/w600/2022/01/IMG_1910.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2022/01/IMG_1910.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2022/01/IMG_1910.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2022/01/IMG_1910.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>The mount after it was fixed</figcaption></figure><h2 id="whats-next">What&apos;s next?</h2><p>Once fixed, the next logical step is to solve the puzzle. This sound easy enough at first glance, but fitting the last few pieces in place will give you headache.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://aminebenhariz.com/content/images/2022/01/IMG_1913.jpg" class="kg-image" alt="Tetris Cube Part 1: Fixing" loading="lazy" width="2000" height="1333" srcset="https://aminebenhariz.com/content/images/size/w600/2022/01/IMG_1913.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2022/01/IMG_1913.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2022/01/IMG_1913.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2022/01/IMG_1913.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>The &quot;Tetris Cube&quot; puzzle</figcaption></figure><p>As usual, we will compare different approaches to solve this puzzle, manually and with the help of computers, and later we will create 3D animation of it.</p><p>See you in the next post!</p>]]></content:encoded></item><item><title><![CDATA[Weather Station : Adding Outdoor Temperature]]></title><description><![CDATA[<p>This is the second article in the &quot;Weather Station Project&quot; series. If you want to know more, please check the <a href="https://aminebenhariz.com/weather-station-indoor-temperature/">previous article</a>, in which I explained how built the device. It has been running since then, and I&apos;m satisfied with the result.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://aminebenhariz.com/weather-station-indoor-temperature/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Weather Station : Indoor Temperature</div></div></a></figure>]]></description><link>https://aminebenhariz.com/weather-station-adding-outdoor-temperature/</link><guid isPermaLink="false">5ca35caf6fa7de06c6e7b5dc</guid><category><![CDATA[Tinkering]]></category><category><![CDATA[Weather Station]]></category><category><![CDATA[Arduino]]></category><category><![CDATA[MAX7221]]></category><category><![CDATA[ESP8266]]></category><category><![CDATA[WeMos]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Mon, 28 Jun 2021 21:19:22 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2021/06/IMG_1195-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2021/06/IMG_1195-1.jpg" alt="Weather Station : Adding Outdoor Temperature"><p>This is the second article in the &quot;Weather Station Project&quot; series. If you want to know more, please check the <a href="https://aminebenhariz.com/weather-station-indoor-temperature/">previous article</a>, in which I explained how built the device. It has been running since then, and I&apos;m satisfied with the result.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://aminebenhariz.com/weather-station-indoor-temperature/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Weather Station : Indoor Temperature</div><div class="kg-bookmark-description">Having a weather station at home is very useful. The most important informationis the indoor temperature. Required parts * WeMos D1 mini (ESP8266) * DS18B20: digital thermometer * MAX7221: LED display driver * 7 segments LED: 4 digits common cathode * 4.7 k&#x3A9; resistor: 1-Wire pull-up resistor&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://aminebenhariz.com/favicon.ico" alt="Weather Station : Adding Outdoor Temperature"><span class="kg-bookmark-author">Amine Ben Hariz</span><span class="kg-bookmark-publisher">Amine Ben Hariz</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0384-1.jpg" alt="Weather Station : Adding Outdoor Temperature"></div></a></figure><p>The first version only displayed indoor temperature. I wanted to improve it by adding outdoor temperature too. Using an external sensor is not very practical because of the long wires, limiting the station mobility. The idea is that we use a thermometer for the indoor temperature, and a weather online service for outdoor.</p><p>The weather API that we will be using is &quot;openweathermap.org&quot;. It&apos;s free if we don&apos;t exceed 60 calls per minute, which is more than enough for our project. You can check the API documentation on their website: <a href="https://openweathermap.org/api?ref=aminebenhariz.com">https://openweathermap.org/api</a>. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://aminebenhariz.com/content/images/2021/06/image-1.png" class="kg-image" alt="Weather Station : Adding Outdoor Temperature" loading="lazy" width="1040" height="229" srcset="https://aminebenhariz.com/content/images/size/w600/2021/06/image-1.png 600w, https://aminebenhariz.com/content/images/size/w1000/2021/06/image-1.png 1000w, https://aminebenhariz.com/content/images/2021/06/image-1.png 1040w" sizes="(min-width: 720px) 720px"><figcaption>The weather API provided by openweathermap.org&#xA0;</figcaption></figure><p>Next, I added a second 4 digits, 7 segments LED display, identical to the first one. Because our LED driver (MAX7221) can handle up to 8 digits, I will use it to run both displays.</p><p>Here is the PCB with the second display in place.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2019/04/IMG_1187.jpg" width="2000" height="1970" loading="lazy" alt="Weather Station : Adding Outdoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2019/04/IMG_1187.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2019/04/IMG_1187.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2019/04/IMG_1187.jpg 1600w, https://aminebenhariz.com/content/images/2019/04/IMG_1187.jpg 2269w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2019/04/IMG_1188.jpg" width="2000" height="1920" loading="lazy" alt="Weather Station : Adding Outdoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2019/04/IMG_1188.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2019/04/IMG_1188.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2019/04/IMG_1188.jpg 1600w, https://aminebenhariz.com/content/images/2019/04/IMG_1188.jpg 2351w" sizes="(min-width: 720px) 720px"></div></div></div></figure><!--kg-card-begin: markdown--><pre><code class="language-arduino">#include &lt;OneWire.h&gt;
#include &lt;DallasTemperature.h&gt;
#include &lt;LedControl.h&gt;
#include &lt;ESP8266WiFi.h&gt;
#include &lt;WiFiClientSecure.h&gt;
#include &lt;ArduinoJson.h&gt;

// start oneWire connection on Pin D5
OneWire oneWire(D5);

// Pin D8 &lt;==&gt; DIN
// Pin D6 &lt;==&gt; LOAD
// Pin D7 &lt;==&gt; CLK
LedControl lc = LedControl(D8, D7, D6, 1);

// put your wifi parameters here
const char* ssid = &quot;XXXXXXXX&quot;;
const char* password = &quot;XXXXXXXX&quot;;

const char* host = &quot;api.openweathermap.org&quot;;
const int httpsPort = 443;
// Use web browser to view and copy
// SHA1 fingerprint of the SSL certificate
const char* fingerprint = &quot;EE AA 58 6D 4F 1F 42 F4 18 5B 7F B0 F2 0A 4C DD 97 47 7D 99&quot;;

// openweathermap API key
const char* apiKey = &quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;;


int skipLoop = 0;
DallasTemperature DS18B20(&amp;oneWire);
char temperatureInteriorCString[7];
char temperatureExteriorCString[7];

// reads temperature and returns a string. Example: 24.9 or -12.2
void getInteriorTemperature() {
  float tempC;
  do {
    DS18B20.requestTemperatures(); 
    tempC = DS18B20.getTempCByIndex(0);
    dtostrf(tempC, 4, 1, temperatureInteriorCString);
    delay(100);
  } while (tempC == 85.0 || tempC == (-127.0));
}

void getExteriorTemperature() {
  Serial.begin(115200);
  Serial.println();
  Serial.print(&quot;connecting to &quot;);
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(&quot;.&quot;);
  }
  Serial.println(&quot;&quot;);
  Serial.println(&quot;WiFi connected&quot;);
  Serial.println(&quot;IP address: &quot;);
  Serial.println(WiFi.localIP());
  delay(500);

  // Use WiFiClientSecure class to create TLS connection
  WiFiClientSecure client;
  Serial.print(&quot;connecting to &quot;);
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println(&quot;connection failed&quot;);
    return;
  }

  if (client.verify(fingerprint, host)) {
    Serial.println(&quot;certificate matches&quot;);
  } else {
    Serial.println(&quot;certificate doesn&apos;t match&quot;);
  }

  String url = &quot;/data/2.5/weather?q=Tunis,tn&amp;units=metric&amp;appid=&quot; + apiKey;
  Serial.print(&quot;requesting URL: &quot;);
  Serial.println(url);

  client.print(String(&quot;GET &quot;) + url + &quot; HTTP/1.1\r\n&quot; +
               &quot;Host: &quot; + host + &quot;\r\n&quot; +
               &quot;User-Agent: MeteoTunisESP8266\r\n&quot; +
               &quot;Connection: close\r\n\r\n&quot;);

  Serial.println(&quot;request sent&quot;);
  while (client.connected()) {
    String line = client.readStringUntil(&apos;\n&apos;);
    if (line == &quot;\r&quot;) {
      Serial.println(&quot;headers received&quot;);
      break;
    }
  }
  String line = client.readStringUntil(&apos;\n&apos;);
  if (line.startsWith(&quot;{\&quot;coord\&quot;:&quot;)) {
    Serial.println(&quot;Meteo successfull!&quot;);
  } else {
    Serial.println(&quot;Meteo has failed&quot;);
  }
  Serial.println(&quot;reply was:&quot;);
  Serial.println(&quot;==========&quot;);
  Serial.println(line);
  Serial.println(&quot;==========&quot;);
  Serial.println(&quot;closing connection&quot;);

  StaticJsonBuffer&lt;1000&gt; jsonBuffer; 
  JsonObject&amp; root = jsonBuffer.parseObject(line); 
  if (!root.success()) { 
    Serial.println(&quot;parseObject() failed&quot;); 
    return; 
  } 

  float tempC = root[&quot;main&quot;][&quot;temp&quot;]; 

  dtostrf(tempC, 4, 1, temperatureExteriorCString);
}

// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);

  DS18B20.begin();

  // Initialize the MAX7219 device
  lc.shutdown(0,false);   // Enable display
  lc.setIntensity(0,10);  // Set brightness level (0 is min, 15 is max)
  lc.clearDisplay(0);     // Clear display register

}

// runs over and over again
void loop() {
  getInteriorTemperature();

  skipLoop--;
  if (skipLoop &lt;0) {
    getExteriorTemperature();
    skipLoop = 5;
  }

  Serial.println(temperatureInteriorCString);
  Serial.println(temperatureExteriorCString);

  // refresh LED Display
  lc.clearDisplay(0);
  if (temperatureInteriorCString[0] == &apos;-&apos;) {
    // Format: -XX.X
    lc.setDigit(0,0, &apos;-&apos;, false);
    lc.setDigit(0,1, temperatureInteriorCString[1] - &apos;0&apos;, false);
    lc.setDigit(0,2, temperatureInteriorCString[2] - &apos;0&apos;, true);
    lc.setDigit(0,3, temperatureInteriorCString[4] - &apos;0&apos;, false);    
  } else {
    // format: XX.X
    lc.setDigit(0,0, &apos;0&apos;, false);
    lc.setDigit(0,1, temperatureInteriorCString[0] - &apos;0&apos;, false);
    lc.setDigit(0,2, temperatureInteriorCString[1] - &apos;0&apos;, true);
    lc.setDigit(0,3, temperatureInteriorCString[3] - &apos;0&apos;, false);
  }

  if (temperatureExteriorCString[0] == &apos;-&apos;) {
    // Format: -XX.X
    lc.setDigit(0,4, &apos;-&apos;, false);
    lc.setDigit(0,5, temperatureExteriorCString[1] - &apos;0&apos;, false);
    lc.setDigit(0,6, temperatureExteriorCString[2] - &apos;0&apos;, true);
    lc.setDigit(0,7, temperatureExteriorCString[4] - &apos;0&apos;, false);    
  } else {
    // format: XX.X
    lc.setDigit(0,4, &apos;0&apos;, false);
    lc.setDigit(0,5, temperatureExteriorCString[0] - &apos;0&apos;, false);
    lc.setDigit(0,6, temperatureExteriorCString[1] - &apos;0&apos;, true);
    lc.setDigit(0,7, temperatureExteriorCString[3] - &apos;0&apos;, false);
  }

  // wait at least 10 seconds to avoid DS18B20 self-heating (incorrect readings)
  delay(10000);
}</code></pre>
<!--kg-card-end: markdown--><p>Now, let&apos;s cut a hole in the case. For design consistency, I used the same cutting technique. First, make adjacent holes with the soldering iron, and then smooth the edges.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2019/04/IMG_1189.jpg" width="2000" height="2672" loading="lazy" alt="Weather Station : Adding Outdoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2019/04/IMG_1189.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2019/04/IMG_1189.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2019/04/IMG_1189.jpg 1600w, https://aminebenhariz.com/content/images/2019/04/IMG_1189.jpg 2289w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2019/04/IMG_1190.jpg" width="2000" height="2660" loading="lazy" alt="Weather Station : Adding Outdoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2019/04/IMG_1190.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2019/04/IMG_1190.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2019/04/IMG_1190.jpg 1600w, https://aminebenhariz.com/content/images/2019/04/IMG_1190.jpg 2242w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2019/04/IMG_1191.jpg" width="2000" height="2696" loading="lazy" alt="Weather Station : Adding Outdoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2019/04/IMG_1191.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2019/04/IMG_1191.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2019/04/IMG_1191.jpg 1600w, https://aminebenhariz.com/content/images/2019/04/IMG_1191.jpg 2220w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>Then, I secured the components in place with a hot glue gun.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2019/04/IMG_1192.jpg" class="kg-image" alt="Weather Station : Adding Outdoor Temperature" loading="lazy"></figure><p>To distinguish the 2 displays, I etched a corresponding icon next to each one. First, I transferred the drawing from the laptop screen on a paper. Next, I used the paper to etch on the wood with my iron solder.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2019/04/IMG_1194.jpg" class="kg-image" alt="Weather Station : Adding Outdoor Temperature" loading="lazy"></figure><p>The result is good enough for me.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2019/04/IMG_1195.jpg" class="kg-image" alt="Weather Station : Adding Outdoor Temperature" loading="lazy"></figure><p>I present to you the updated weather station, with dual display.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2019/04/IMG_1196-1.jpg" class="kg-image" alt="Weather Station : Adding Outdoor Temperature" loading="lazy"></figure><p>There is still room in the wooden case for future ideas.</p>]]></content:encoded></item><item><title><![CDATA[Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD]]></title><description><![CDATA[<p>When I <a href="https://aminebenhariz.com/ryzen-1600/">switched to Ryzen</a> last month, I made sure to pick a motherboard with a PCIe M.2 slot. I wanted to replace my SATA SSD with the newest player in town: NVMe.</p><p>In this article, we will be comparing:</p><ul><li>TEAMGROUP MP34 M.2 NVMe 512GB SSD</li><li>ADATA SP580</li></ul>]]></description><link>https://aminebenhariz.com/nvme-vs-sata/</link><guid isPermaLink="false">5f2e9d713741f905f03acebc</guid><category><![CDATA[Tech]]></category><category><![CDATA[SSD]]></category><category><![CDATA[NVMe]]></category><category><![CDATA[SATA]]></category><category><![CDATA[TEAMGROUP]]></category><category><![CDATA[ADATA]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Mon, 24 Aug 2020 11:59:46 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2020/08/IMG_1873.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2020/08/IMG_1873.jpg" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD"><p>When I <a href="https://aminebenhariz.com/ryzen-1600/">switched to Ryzen</a> last month, I made sure to pick a motherboard with a PCIe M.2 slot. I wanted to replace my SATA SSD with the newest player in town: NVMe.</p><p>In this article, we will be comparing:</p><ul><li>TEAMGROUP MP34 M.2 NVMe 512GB SSD</li><li>ADATA SP580 2.5&quot; SATA 240GB SSD</li><li>TOSHIBA DT01ACA100 3.5&quot; SATA 1TB HDD (no pictures)</li></ul><h2 id="unboxing">Unboxing</h2><p>The NVMe SSD is very compact and lightweight. It&apos;s amazing how technology changed the storage drives in the last decade. Switching from bulky 3.5&quot; drives to 2.5&quot; SSDs, and now this M.2 form factor with the size of a chewing gum stick.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/08/IMG_1865.jpg" width="1473" height="1297" loading="lazy" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD" srcset="https://aminebenhariz.com/content/images/size/w600/2020/08/IMG_1865.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2020/08/IMG_1865.jpg 1000w, https://aminebenhariz.com/content/images/2020/08/IMG_1865.jpg 1473w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/08/IMG_1864.jpg" width="1311" height="1443" loading="lazy" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD" srcset="https://aminebenhariz.com/content/images/size/w600/2020/08/IMG_1864.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2020/08/IMG_1864.jpg 1000w, https://aminebenhariz.com/content/images/2020/08/IMG_1864.jpg 1311w" sizes="(min-width: 720px) 720px"></div></div></div></figure><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/08/IMG_1866.jpg" width="1643" height="1511" loading="lazy" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD" srcset="https://aminebenhariz.com/content/images/size/w600/2020/08/IMG_1866.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2020/08/IMG_1866.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2020/08/IMG_1866.jpg 1600w, https://aminebenhariz.com/content/images/2020/08/IMG_1866.jpg 1643w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/08/IMG_1872.jpg" width="1723" height="1763" loading="lazy" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD" srcset="https://aminebenhariz.com/content/images/size/w600/2020/08/IMG_1872.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2020/08/IMG_1872.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2020/08/IMG_1872.jpg 1600w, https://aminebenhariz.com/content/images/2020/08/IMG_1872.jpg 1723w" sizes="(min-width: 720px) 720px"></div></div></div></figure><h2 id="installing-the-nvme-ssd">Installing the NVMe SSD</h2><p>The M.2 slot is located on the motherboard, on top of the GPU PCIe x16 slot. The SSD is inserted directly, no cables needed. The screw was not included with the drive, so I used the one provided with the motherboard.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/08/IMG_1874.jpg" width="1597" height="1139" loading="lazy" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD" srcset="https://aminebenhariz.com/content/images/size/w600/2020/08/IMG_1874.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2020/08/IMG_1874.jpg 1000w, https://aminebenhariz.com/content/images/2020/08/IMG_1874.jpg 1597w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/08/IMG_1881.jpg" width="2000" height="1218" loading="lazy" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD" srcset="https://aminebenhariz.com/content/images/size/w600/2020/08/IMG_1881.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2020/08/IMG_1881.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2020/08/IMG_1881.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2020/08/IMG_1881.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><h2 id="benchmark">Benchmark</h2><p>I used CrystalDiskMark to perform the benchmarks. In total, there are 8 speed tests: 4 different categories, and read/write test for each one. The performance of the NVMe was like announced on the specifications. The reading speed is so high that no real world test could reach that limit.</p><p>NVMe is obviously better in every category. Booting Windows was faster, but not as impressive as the jump from HDD to SSD. Everything else feels as responsive as regular SATA SSD.</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/08/SSD_speed_nvme.png" width="510" height="371" loading="lazy" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/08/SSD_speed_adata.png" width="499" height="365" loading="lazy" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/08/SSD_speed_hdd.png" width="512" height="372" loading="lazy" alt="Benchmark: NVMe PCIe 3.0 x4 -vs- SATA SSD"></div></div></div><figcaption>NVMe SSD (on the left) -vs- SATA SSD (center) -vs- SATA HDD (on the right)</figcaption></figure><p>What I enjoyed the most was the cleaner look of the PC after the elimination of the SATA cable, I think this would imply a slightly better airflow.</p><h2 id="conclusion">Conclusion</h2><p>Despite performing well in synthetic benchmarks, NVMe SSD did not feel as a huge leap in real world usage, compared to SATA SSD.</p><p>In my opinion, SATA SSDs are currently enough for most users. But, if they cost the same, and you already have a compatible motherboard, why not ?</p>]]></content:encoded></item><item><title><![CDATA[Switching to Ryzen]]></title><description><![CDATA[<p>I sit in front of computers 12 hours a day: work, games, photo and video editing, internet browsing, etc..</p><p>My desktop PC was equipped with an Intel i7-2600 processor (2<sup>nd</sup> generation), released on 2011. During those 9 years, I had not felt the need to upgrade the CPU: Intel</p>]]></description><link>https://aminebenhariz.com/ryzen-1600/</link><guid isPermaLink="false">5ee154bb22df5a52f9eb7d93</guid><category><![CDATA[Tech]]></category><category><![CDATA[Ryzen]]></category><category><![CDATA[AMD]]></category><category><![CDATA[DDR4]]></category><category><![CDATA[MSI]]></category><category><![CDATA[PC]]></category><category><![CDATA[CPU]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Thu, 18 Jun 2020 12:17:48 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2020/06/IMG_1849.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2020/06/IMG_1849.jpg" alt="Switching to Ryzen"><p>I sit in front of computers 12 hours a day: work, games, photo and video editing, internet browsing, etc..</p><p>My desktop PC was equipped with an Intel i7-2600 processor (2<sup>nd</sup> generation), released on 2011. During those 9 years, I had not felt the need to upgrade the CPU: Intel has been releasing incremental updates, with minor performance gain between generations. In 2017, AMD released the new Zen architecture, with a new CPU lineup called Ryzen. This changed everything.</p><p>The new AMD offer was very tempting. I finally decided to make the jump.</p><p>First, let me present the parts:</p><ul><li>AMD Ryzen&#x2122; 5 1600 Processor (second hand, 250 TND / 88 USD)</li><li>MSI B450M-A PRO MAX motherboard (220 TND / 77 USD)</li><li>2 Silicon Power 8GB DDR4 2400MHz Modules (218 TND / 76 USD)</li></ul><p>Total upgrade cost : 688 TND / 242 USD.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2020/06/IMG_1850-1.jpg" class="kg-image" alt="Switching to Ryzen" loading="lazy"></figure><p>Putting these parts together was relatively easy. Please notice that I put the <em>perfect</em> amount of thermal paste (PC joke). I really like the stock cooler, it feels better than Intel&apos;s one: bigger fan and more aluminum.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/06/IMG_1852-1.jpg" width="2000" height="1333" loading="lazy" alt="Switching to Ryzen" srcset="https://aminebenhariz.com/content/images/size/w600/2020/06/IMG_1852-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2020/06/IMG_1852-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2020/06/IMG_1852-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2020/06/IMG_1852-1.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/06/IMG_1855-1.jpg" width="2000" height="1333" loading="lazy" alt="Switching to Ryzen" srcset="https://aminebenhariz.com/content/images/size/w600/2020/06/IMG_1855-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2020/06/IMG_1855-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2020/06/IMG_1855-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2020/06/IMG_1855-1.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/06/IMG_1858-1.jpg" width="2000" height="1333" loading="lazy" alt="Switching to Ryzen" srcset="https://aminebenhariz.com/content/images/size/w600/2020/06/IMG_1858-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2020/06/IMG_1858-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2020/06/IMG_1858-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2020/06/IMG_1858-1.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>After removing the old motherboard and replacing it with the new one, I turned the PC on. The micro ATX motherboard is tiny compared to the case (Corsair Carbide 400C) and GPU (MSI ARMOR GTX 1060).</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2020/06/IMG_1863-1.jpg" class="kg-image" alt="Switching to Ryzen" loading="lazy"></figure><p>The first thing I did was checking the BIOS settings. Everything seemed fine: CPU, memory, temperature, fans, hard disks.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2020/06/IMG_1860-1.jpg" class="kg-image" alt="Switching to Ryzen" loading="lazy"></figure><p>Here is a comparison between the old and new system. Better performance and lower TDP. Also, the GPU will take advange of the new PCIe v3.0 bandwidth.</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/06/i7-2600_GeForce-1060.PNG" width="667" height="597" loading="lazy" alt="Switching to Ryzen" srcset="https://aminebenhariz.com/content/images/size/w600/2020/06/i7-2600_GeForce-1060.PNG 600w, https://aminebenhariz.com/content/images/2020/06/i7-2600_GeForce-1060.PNG 667w"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2020/06/Ryzen-5-1600_GeForce-1060.png" width="662" height="594" loading="lazy" alt="Switching to Ryzen" srcset="https://aminebenhariz.com/content/images/size/w600/2020/06/Ryzen-5-1600_GeForce-1060.png 600w, https://aminebenhariz.com/content/images/2020/06/Ryzen-5-1600_GeForce-1060.png 662w"></div></div></div><figcaption>HWiNFO Comparison</figcaption></figure><p>I&apos;m already seeing a big jump in video transcoding times (Adobe Premiere) and RAW to JPEG exporting (Adobe Lightroom). Can&apos;t wait for the Ryzen 5 3600 prices to go down here in Tunisia, so I can upgrade (same AM4 socket).</p>]]></content:encoded></item><item><title><![CDATA[Solving the Soma cube in 3D]]></title><description><![CDATA[<p>I bought this wooden puzzle few weeks ago from the flea market for 3 TND ($1). The build quality is quite good. It&apos;s composed of 7 different pieces that must be assembled in a 3x3x3 cube.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/IMG_0466.jpg" class="kg-image" alt loading="lazy"></figure><p>Solving this puzzle manually is complicated. There is no apparent solution other</p>]]></description><link>https://aminebenhariz.com/soma-cube-solving-the-puzzle-3d/</link><guid isPermaLink="false">5c600ad16a1c32362c047a1d</guid><category><![CDATA[Puzzle]]></category><category><![CDATA[WebDev]]></category><category><![CDATA[three.js]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Soma Cube]]></category><category><![CDATA[Flea Market]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Wed, 21 Nov 2018 19:00:22 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2018/11/IMG_0468.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2018/11/IMG_0468.jpg" alt="Solving the Soma cube in 3D"><p>I bought this wooden puzzle few weeks ago from the flea market for 3 TND ($1). The build quality is quite good. It&apos;s composed of 7 different pieces that must be assembled in a 3x3x3 cube.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/IMG_0466.jpg" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><p>Solving this puzzle manually is complicated. There is no apparent solution other than brute-force. I took it to my workplace, and timed my co-workers while they reconstructed the cube. The results were irregular: fastest was 2 minutes, and slowest resolving exceeded 1 hour.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/IMG_0469-1.jpg" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><p>In this post, we will solve the Soma cube puzzle with PHP. According to Wikipedia, there are 240 distinct solutions (after removing all rotations and mirrors).</p><p>Here is a 3D animation on how to solve, step by step, the Soma cube in every distinct way:</p><!--kg-card-begin: html-->	<div>
		<label for="solution">Solution: </label>
		<select id="solution">
<option value="1A:(0,0,0) 6K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5A:(0,1,0) 4F:(0,0,1) 2A:(0,0,2)">1</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 7D:(1,2,0) 5A:(0,1,0) 6A:(1,1,1) 4F:(0,0,1) 2A:(0,0,2)">2</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4L:(0,1,0) 5C:(2,1,0) 6H:(2,2,1) 7E:(0,1,2) 2A:(1,0,2)">3</option>
			<option value="1A:(0,0,0) 2B:(2,1,0) 5J:(2,0,0) 6J:(0,1,0) 7H:(1,2,2) 4E:(0,0,1) 3A:(0,0,2)">4</option>
			<option value="1A:(0,0,0) 2B:(2,1,0) 4J:(2,0,0) 5L:(0,1,0) 6F:(1,1,1) 7E:(0,1,2) 3B:(2,0,2)">5</option>
			<option value="1A:(0,0,0) 2B:(2,1,0) 4J:(0,1,0) 5F:(2,1,1) 6K:(2,0,0) 7F:(1,0,2) 3C:(2,2,2)">6</option>
			<option value="1A:(0,0,0) 2B:(2,1,0) 4J:(2,0,0) 7E:(0,0,1) 3G:(0,0,2) 6C:(1,2,1) 5K:(2,2,1)">7</option>
			<option value="1A:(0,0,0) 2B:(2,1,0) 3J:(2,0,0) 5L:(0,1,0) 6F:(1,1,1) 7E:(0,1,2) 4C:(0,0,2)">8</option>
			<option value="1A:(0,0,0) 2B:(2,1,0) 3K:(2,0,0) 5E:(1,1,1) 6J:(0,1,0) 7F:(1,0,2) 4B:(2,1,2)">9</option>
			<option value="1A:(0,0,0) 2B:(2,1,0) 3K:(2,0,0) 4L:(0,1,0) 6C:(2,1,1) 5D:(1,2,1) 7E:(0,1,2)">10</option>
			<option value="1A:(0,0,0) 2B:(2,1,0) 3K:(2,0,0) 4L:(0,1,0) 6F:(1,1,1) 7E:(0,1,2) 5K:(2,1,1)">11</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 7F:(1,1,1) 2B:(2,1,2) 5B:(1,0,1) 6K:(2,0,1)">12</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4C:(0,1,1) 5B:(1,0,1) 6K:(2,0,1) 2B:(2,1,2)">13</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 7F:(1,1,1) 2B:(2,1,2) 5B:(1,0,1) 6K:(2,0,1)">14</option>
			<option value="1A:(0,0,0) 4L:(0,1,0) 7D:(1,2,0) 3J:(2,0,0) 6I:(0,2,0) 2B:(2,1,2) 5J:(1,0,1)">15</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 7D:(1,2,0) 5A:(0,1,0) 6D:(0,1,1) 4G:(2,1,1) 2B:(2,1,2)">16</option>
			<option value="1A:(0,0,0) 4K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5A:(0,1,0) 6F:(0,0,1) 2C:(1,2,2)">17</option>
			<option value="1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 3J:(2,0,0) 6I:(0,2,0) 2C:(1,2,2) 4A:(1,0,2)">18</option>
			<option value="1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 4J:(2,0,0) 6I:(0,2,0) 2D:(0,1,2) 3D:(0,2,2)">19</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 4L:(2,2,0) 6F:(0,0,1) 2D:(0,1,2) 3G:(0,2,2)">20</option>
			<option value="1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 3I:(0,2,0) 4J:(2,0,0) 6J:(1,1,1) 2D:(0,1,2)">21</option>
			<option value="1A:(0,0,0) 2E:(0,1,0) 4F:(2,0,0) 5G:(1,2,1) 6H:(1,1,1) 7G:(2,1,2) 3D:(0,2,2)">22</option>
			<option value="1A:(0,0,0) 2E:(0,1,0) 4F:(2,0,0) 5H:(0,2,1) 6A:(1,0,1) 7F:(1,0,2) 3G:(0,2,2)">23</option>
			<option value="1A:(0,0,0) 2E:(0,1,0) 4F:(2,0,0) 6A:(1,0,1) 7B:(1,1,1) 3G:(0,2,2) 5I:(0,0,1)">24</option>
			<option value="1A:(0,0,0) 2E:(0,1,0) 4C:(0,1,1) 5C:(2,1,0) 6I:(0,2,1) 7F:(1,0,2) 3H:(2,0,2)">25</option>
			<option value="1A:(0,0,0) 2E:(0,1,0) 3K:(2,0,0) 4J:(2,1,0) 6D:(1,2,1) 5A:(0,1,1) 7F:(1,0,2)">26</option>
			<option value="1A:(0,0,0) 2E:(0,1,0) 3K:(2,0,0) 4J:(2,1,0) 6G:(1,1,1) 7F:(1,0,2) 5L:(1,2,1)">27</option>
			<option value="1A:(0,0,0) 2E:(0,1,0) 3K:(2,0,0) 4K:(2,1,0) 5D:(1,2,1) 6D:(0,1,1) 7E:(0,1,2)">28</option>
			<option value="1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 4J:(2,0,0) 6I:(0,2,0) 2E:(0,1,2) 3B:(2,0,2)">29</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 6A:(1,0,1) 7F:(1,1,1) 2E:(0,1,2) 5I:(0,0,1)">30</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 6A:(1,0,1) 7A:(0,1,0) 4C:(0,1,1) 5I:(0,0,1) 2E:(0,1,2)">31</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 6A:(1,0,1) 7F:(1,1,1) 2E:(0,1,2) 5I:(0,0,1)">32</option>
			<option value="1A:(0,0,0) 7D:(1,2,0) 4J:(2,0,0) 5A:(0,1,0) 6F:(0,0,1) 2E:(0,1,2) 3G:(0,0,2)">33</option>
			<option value="1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 3J:(2,0,0) 6I:(0,2,0) 2E:(0,1,2) 4C:(0,0,2)">34</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4L:(0,1,0) 7D:(1,2,0) 6I:(0,2,0) 2E:(0,1,2) 5K:(2,1,1)">35</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 6A:(1,0,1) 7A:(0,1,0) 4A:(0,0,1) 5K:(2,2,1) 2F:(1,0,2)">36</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4H:(0,2,0) 6A:(1,0,1) 7H:(0,2,1) 2F:(1,0,2) 5K:(2,2,1)">37</option>
			<option value="1A:(0,0,0) 4H:(0,2,0) 6K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5D:(0,2,1) 2F:(1,0,2)">38</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 4K:(2,2,0) 6F:(0,0,1) 2F:(1,0,2) 3H:(2,0,2)">39</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4H:(0,2,0) 7D:(1,2,0) 6A:(1,1,1) 5D:(0,2,1) 2F:(1,0,2)">40</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4H:(0,2,0) 7D:(1,2,0) 6E:(0,2,1) 2F:(1,0,2) 5J:(2,1,1)">41</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 5H:(1,1,1) 7A:(0,1,0) 4G:(2,2,1) 6D:(0,1,1) 2G:(2,2,2)">42</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 5C:(2,2,0) 7A:(0,1,0) 4G:(2,2,1) 6D:(0,1,1) 2G:(2,2,2)">43</option>
			<option value="1A:(0,0,0) 2H:(1,2,0) 4H:(0,2,0) 5E:(1,0,1) 6F:(1,1,1) 7E:(0,1,2) 3B:(2,0,2)">44</option>
			<option value="1A:(0,0,0) 2H:(1,2,0) 4H:(0,2,0) 5F:(2,0,1) 6C:(1,2,1) 7H:(1,2,2) 3G:(0,0,2)">45</option>
			<option value="1A:(0,0,0) 2H:(1,2,0) 4H:(0,2,0) 6C:(1,2,1) 7D:(1,1,1) 3G:(0,0,2) 5K:(2,2,1)">46</option>
			<option value="1A:(0,0,0) 2H:(1,2,0) 4C:(0,0,1) 5A:(0,1,0) 6K:(2,0,1) 7H:(1,2,2) 3H:(0,0,2)">47</option>
			<option value="1A:(0,0,0) 2H:(1,2,0) 3I:(0,2,0) 4I:(0,1,0) 5B:(1,0,1) 6B:(2,1,1) 7G:(2,1,2)">48</option>
			<option value="1A:(0,0,0) 2H:(1,2,0) 3I:(0,2,0) 4L:(0,1,0) 6B:(1,0,1) 5C:(2,1,1) 7H:(1,2,2)">49</option>
			<option value="1A:(0,0,0) 2H:(1,2,0) 3I:(0,2,0) 4L:(0,1,0) 6E:(1,1,1) 7H:(1,2,2) 5J:(1,0,1)">50</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4J:(0,1,0) 5C:(2,1,0) 6H:(2,2,1) 7F:(1,0,2) 2H:(1,2,2)">51</option>
			<option value="1A:(0,0,0) 2I:(0,2,1) 4F:(2,0,0) 5I:(0,1,0) 6A:(1,0,1) 7F:(1,0,2) 3D:(0,2,2)">52</option>
			<option value="1A:(0,0,0) 2I:(0,2,1) 4F:(2,0,0) 6I:(0,1,0) 7F:(1,0,2) 3G:(0,2,2) 5J:(2,0,1)">53</option>
			<option value="1A:(0,0,0) 2I:(0,2,1) 4F:(2,0,0) 7E:(0,0,1) 3G:(0,2,2) 5J:(2,0,1) 6K:(1,0,1)">54</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 5G:(1,2,0) 6H:(1,1,1) 7G:(2,1,2) 2I:(0,2,2) 4C:(0,1,2)">55</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 5H:(1,1,1) 6F:(0,1,0) 7H:(1,2,2) 2J:(0,0,2) 4D:(1,0,2)">56</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 5C:(2,2,0) 6F:(0,1,0) 7H:(1,2,2) 2J:(0,0,2) 4D:(1,0,2)">57</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 7A:(0,1,0) 4A:(0,0,1) 6B:(2,1,1) 3A:(0,0,2) 5I:(1,0,1)">58</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4H:(0,2,0) 7H:(0,2,1) 3A:(0,0,2) 6B:(2,1,1) 5I:(1,0,1)">59</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4C:(0,0,1) 7A:(0,1,0) 3B:(2,0,2) 5D:(1,2,1) 6J:(0,1,1)">60</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4C:(0,0,1) 5G:(1,2,0) 6C:(1,2,1) 7H:(1,2,2) 3B:(2,0,2)">61</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4E:(0,2,0) 5L:(0,1,0) 6A:(1,1,1) 7E:(0,1,2) 3B:(2,0,2)">62</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4A:(1,0,1) 6F:(0,1,0) 3C:(2,2,2) 5A:(0,1,1) 7F:(1,0,2)">63</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4A:(1,0,1) 7A:(0,1,0) 3C:(2,2,2) 6D:(0,1,1) 5K:(1,2,1)">64</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4H:(0,2,0) 5C:(1,1,1) 6I:(1,2,0) 7E:(0,1,2) 3C:(2,2,2)">65</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 7A:(0,1,0) 4C:(0,1,1) 5B:(1,0,1) 6L:(2,1,1) 3D:(0,2,2)">66</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4E:(0,2,0) 7F:(1,1,1) 3D:(0,2,2) 5B:(1,0,1) 6L:(2,1,1)">67</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 7A:(0,1,0) 4G:(2,2,1) 6A:(1,1,1) 5A:(0,0,1) 3G:(0,0,2)">68</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4H:(0,2,0) 6I:(1,2,0) 7E:(0,1,2) 3G:(0,0,2) 5I:(1,1,1)">69</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4H:(0,2,0) 5L:(1,2,0) 6L:(2,2,1) 7E:(0,1,2) 3G:(0,0,2)">70</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4E:(0,0,1) 7A:(0,1,0) 6C:(1,1,1) 5C:(2,2,1) 3G:(0,2,2)">71</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4H:(2,2,1) 7A:(0,1,0) 5A:(1,1,1) 6A:(0,0,1) 3H:(0,0,2)">72</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4E:(0,2,0) 6I:(0,1,0) 7E:(0,1,2) 3H:(2,0,2) 5I:(0,0,1)">73</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 4E:(0,2,0) 5L:(0,1,0) 6L:(1,1,1) 7E:(0,1,2) 3H:(2,0,2)">74</option>
			<option value="1A:(0,0,0) 2J:(2,0,1) 7A:(0,1,0) 4F:(0,0,1) 5C:(1,1,1) 6C:(2,2,1) 3H:(2,0,2)">75</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 2K:(2,0,2) 5L:(0,1,1) 6F:(1,1,1) 4B:(2,1,2)">76</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 5G:(1,2,0) 6F:(1,1,1) 7E:(0,1,2) 2K:(2,0,2) 4C:(0,0,2)">77</option>
			<option value="1A:(0,0,0) 6B:(2,0,0) 7A:(0,1,0) 2K:(2,0,2) 3K:(2,2,0) 4B:(2,1,2) 5L:(0,1,1)">78</option>
			<option value="1A:(0,0,0) 5G:(1,2,0) 6B:(2,0,0) 2K:(2,0,2) 3K:(2,2,0) 4C:(0,0,2) 7E:(0,1,2)">79</option>
			<option value="1A:(0,0,0) 2K:(2,2,1) 4E:(0,2,1) 5C:(2,1,0) 6L:(2,1,1) 7E:(0,0,1) 3A:(0,0,2)">80</option>
			<option value="1A:(0,0,0) 2K:(2,2,1) 4E:(0,2,1) 5L:(0,1,0) 6B:(2,0,0) 7G:(2,1,2) 3A:(0,0,2)">81</option>
			<option value="1A:(0,0,0) 2K:(2,2,1) 4J:(0,1,0) 5C:(2,1,0) 6G:(2,1,1) 7F:(1,0,2) 3C:(2,2,2)">82</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 4L:(0,1,0) 5D:(0,2,0) 6H:(2,1,1) 7E:(0,1,2) 3C:(2,2,2)">83</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 5G:(1,2,0) 4B:(2,1,1) 6A:(1,0,1) 7F:(1,0,2) 3D:(0,2,2)">84</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 7A:(0,1,0) 4F:(0,0,1) 5A:(1,1,1) 6B:(2,0,1) 3G:(0,0,2)">85</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 5F:(2,0,1) 7A:(0,1,0) 4F:(0,0,1) 6I:(1,2,1) 3G:(0,0,2)">86</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 4F:(2,0,1) 7A:(0,1,0) 6B:(1,1,1) 5A:(0,0,1) 3G:(0,0,2)">87</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 4F:(2,0,1) 7A:(0,1,0) 6F:(0,0,1) 3G:(0,0,2) 5K:(1,2,1)">88</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 7A:(0,1,0) 5A:(1,1,1) 6B:(2,0,1) 4E:(0,0,1) 3H:(0,0,2)">89</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 5F:(2,0,1) 7A:(0,1,0) 4E:(0,0,1) 6I:(1,2,1) 3H:(0,0,2)">90</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 6F:(0,1,0) 4B:(2,0,1) 5I:(0,0,1) 7E:(0,1,2) 3H:(2,0,2)">91</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 7A:(0,1,0) 6B:(1,1,1) 5A:(0,0,1) 4G:(2,0,1) 3H:(2,0,2)">92</option>
			<option value="1A:(0,0,0) 2L:(2,2,1) 7A:(0,1,0) 6F:(0,0,1) 4G:(2,0,1) 5K:(1,2,1) 3H:(2,0,2)">93</option>
			<option value="1A:(0,0,0) 7A:(0,1,0) 5F:(1,0,1) 6B:(2,1,0) 3D:(0,2,2) 4J:(2,0,0) 2M:(0,0,1)">94</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 6F:(0,1,0) 7B:(1,1,1) 2M:(0,0,1) 4L:(2,2,0) 3D:(0,2,2)">95</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 2M:(0,0,1) 4L:(2,2,0) 6H:(1,2,1) 3D:(0,2,2)">96</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4B:(2,0,1) 5K:(1,2,1) 6L:(2,2,1) 2M:(0,0,1)">97</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 7H:(1,2,2) 4B:(2,0,1) 5L:(0,2,1) 2M:(0,0,1)">98</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 6F:(0,1,0) 7B:(1,1,1) 2M:(0,0,1) 3L:(2,2,0) 4B:(2,1,2)">99</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 2M:(0,0,1) 3L:(2,2,0) 6H:(1,2,1) 4B:(2,1,2)">100</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 6F:(0,1,0) 2M:(0,0,1) 3L:(2,2,0) 4E:(0,1,1) 7E:(0,1,2)">101</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 6F:(0,1,0) 7A:(0,0,1) 3B:(2,0,2) 4L:(2,2,0) 2M:(0,2,1)">102</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 6I:(0,1,0) 7F:(1,0,2) 2M:(0,2,1) 5J:(2,0,1)">103</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 7E:(0,0,1) 2M:(0,2,1) 5J:(2,0,1) 6K:(1,0,1)">104</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 6I:(0,1,0) 7F:(1,0,2) 2M:(0,2,1) 5J:(2,0,1)">105</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 7E:(0,0,1) 2M:(0,2,1) 5J:(2,0,1) 6K:(1,0,1)">106</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4H:(0,2,0) 6K:(1,0,1) 7E:(1,1,1) 2M:(0,2,1) 5J:(2,0,1)">107</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 4D:(1,0,1) 5K:(2,2,1) 7G:(2,1,2) 2N:(0,0,1)">108</option>
			<option value="1A:(0,0,0) 4K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5A:(0,1,0) 6A:(0,1,1) 2N:(0,0,1)">109</option>
			<option value="1A:(0,0,0) 4K:(2,0,0) 6D:(0,2,0) 7D:(1,2,0) 3H:(2,0,2) 5D:(0,2,1) 2N:(0,0,1)">110</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 6D:(0,2,0) 7D:(1,2,0) 4E:(0,2,1) 5K:(2,1,1) 2N:(0,0,1)">111</option>
			<option value="1A:(0,0,0) 6B:(2,0,0) 7A:(0,1,0) 4K:(2,2,0) 5H:(0,1,1) 2N:(2,0,1) 3A:(0,0,2)">112</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 6I:(0,1,0) 7E:(0,1,2) 2N:(2,0,1) 5I:(0,0,1)">113</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 5L:(0,1,0) 6L:(1,1,1) 7E:(0,1,2) 2N:(2,0,1)">114</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 6I:(0,1,0) 7E:(0,1,2) 2N:(2,0,1) 5I:(0,0,1)">115</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 5L:(0,1,0) 6L:(1,1,1) 7E:(0,1,2) 2N:(2,0,1)">116</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4F:(0,0,1) 5C:(1,1,1) 6C:(2,2,1) 2N:(2,0,1)">117</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4G:(2,2,1) 5I:(1,1,1) 6G:(1,0,1) 2O:(2,0,1)">118</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4A:(0,0,1) 5J:(2,0,1) 6K:(1,0,1) 2O:(2,2,1)">119</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 4D:(1,0,1) 5J:(2,0,1) 7F:(1,0,2) 2O:(2,2,1)">120</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4H:(0,2,0) 6K:(1,0,1) 7H:(0,2,1) 2O:(2,2,1) 5J:(2,0,1)">121</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 5E:(0,0,1) 6F:(0,1,0) 7G:(2,1,2) 4H:(0,2,1) 2O:(2,2,1)">122</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 7C:(1,1,1) 4H:(0,2,1) 5J:(2,0,1) 2O:(2,2,1)">123</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 6E:(1,2,0) 5A:(0,1,0) 7A:(0,0,1) 2O:(2,2,1) 4C:(0,0,2)">124</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 6E:(1,2,0) 5A:(0,1,0) 2O:(2,2,1) 4E:(0,1,1) 7F:(1,0,2)">125</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 5L:(0,1,0) 6J:(1,1,1) 7G:(2,1,2) 2P:(0,2,1)">126</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 5L:(0,1,0) 6J:(1,1,1) 7G:(2,1,2) 2P:(0,2,1)">127</option>
			<option value="1A:(0,0,0) 4H:(0,2,0) 7D:(1,2,0) 2P:(0,2,1) 3J:(2,0,0) 5A:(1,1,1) 6J:(1,0,1)">128</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4H:(0,2,0) 5F:(2,1,0) 6B:(2,1,1) 7E:(1,0,2) 2P:(0,2,1)">129</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4H:(0,2,0) 5F:(2,1,0) 6C:(2,1,1) 7H:(1,2,2) 2P:(0,2,1)">130</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4L:(0,1,0) 6B:(2,0,0) 7E:(0,1,2) 5B:(2,0,1) 2P:(2,2,1)">131</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4L:(0,1,0) 5C:(2,1,0) 6C:(2,1,1) 7E:(0,1,2) 2P:(2,2,1)">132</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 4B:(2,0,1) 5I:(0,0,1) 7E:(0,1,2) 2P:(2,2,1)">133</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 6B:(1,1,1) 5A:(0,0,1) 4G:(2,0,1) 2P:(2,2,1)">134</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 6F:(0,0,1) 4G:(2,0,1) 5K:(1,2,1) 2P:(2,2,1)">135</option>
			<option value="1A:(0,0,0) 2Q:(0,2,0) 4J:(0,1,0) 5C:(2,1,0) 6L:(2,2,0) 7F:(1,0,2) 3C:(2,2,2)">136</option>
			<option value="1A:(0,0,0) 2Q:(0,2,0) 3F:(2,0,0) 4J:(0,1,0) 5H:(1,1,1) 6L:(2,2,1) 7F:(1,0,2)">137</option>
			<option value="1A:(0,0,0) 2Q:(0,2,0) 3K:(2,0,0) 4J:(0,1,0) 5C:(2,2,0) 6L:(2,2,1) 7F:(1,0,2)">138</option>
			<option value="1A:(0,0,0) 2Q:(0,2,0) 4J:(0,1,0) 5C:(2,1,0) 7F:(1,0,2) 3L:(2,2,0) 6I:(1,1,1)">139</option>
			<option value="1A:(0,0,0) 2Q:(1,2,0) 4H:(0,2,0) 5C:(2,1,0) 6L:(2,1,1) 7D:(0,2,1) 3A:(0,0,2)">140</option>
			<option value="1A:(0,0,0) 2Q:(1,2,0) 4I:(0,2,0) 5C:(2,1,0) 6L:(2,1,1) 7E:(0,0,1) 3A:(0,0,2)">141</option>
			<option value="1A:(0,0,0) 2Q:(1,2,0) 4I:(0,2,0) 5L:(0,1,0) 6B:(2,0,0) 7G:(2,1,2) 3A:(0,0,2)">142</option>
			<option value="1A:(0,0,0) 2Q:(1,2,0) 3I:(0,2,0) 5C:(2,1,0) 6L:(2,1,1) 7E:(0,0,1) 4A:(0,0,2)">143</option>
			<option value="1A:(0,0,0) 2Q:(1,2,0) 3I:(0,2,0) 5L:(0,1,0) 6B:(2,0,0) 7G:(2,1,2) 4A:(0,0,2)">144</option>
			<option value="1A:(0,0,0) 2Q:(1,2,0) 3I:(0,2,0) 4L:(0,1,0) 5C:(2,1,0) 6L:(2,1,1) 7G:(1,2,2)">145</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 6G:(1,0,1) 7D:(1,2,0) 4J:(2,0,0) 5A:(1,1,1) 3B:(2,0,2)">146</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 3F:(2,0,0) 4I:(1,2,0) 6A:(0,1,1) 5B:(1,0,1) 7G:(2,1,2)">147</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 3F:(2,0,0) 4I:(1,2,0) 6H:(1,1,1) 7G:(2,1,2) 5I:(0,1,1)">148</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 4K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5E:(0,1,1) 6J:(0,0,1)">149</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 4K:(2,0,0) 5G:(1,1,1) 7D:(1,2,0) 3H:(2,0,2) 6L:(1,2,1)">150</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 6G:(1,0,1) 7D:(1,2,0) 3J:(2,0,0) 5A:(1,1,1) 4C:(0,0,2)">151</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 5F:(2,1,0) 6B:(2,1,1) 7A:(0,0,1) 4C:(0,0,2)">152</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 5F:(2,1,0) 6D:(0,1,1) 7C:(2,2,1) 4C:(0,1,2)">153</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 6D:(0,1,1) 7D:(1,2,0) 5H:(1,2,1) 4C:(0,1,2)">154</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 5F:(2,1,0) 6B:(2,1,1) 4E:(0,1,1) 7F:(1,0,2)">155</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 5F:(2,1,0) 6D:(0,1,1) 4G:(2,1,1) 7H:(1,2,2)">156</option>
			<option value="1A:(0,0,0) 2R:(0,1,0) 5C:(2,1,0) 6L:(1,2,0) 7F:(1,0,2) 3L:(2,2,0) 4D:(2,0,2)">157</option>
			<option value="1A:(0,0,0) 2R:(2,1,0) 4J:(2,0,0) 7A:(0,1,0) 6B:(1,1,1) 5A:(0,0,1) 3G:(0,0,2)">158</option>
			<option value="1A:(0,0,0) 2R:(2,1,0) 4J:(2,0,0) 7A:(0,1,0) 6F:(0,0,1) 3G:(0,0,2) 5K:(1,2,1)">159</option>
			<option value="1A:(0,0,0) 2R:(2,1,0) 3J:(2,0,0) 4L:(0,1,0) 5D:(0,2,0) 6J:(1,0,1) 7E:(0,1,2)">160</option>
			<option value="1A:(0,0,0) 2R:(2,1,0) 3K:(2,0,0) 5D:(0,2,0) 6K:(2,1,1) 4J:(0,1,0) 7F:(1,0,2)">161</option>
			<option value="1A:(0,0,0) 2S:(1,2,0) 3F:(2,0,0) 5L:(0,1,0) 6F:(1,1,1) 7G:(2,1,2) 4A:(0,0,2)">162</option>
			<option value="1A:(0,0,0) 2S:(1,2,0) 3K:(2,0,0) 4I:(0,1,0) 6B:(2,1,0) 7F:(1,0,2) 5J:(2,1,1)">163</option>
			<option value="1A:(0,0,0) 2S:(1,2,0) 3K:(2,0,0) 4L:(0,1,0) 6B:(2,1,0) 7H:(0,1,2) 5J:(2,1,1)">164</option>
			<option value="1A:(0,0,0) 2S:(1,2,0) 3K:(2,2,0) 5C:(2,1,0) 6L:(2,1,1) 7E:(0,0,1) 4A:(0,0,2)">165</option>
			<option value="1A:(0,0,0) 2S:(1,2,0) 3K:(2,2,0) 5L:(0,1,0) 6B:(2,0,0) 7G:(2,1,2) 4A:(0,0,2)">166</option>
			<option value="1A:(0,0,0) 2S:(1,2,0) 3K:(2,2,0) 4L:(0,1,0) 5C:(2,1,0) 6L:(2,1,1) 7G:(1,2,2)">167</option>
			<option value="1A:(0,0,0) 2T:(0,2,0) 3F:(2,0,0) 4K:(1,2,0) 6H:(1,1,1) 7G:(2,1,2) 5K:(2,2,1)">168</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 7A:(0,1,0) 4K:(2,2,0) 5H:(0,1,1) 6A:(1,1,1) 3A:(0,0,2)">169</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 6B:(2,1,1) 5A:(1,0,1) 7F:(1,0,2)">170</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 5B:(1,0,1) 6B:(2,1,1) 7E:(1,0,2)">171</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 5B:(1,0,1) 6C:(2,1,1) 7H:(1,2,2)">172</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 5G:(2,1,1) 6J:(0,0,1) 7H:(1,2,2)">173</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 6F:(1,0,1) 7F:(1,0,2) 5K:(2,2,1)">174</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4L:(0,1,0) 5E:(1,1,1) 6J:(1,0,1) 7E:(0,1,2)">175</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4L:(0,1,0) 5G:(2,1,1) 6L:(2,2,1) 7E:(0,1,2)">176</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 4L:(2,2,0) 7A:(0,1,0) 5A:(1,1,1) 6A:(0,0,1) 3H:(0,0,2)">177</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 7A:(0,1,0) 3K:(2,2,0) 4F:(0,0,1) 5C:(1,1,1) 6K:(2,1,1)">178</option>
			<option value="1A:(0,0,0) 2T:(2,1,0) 3L:(2,2,0) 4L:(0,1,0) 5D:(0,2,0) 6J:(1,0,1) 7E:(0,1,2)">179</option>
			<option value="1A:(0,0,0) 2T:(2,2,0) 3K:(2,0,0) 4I:(1,2,0) 6D:(0,2,0) 7E:(0,1,2) 5I:(0,0,1)">180</option>
			<option value="1A:(0,0,0) 2T:(2,2,0) 3K:(2,0,0) 6D:(0,2,0) 7F:(1,0,2) 4K:(1,2,0) 5K:(2,2,1)">181</option>
			<option value="1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 2U:(1,0,2) 4I:(0,2,0) 6A:(1,1,1) 3A:(0,0,2)">182</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4J:(0,1,0) 5K:(2,1,0) 6J:(0,0,1) 7H:(1,2,2) 2U:(1,0,2)">183</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4L:(0,1,0) 5K:(2,1,0) 6L:(2,2,1) 7E:(0,1,2) 2U:(1,0,2)">184</option>
			<option value="1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 2U:(1,0,2) 3I:(0,2,0) 6A:(1,1,1) 4A:(0,0,2)">185</option>
			<option value="1A:(0,0,0) 4I:(0,1,0) 5B:(1,0,1) 6E:(1,2,0) 2U:(1,0,2) 3I:(0,2,0) 7H:(1,2,2)">186</option>
			<option value="1A:(0,0,0) 4L:(0,1,0) 6B:(1,0,1) 7D:(1,2,0) 2U:(1,0,2) 3I:(0,2,0) 5J:(2,1,1)">187</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 6L:(2,1,1) 7A:(0,1,0) 4A:(0,0,1) 2U:(1,2,2) 3A:(0,0,2)">188</option>
			<option value="1A:(0,0,0) 4H:(0,2,0) 5C:(2,1,0) 6L:(2,1,1) 7H:(0,2,1) 2U:(1,2,2) 3A:(0,0,2)">189</option>
			<option value="1A:(0,0,0) 4L:(0,1,0) 7D:(1,2,0) 2V:(0,1,2) 3J:(2,0,0) 5A:(1,1,1) 6J:(1,0,1)">190</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 5F:(2,1,0) 6B:(2,1,1) 7E:(0,0,1) 2V:(0,1,2) 4C:(0,0,2)">191</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4L:(0,1,0) 5F:(2,1,0) 6B:(2,1,1) 7E:(1,0,2) 2V:(0,1,2)">192</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4L:(0,1,0) 5F:(2,1,0) 6C:(2,1,1) 7H:(1,2,2) 2V:(0,1,2)">193</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4J:(0,1,0) 6K:(2,0,0) 7F:(1,0,2) 2V:(2,0,2) 5K:(2,2,1)">194</option>
			<option value="1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 4F:(0,0,1) 6G:(2,1,1) 2V:(2,1,2) 3B:(2,0,2)">195</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4K:(2,1,0) 6F:(0,1,0) 2V:(2,1,2) 5A:(0,1,1) 7F:(1,0,2)">196</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4K:(2,1,0) 7A:(0,1,0) 2V:(2,1,2) 6D:(0,1,1) 5K:(1,2,1)">197</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4I:(1,2,0) 6I:(0,1,0) 7F:(1,0,2) 2W:(1,2,2) 5J:(2,0,1)">198</option>
			<option value="1A:(0,0,0) 3F:(2,0,0) 4I:(1,2,0) 7E:(0,0,1) 2W:(1,2,2) 5J:(2,0,1) 6K:(1,0,1)">199</option>
			<option value="1A:(0,0,0) 4K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5I:(0,1,0) 6J:(0,0,1) 2W:(1,2,2)">200</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4I:(0,1,0) 6E:(1,2,0) 7F:(1,0,2) 5D:(1,2,1) 2W:(1,2,2)">201</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 4L:(0,1,0) 6E:(1,2,0) 7H:(0,1,2) 5D:(1,2,1) 2W:(1,2,2)">202</option>
			<option value="1A:(0,0,0) 6K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 4I:(0,2,0) 5I:(0,0,1) 2X:(0,2,2)">203</option>
			<option value="1A:(0,0,0) 3K:(2,0,0) 7D:(1,2,0) 4I:(0,2,0) 6A:(1,1,1) 2X:(0,2,2) 5I:(0,0,1)">204</option>
			<option value="1A:(0,0,0) 7A:(0,1,0) 6B:(2,1,0) 4C:(0,0,1) 5L:(0,1,1) 2X:(2,1,2) 3D:(0,2,2)">205</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4J:(2,1,0) 6I:(0,1,0) 7E:(0,1,2) 2X:(2,1,2) 5I:(0,0,1)">206</option>
			<option value="1A:(0,0,0) 3E:(0,2,0) 4J:(2,1,0) 5L:(0,1,0) 6L:(1,1,1) 7E:(0,1,2) 2X:(2,1,2)">207</option>
			<option value="2B:(2,1,0) 4B:(2,0,0) 1A:(0,1,1) 3I:(0,0,0) 5C:(2,1,1) 6L:(2,2,1) 7E:(0,1,2)">208</option>
			<option value="2B:(2,1,0) 4B:(2,0,0) 1A:(0,1,1) 3I:(0,0,0) 5L:(0,2,1) 6B:(2,1,1) 7G:(2,1,2)">209</option>
			<option value="2C:(1,2,0) 3C:(2,2,0) 4K:(1,0,0) 5C:(2,1,1) 1A:(0,1,1) 6L:(2,2,1) 7E:(0,1,2)">210</option>
			<option value="2C:(1,2,0) 3C:(2,2,0) 4K:(1,0,0) 1A:(0,1,1) 5L:(0,2,1) 6B:(2,1,1) 7G:(2,1,2)">211</option>
			<option value="2D:(0,1,0) 3D:(0,2,0) 4J:(2,1,0) 1A:(0,1,1) 5B:(1,0,1) 6I:(0,2,1) 7G:(2,1,2)">212</option>
			<option value="2D:(0,1,0) 3D:(0,2,0) 4J:(2,1,0) 6A:(1,0,1) 1A:(0,1,1) 5I:(0,0,1) 7E:(0,1,2)">213</option>
			<option value="2D:(0,1,0) 4B:(2,1,0) 1A:(0,1,1) 3L:(2,2,0) 5B:(1,0,1) 6I:(0,2,1) 7G:(2,1,2)">214</option>
			<option value="2D:(0,1,0) 4B:(2,1,0) 1A:(0,1,1) 3L:(2,2,0) 6A:(1,0,1) 7E:(0,1,2) 5I:(0,0,1)">215</option>
			<option value="2I:(0,2,1) 5G:(1,1,0) 7C:(2,1,0) 1A:(0,1,1) 4H:(2,2,1) 6K:(1,0,1) 3D:(0,2,2)">216</option>
			<option value="2I:(0,2,1) 5H:(0,1,0) 6E:(1,1,0) 1A:(0,1,1) 4H:(2,2,1) 7F:(1,0,2) 3D:(0,2,2)">217</option>
			<option value="2J:(0,0,1) 5E:(1,0,0) 6F:(1,1,0) 1A:(0,1,1) 4G:(2,0,1) 7E:(0,1,2) 3C:(2,2,2)">218</option>
			<option value="2J:(2,0,1) 4H:(2,2,1) 5F:(1,1,0) 7B:(1,0,0) 1A:(0,1,1) 3D:(0,2,2) 6K:(1,0,1)">219</option>
			<option value="2Q:(1,0,0) 4I:(0,0,0) 6G:(1,1,0) 7D:(1,2,0) 1A:(0,1,1) 3A:(0,0,2) 5J:(2,1,1)">220</option>
			<option value="2Q:(1,0,0) 3I:(0,0,0) 6G:(1,1,0) 7D:(1,2,0) 1A:(0,1,1) 4D:(1,0,2) 5J:(2,1,1)">221</option>
			<option value="2R:(0,1,0) 5H:(1,1,0) 6E:(1,2,0) 1A:(0,1,1) 3I:(0,0,0) 4B:(2,0,2) 7H:(1,2,2)">222</option>
			<option value="2R:(0,1,0) 6F:(1,1,0) 7C:(2,1,0) 1A:(0,1,1) 3I:(0,0,0) 4B:(2,0,2) 5J:(2,1,1)">223</option>
			<option value="2R:(0,1,0) 5E:(1,0,0) 6F:(1,1,0) 1A:(0,1,1) 3I:(0,0,0) 4C:(0,1,2) 7G:(2,1,2)">224</option>
			<option value="2R:(0,1,0) 5H:(1,1,0) 7D:(1,2,0) 1A:(0,1,1) 3I:(0,0,0) 4C:(0,1,2) 6L:(2,1,1)">225</option>
			<option value="2R:(2,1,0) 3J:(2,0,0) 5F:(1,1,0) 7B:(1,0,0) 1A:(0,1,1) 4B:(2,1,2) 6K:(1,0,1)">226</option>
			<option value="2A:(1,0,0) 3A:(0,0,0) 4I:(1,2,0) 5A:(0,1,1) 1A:(1,0,1) 6I:(1,1,1) 7F:(1,0,2)">227</option>
			<option value="2A:(1,0,0) 4E:(0,2,0) 6F:(0,0,0) 1A:(1,0,1) 3C:(2,2,2) 5A:(0,1,1) 7F:(1,0,2)">228</option>
			<option value="2B:(2,1,0) 3B:(2,0,0) 4L:(0,1,0) 6C:(1,2,1) 1A:(1,0,1) 5L:(1,1,1) 7H:(1,2,2)">229</option>
			<option value="2B:(2,1,0) 4B:(2,0,0) 6J:(0,0,0) 1A:(1,0,1) 3B:(2,0,2) 5D:(1,2,1) 7E:(0,1,2)">230</option>
			<option value="2B:(2,1,0) 4B:(2,0,0) 1A:(1,0,1) 3J:(0,0,0) 5L:(1,1,1) 6C:(1,2,1) 7H:(1,2,2)">231</option>
			<option value="2D:(0,1,0) 4B:(2,1,0) 5K:(2,2,0) 1A:(1,0,1) 3C:(2,2,2) 6D:(0,1,1) 7E:(0,1,2)">232</option>
			<option value="2D:(0,1,0) 6H:(2,2,0) 1A:(1,0,1) 4E:(0,2,0) 5A:(0,1,1) 7F:(1,0,2) 3C:(2,2,2)">233</option>
			<option value="2D:(0,1,0) 4B:(2,1,0) 1A:(1,0,1) 3K:(2,2,0) 5A:(0,1,1) 6I:(1,1,1) 7F:(1,0,2)">234</option>
			<option value="2I:(0,0,1) 6H:(2,2,0) 7A:(0,1,0) 1A:(1,0,1) 4G:(2,2,1) 5L:(0,1,1) 3C:(2,2,2)">235</option>
			<option value="2I:(0,2,1) 4G:(2,2,1) 5F:(2,0,0) 6G:(1,0,0) 1A:(1,0,1) 3C:(2,2,2) 7F:(1,0,2)">236</option>
			<option value="2Q:(1,2,0) 3I:(0,2,0) 5F:(2,0,0) 6G:(1,0,0) 1A:(1,0,1) 4D:(2,0,2) 7F:(1,0,2)">237</option>
			<option value="2R:(0,1,0) 3B:(2,0,0) 5G:(1,1,1) 7D:(1,2,0) 1A:(1,0,1) 4B:(2,0,2) 6I:(1,2,1)">238</option>
			<option value="2R:(0,1,0) 4J:(0,0,0) 5F:(2,1,0) 6G:(2,0,0) 1A:(1,0,1) 3B:(2,0,2) 7H:(1,2,2)">239</option>
			<option value="2R:(0,1,0) 3J:(0,0,0) 5F:(2,1,0) 6G:(2,0,0) 1A:(1,0,1) 4B:(2,0,2) 7H:(1,2,2)">240</option>
		</select>
		<button id="show-solution">Show Solution</button>
	</div>
	<div id="canvas"></div><!--kg-card-end: html--><p>If you want to know how we found those solutions, please continue reading.</p><hr><p>First, we need to determine all the possible orientations for every piece. We will also give them labels: A, B, C, etc..</p><p>The box in red is the main box. The piece will be positioned using this box as reference.</p><h3 id="piece-1">Piece #1</h3><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/piece1.png" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><h3 id="piece-2">Piece #2</h3><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/piece2.png" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><h3 id="piece-3">Piece #3</h3><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/piece3.png" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><h3 id="piece-4">Piece #4</h3><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/piece4.png" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><h3 id="piece-5">Piece #5</h3><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/piece5.png" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><h3 id="piece-6">Piece #6</h3><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/piece6.png" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><h3 id="piece-7">Piece #7</h3><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/piece7.png" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><hr><p>Next, we will use a backtrack algorithm to scan all the possible combinations of piece / orientation / position. A solution is detected when all of the 7 pieces are placed, with no collision, and no cube limit trespassing.</p><!--kg-card-begin: markdown--><pre><code class="language-php">&lt;?php

$pieces[1] = [ // half turn symmetry, half orientations (12)
    // piece on horizontal plane
    &apos;A&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1, 1, 0] ],
    &apos;B&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [-1, 1, 0] ],
    &apos;C&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 1, 1, 0] ],
    &apos;D&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [ 1,-1, 0] ],
 
    // main on top
    &apos;E&apos; =&gt; [ [ 0, 0, 0], [ 0, 0,-1], [ 1, 0,-1] ],
    &apos;F&apos; =&gt; [ [ 0, 0, 0], [ 0, 0,-1], [ 0, 1,-1] ],
    &apos;G&apos; =&gt; [ [ 0, 0, 0], [ 0, 0,-1], [-1, 0,-1] ],
    &apos;H&apos; =&gt; [ [ 0, 0, 0], [ 0, 0,-1], [ 0,-1,-1] ],
 
    // main on bottom
    &apos;I&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 1, 0, 1] ],
    &apos;J&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0, 1, 1] ],
    &apos;K&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [-1, 0, 1] ],
    &apos;L&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0,-1, 1] ],
];


$pieces[2] = [ // no symmetry, all orientations (24)
    // piece on horizontal plane, inversed &quot;L&quot;
    &apos;A&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1, 1, 0], [ 1, 2, 0] ],
    &apos;B&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [-1, 1, 0], [-2, 1, 0] ],
    &apos;C&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1,-1, 0], [-1,-2, 0] ],
    &apos;D&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [ 1,-1, 0], [ 2,-1, 0] ],

    // piece on horizontal plane, correct &quot;L&quot;
    &apos;E&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 1, 1, 0], [ 2, 1, 0] ],
    &apos;F&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 1, 0], [-1, 2, 0] ],
    &apos;G&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [-1,-1, 0], [-2,-1, 0] ],
    &apos;H&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1,-1, 0], [ 1,-2, 0] ],
 
    // short leg on top
    &apos;I&apos; =&gt; [ [ 0, 0, 0], [ 0, 0,-1], [ 1, 0,-1], [ 2, 0,-1] ],
    &apos;J&apos; =&gt; [ [ 0, 0, 0], [ 0, 0,-1], [ 0, 1,-1], [ 0, 2,-1] ],
    &apos;K&apos; =&gt; [ [ 0, 0, 0], [ 0, 0,-1], [-1, 0,-1], [-2, 0,-1] ],
    &apos;L&apos; =&gt; [ [ 0, 0, 0], [ 0, 0,-1], [ 0,-1,-1], [ 0,-2,-1] ],

    // short leg on bottom
    &apos;M&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 1, 0, 1], [ 2, 0, 1] ],
    &apos;N&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0, 1, 1], [ 0, 2, 1] ],
    &apos;O&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [-1, 0, 1], [-2, 0, 1] ],
    &apos;P&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0,-1, 1], [ 0,-2, 1] ],

    // long leg on top
    &apos;Q&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1, 0, 1], [ 1, 0, 2] ],
    &apos;R&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 0, 1, 1], [ 0, 1, 2] ],
    &apos;S&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 0, 1], [-1, 0, 2] ],
    &apos;T&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [ 0,-1, 1], [ 0,-1, 2] ],

    // long leg on bottom
    &apos;U&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1, 0,-1], [ 1, 0,-2] ],
    &apos;V&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 0, 1,-1], [ 0, 1,-2] ],
    &apos;W&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 0,-1], [-1, 0,-2] ],
    &apos;X&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [ 0,-1,-1], [ 0,-1,-2] ],
];

$pieces[3] = [ // half turn symmetry, half orientations (12)
    // piece on horizontal plane, &quot;T&quot;
    &apos;A&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 0, 2, 0], [ 1, 1, 0] ],
    &apos;B&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-2, 0, 0], [-1, 1, 0] ],
    &apos;C&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [ 0,-2, 0], [-1,-1, 0] ],
    &apos;D&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 2, 0, 0], [ 1,-1, 0] ],

    // &quot;T&quot; leg on top
    &apos;E&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 2, 0, 0], [ 1, 0, 1] ],
    &apos;F&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 0, 2, 0], [ 0, 1, 1] ],

    // &quot;T&quot; leg on bottom
    &apos;G&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 2, 0, 0], [ 1, 0,-1] ],
    &apos;H&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 0, 2, 0], [ 0, 1,-1] ],

    // &quot;T&quot; leg horizontal (4 directions)
    &apos;I&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0, 0, 2], [ 1, 0, 1] ],
    &apos;J&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0, 0, 2], [ 0, 1, 1] ],
    &apos;K&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0, 0, 2], [-1, 0, 1] ],
    &apos;L&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0, 0, 2], [ 0,-1, 1] ],
];


$pieces[4] = [ // half turn symmetry, half orientations (12)
    // piece on horizontal plane
    &apos;A&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 1, 1, 0], [ 1, 2, 0] ],
    &apos;B&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 1, 0], [-2, 1, 0] ],

    // piece on horizontal plane (flipped)
    &apos;C&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1, 1, 0], [ 2, 1, 0] ],
    &apos;D&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [-1, 1, 0], [-1, 2, 0] ],

    // piece standing on 2 boxes
    &apos;E&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1, 0, 1], [ 2, 0, 1] ],
    &apos;F&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 0, 1, 1], [ 0, 2, 1] ],
    &apos;G&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 0, 1], [-2, 0, 1] ],
    &apos;H&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [ 0,-1, 1], [ 0,-2, 1] ],

    // piece standing on 1 box
    &apos;I&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 1, 0, 1], [ 1, 0, 2] ],
    &apos;J&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0, 1, 1], [ 0, 1, 2] ],
    &apos;K&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [-1, 0, 1], [-1, 0, 2] ],
    &apos;L&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0,-1, 1], [ 0,-1, 2] ],
];

$pieces[5] = [ // half turn symmetry, half orientations (12)
    // piece standing on 2 boxes
    &apos;A&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 0, 1, 1], [ 1, 1, 1] ],
    &apos;B&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 0, 1], [-1, 1, 1] ],
    &apos;C&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [ 0,-1, 1], [-1,-1, 1] ],
    &apos;D&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1, 0, 1], [ 1,-1, 1] ],

    // piece standing on 3 boxes
    &apos;E&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1, 1, 0], [ 1, 1, 1] ],
    &apos;F&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [-1, 1, 0], [-1, 1, 1] ],
    &apos;G&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1,-1, 0], [-1,-1, 1] ],
    &apos;H&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [ 1,-1, 0], [ 1,-1, 1] ],

    // piece standing on 1 box
    &apos;I&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 1, 0, 1], [ 1, 1, 1] ],
    &apos;J&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0, 1, 1], [-1, 1, 1] ],
    &apos;K&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [-1, 0, 1], [-1,-1, 1] ],
    &apos;L&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0,-1, 1], [ 1,-1, 1] ],
];

$pieces[6] = [ // half turn symmetry, half orientations (12)
    // piece standing on 2 boxes
    &apos;A&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1, 0, 1], [ 1, 1, 1] ],
    &apos;B&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 0, 1, 1], [-1, 1, 1] ],
    &apos;C&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 0, 1], [-1,-1, 1] ],
    &apos;D&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [ 0,-1, 1], [ 1,-1, 1] ],

    // piece standing on 3 boxes
    &apos;E&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1,-1, 0], [ 1,-1, 1] ],
    &apos;F&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 1, 1, 0], [ 1, 1, 1] ],
    &apos;G&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 1, 0], [-1, 1, 1] ],
    &apos;H&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [-1,-1, 0], [-1,-1, 1] ],

    // piece standing on 1 box
    &apos;I&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 1, 0, 1], [ 1,-1, 1] ],
    &apos;J&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0, 1, 1], [ 1, 1, 1] ],
    &apos;K&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [-1, 0, 1], [-1, 1, 1] ],
    &apos;L&apos; =&gt; [ [ 0, 0, 0], [ 0, 0, 1], [ 0,-1, 1], [-1,-1, 1] ],
];

$pieces[7] = [ // 1/3 turn symmetry, 1/3 orientations (8)
    // piece standing on 3 boxes
    &apos;A&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 1, 1, 0], [ 0, 1, 1] ],
    &apos;B&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 1, 0], [-1, 0, 1] ],
    &apos;C&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [-1,-1, 0], [ 0,-1, 1] ],
    &apos;D&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1,-1, 0], [ 1, 0, 1] ],

    // piece standing on 1 box
    &apos;E&apos; =&gt; [ [ 0, 0, 0], [ 0, 1, 0], [ 1, 1, 0], [ 0, 1,-1] ],
    &apos;F&apos; =&gt; [ [ 0, 0, 0], [-1, 0, 0], [-1, 1, 0], [-1, 0,-1] ],
    &apos;G&apos; =&gt; [ [ 0, 0, 0], [ 0,-1, 0], [-1,-1, 0], [ 0,-1,-1] ],
    &apos;H&apos; =&gt; [ [ 0, 0, 0], [ 1, 0, 0], [ 1,-1, 0], [ 1, 0,-1] ],
];

$grid = initializeGrid();
$solutions = [];
$moves = [];

// start the backtrack
placePiece($grid, $pieces, $moves, $solutions);

// save the solutions in a file
file_put_contents(&quot;solutions.txt&quot;, serialize($solutions));

exit();

/////////////////////////////
// FUNCTIONS
/////////////////////////////

function initializeGrid() {
    $grid = [];
    for ($i = 0; $i &lt; 3 ; $i++) {
        for ($j = 0; $j &lt; 3 ; $j++) {
            for ($k = 0; $k &lt; 3 ; $k++) {
                $grid[$i][$j][$k] = null;
            }
        }
    }
    return $grid;
}


function placePiece($grid, $remainingPieces, $moves, &amp;$solutions) {
    
    reset($remainingPieces);
    $pieceNumber = key($remainingPieces);
    $piece = current($remainingPieces);
    unset($remainingPieces[$pieceNumber]);
    foreach ($piece as $orientationLabel =&gt; $boxes) {
        for ($i = 0; $i &lt; 3 ; $i++) {
            for ($j = 0; $j &lt; 3 ; $j++) {
                for ($k = 0; $k &lt; 3 ; $k++) {

                    $tempBoxes = [];
                    foreach ($boxes as $box) {
                        $tempBox = [];
                        $tempBox[0] = $box[0] + $i;
                        $tempBox[1] = $box[1] + $j;
                        $tempBox[2] = $box[2] + $k;

                        $tempBoxes[] = $tempBox;
                    }

                    // check current gird integrity
                    foreach ($tempBoxes as $tempBox) {
                        if (!checkGridLimit($tempBox)) {
                            // the piece is trespassing the 3x3x3 cube limits
                            continue 2;
                        }

                        if (!checkCollision($grid, $tempBox)) {
                            // the is a collision between 2 pieces
                            continue 2;
                        }
                    }

                    // update grid
                    $tempGrid = updateGrid($grid, $tempBoxes, $pieceNumber);

                    $move = [
                        &apos;piece&apos; =&gt; $pieceNumber,
                        &apos;orientation&apos; =&gt; $orientationLabel,
                        &apos;boxes&apos; =&gt; $tempBoxes,
                        &apos;x&apos; =&gt; $i,
                        &apos;y&apos; =&gt; $j,
                        &apos;z&apos; =&gt; $k,
                    ];

                    $currentMoves = $moves;
                    $currentMoves[] = $move;
                    
                    // next step
                    if (empty($remainingPieces)) {
                        $sortedMoves = sortAllMoves($tempGrid, $currentMoves);

                        $movesString = &quot;&quot;;
                        foreach ($sortedMoves as $move) {
                            $movesString .= $move[&apos;piece&apos;] . $move[&apos;orientation&apos;].&quot;:(&quot;.$move[&apos;x&apos;].&quot;,&quot;.$move[&apos;y&apos;].&quot;,&quot;.$move[&apos;z&apos;].&quot;) &quot;;
                        }

                        $solution = [];
                        $solution[&apos;moves&apos;] = $movesString;
                        $solution[&apos;grid&apos;] = $tempGrid;
                        $solutions[] = $solution;
                        print(&quot;Solution : $movesString\n&quot;);

                    } else {
                        placePiece($tempGrid, $remainingPieces, $currentMoves, $solutions);
                    }
                }
            }
        }
    }
}


function checkGridLimit($box) {
    // check x
    if (($box[0] &lt; 0) or ($box[0] &gt; 2)) {
        return false;
    }

    // check y
    if (($box[1] &lt; 0) or ($box[1] &gt; 2)) {
        return false;
    }

    // check z
    if (($box[2] &lt; 0) or ($box[2] &gt; 2)) {
        return false;
    }

    return true;
}

function checkCollision($grid, $box) {
    $x = $box[0];
    $y = $box[1];
    $z = $box[2];

    return is_null($grid[$x][$y][$z]);
}

function updateGrid($grid, $boxes, $pieceNumber) {
    // place piece number in each box
    foreach ($boxes as $box) {
        $x = $box[0];
        $y = $box[1];
        $z = $box[2];

        $grid[$x][$y][$z] = $pieceNumber;
    }

    return $grid;
}

// sort the moves so that the pieces could be placed vertically
function sortAllMoves($grid, $moves) {
    $dependencies = [];

    for ($i = 1; $i &lt;= 7; $i++) {
        $dependencies[$i] = [];
    }

    for ($x = 0; $x &lt; 3 ; $x++) {
        for ($y = 0; $y &lt; 3 ; $y++) {
            for ($z = 1; $z &lt; 3 ; $z++) {
                $pieceTop = $grid[$x][$y][$z];
                $pieceBottom = $grid[$x][$y][$z-1];

                if ($pieceTop != $pieceBottom and !in_array($pieceBottom, $dependencies[$pieceTop])) {
                    $dependencies[$pieceTop][] = $pieceBottom;
                }
            }
        }
    }

    $sortedPieces = [];
    while (count($sortedPieces) &lt; 7) {
        for ($piece = 1; $piece &lt;= 7; $piece++) {
            if (!in_array($piece, $sortedPieces)) {
                foreach ($dependencies[$piece] as $dependentPiece) {
                    // checking if there is a dependent piece not yet placed
                    if (!in_array($dependentPiece, $sortedPieces)) {
                        continue 2;
                    }
                }

                $sortedPieces[] = $piece;
            }
        }
    }

    $sortedMoves = [];
    foreach ($sortedPieces as $piece) {
        $sortedMoves[] = $moves[$piece - 1];
    }

    return $sortedMoves;
}

</code></pre>
<!--kg-card-end: markdown--><p>After the script finishes executing, we get 11520 solutions. This number must be reduced to 240. We need to remove all rotations and mirrors. For each distinct solution, there are 24 rotation. Also, each solution has a mirror (240 x 24 x 2 = 11520).</p><p>Please notice that when mirroring, all the pieces could be mirror of themselves, except the #5 and the #6. Those 2 pieces must exchange position to make the mirror possible.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/11/mirror.png" class="kg-image" alt="Solving the Soma cube in 3D" loading="lazy"></figure><p>Removing the rotations and the mirrors simultaneously did not work. So, we regrouped all of the rotations in clusters. In total, we got 480 clusters. Each cluster is composed of 24 rotation of the same solution. After that, we remove the mirror clusters. And finally, we keep the first solution of each cluster.</p><!--kg-card-begin: markdown--><pre><code class="language-php">&lt;?php

// loading the 11520 solutions from the file
if (!file_exists(&quot;solutions.txt&quot;)) {
    die(&quot;Error: solutions file is missing.\n&quot;);
}

$solutions = unserialize(file_get_contents(&quot;solutions.txt&quot;));

$rotationClusters = [];

while (!empty($solutions)) {
    $solution = array_shift($solutions);

    $cluster = getRotationCluster($solutions, $solution);
    print(&quot;Cluster Size : &quot; . count($cluster).&quot;\n&quot;);
    $rotationClusters[] = $cluster;
}

print(&quot;Total Number of clusters : &quot; . count($rotationClusters).&quot;\n\n&quot;);

sleep(1);

print(&quot;Removing mirrored clusters\n&quot;);

$distinctClusters = [];
while (!empty($rotationClusters)) {
    $cluster = array_shift($rotationClusters);
    $distinctClusters[] = $cluster;

    removeMirrorCluster($rotationClusters, $cluster);
}

print(&quot;Distinct clusters : &quot; . count($distinctClusters).&quot;\n\n&quot;);

// display a solution from every cluster
foreach ($distinctClusters as $cluster) {
    print($cluster[0][&apos;moves&apos;].&quot;\n&quot;);
}

exit();

///////////////////////////
//   FUNCTIONS
///////////////////////////


// return an array of all the different rotations of a solution
function getRotationCluster(&amp;$solutions, $chosenSolution) {
    $cluster = [$chosenSolution];

    foreach ($solutions as $key =&gt; $solution) {
        if (rotationGrid($solution[&apos;grid&apos;], $chosenSolution[&apos;grid&apos;])) {
            unset($solutions[$key]);
            $cluster[] = $solution;
        }
    }

    return $cluster;
}

// for each cluster, find the mirror cluster and remove it
function removeMirrorCluster(&amp;$clusters, $chosenCluster) {
    $chosenSolution = array_shift($chosenCluster);

    foreach ($clusters as $key =&gt; $cluster) {
        foreach ($cluster as $solution) {
            if (mirrorGrid($solution[&apos;grid&apos;], $chosenSolution[&apos;grid&apos;])) {
                unset($clusters[$key]);
                print(&quot;mirror found\n&quot;);
                return;
            }
        }
    }
    print(&quot;mirror not found\n&quot;);
    displayGrid($chosenSolution[&apos;grid&apos;]);
    print($chosenSolution[&apos;moves&apos;]);
    exit();
}

function mirrorGrid($grid1, $grid2) {
    for ($i = 0; $i &lt; 3; $i++) {
        for ($j = 0; $j &lt; 3; $j++) {
            for ($k = 0; $k &lt; 3; $k++) {
                switch ($grid1[$i][$j][$k]) {
                    // if piece #5 or #6, check if the mirror has the alternate piece
                    case 5:
                        if ($grid2[$i][$j][2 - $k] != 6) {
                            return false;
                        }
                        break;

                    case 6:
                        if ($grid2[$i][$j][2 - $k] != 5) {
                            return false;
                        }
                        break;
                    
                    default:
                        if ($grid2[$i][$j][2 - $k] != $grid1[$i][$j][$k]) {
                            return false;
                        }
                        break;
                }
            }
        }
    }

    return true;
}

function rotationGrid($grid1, $grid2) {
    // 24 possible rotations
    for ($rotation = 0; $rotation &lt; 24; $rotation++) {
        for ($i = 0; $i &lt; 3; $i++) {
            for ($j = 0; $j &lt; 3; $j++) {
                for ($k = 0; $k &lt; 3; $k++) {
                    switch ($rotation) {

                        case 0:
                            if ($grid1[$i][$j][$k] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 1:
                            if ($grid1[2-$k][$j][$i] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 2:
                            if ($grid1[2-$i][$j][2-$k] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 3:
                            if ($grid1[$k][$j][2-$i] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 4:
                            if ($grid1[$j][2-$i][$k] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 5:
                            if ($grid1[$j][$k][$i] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 6:
                            if ($grid1[$j][$i][2-$k] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 7:
                            if ($grid1[$j][2-$k][2-$i] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 8:
                            if ($grid1[2-$j][$i][$k] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 9:
                            if ($grid1[2-$j][2-$k][$i] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 10:
                            if ($grid1[2-$j][2-$i][2-$k] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 11:
                            if ($grid1[2-$j][$k][2-$i] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 12:
                            if ($grid1[$i][$k][2-$j] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 13:
                            if ($grid1[2-$k][$i][2-$j] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 14:
                            if ($grid1[2-$i][2-$k][2-$j] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 15:
                            if ($grid1[$k][2-$i][2-$j] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 16:
                            if ($grid1[$i][2-$j][2-$k] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 17:
                            if ($grid1[2-$k][2-$j][2-$i] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 18:
                            if ($grid1[2-$i][2-$j][$k] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 19:
                            if ($grid1[$k][2-$j][$i] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;


                        case 20:
                            if ($grid1[$i][2-$k][$j] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 21:
                            if ($grid1[2-$k][2-$i][$j] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 22:
                            if ($grid1[2-$i][$k][$j] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;

                        case 23:
                            if ($grid1[$k][$i][$j] != $grid2[$i][$j][$k]) {
                                continue 5;
                            }
                            break;


                        default:
                            die(&quot;not supposed to happen\n&quot;);
                            break;
                    }
                }
            }
        }
        return true;
    }

    return false;

}

</code></pre>
<!--kg-card-end: markdown--><p>Down here, the 240 distinct solutions. Each piece should be positioned by placing its main box in the indicated position (x,y,z).</p><!--kg-card-begin: markdown--><pre><code>1A:(0,0,0) 6K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5A:(0,1,0) 4F:(0,0,1) 2A:(0,0,2)
1A:(0,0,0) 3K:(2,0,0) 7D:(1,2,0) 5A:(0,1,0) 6A:(1,1,1) 4F:(0,0,1) 2A:(0,0,2)
1A:(0,0,0) 3E:(0,2,0) 4L:(0,1,0) 5C:(2,1,0) 6H:(2,2,1) 7E:(0,1,2) 2A:(1,0,2)
1A:(0,0,0) 2B:(2,1,0) 5J:(2,0,0) 6J:(0,1,0) 7H:(1,2,2) 4E:(0,0,1) 3A:(0,0,2)
1A:(0,0,0) 2B:(2,1,0) 4J:(2,0,0) 5L:(0,1,0) 6F:(1,1,1) 7E:(0,1,2) 3B:(2,0,2)
1A:(0,0,0) 2B:(2,1,0) 4J:(0,1,0) 5F:(2,1,1) 6K:(2,0,0) 7F:(1,0,2) 3C:(2,2,2)
1A:(0,0,0) 2B:(2,1,0) 4J:(2,0,0) 7E:(0,0,1) 3G:(0,0,2) 6C:(1,2,1) 5K:(2,2,1)
1A:(0,0,0) 2B:(2,1,0) 3J:(2,0,0) 5L:(0,1,0) 6F:(1,1,1) 7E:(0,1,2) 4C:(0,0,2)
1A:(0,0,0) 2B:(2,1,0) 3K:(2,0,0) 5E:(1,1,1) 6J:(0,1,0) 7F:(1,0,2) 4B:(2,1,2)
1A:(0,0,0) 2B:(2,1,0) 3K:(2,0,0) 4L:(0,1,0) 6C:(2,1,1) 5D:(1,2,1) 7E:(0,1,2)
1A:(0,0,0) 2B:(2,1,0) 3K:(2,0,0) 4L:(0,1,0) 6F:(1,1,1) 7E:(0,1,2) 5K:(2,1,1)
1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 7F:(1,1,1) 2B:(2,1,2) 5B:(1,0,1) 6K:(2,0,1)
1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4C:(0,1,1) 5B:(1,0,1) 6K:(2,0,1) 2B:(2,1,2)
1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 7F:(1,1,1) 2B:(2,1,2) 5B:(1,0,1) 6K:(2,0,1)
1A:(0,0,0) 4L:(0,1,0) 7D:(1,2,0) 3J:(2,0,0) 6I:(0,2,0) 2B:(2,1,2) 5J:(1,0,1)
1A:(0,0,0) 3K:(2,0,0) 7D:(1,2,0) 5A:(0,1,0) 6D:(0,1,1) 4G:(2,1,1) 2B:(2,1,2)
1A:(0,0,0) 4K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5A:(0,1,0) 6F:(0,0,1) 2C:(1,2,2)
1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 3J:(2,0,0) 6I:(0,2,0) 2C:(1,2,2) 4A:(1,0,2)
1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 4J:(2,0,0) 6I:(0,2,0) 2D:(0,1,2) 3D:(0,2,2)
1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 4L:(2,2,0) 6F:(0,0,1) 2D:(0,1,2) 3G:(0,2,2)
1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 3I:(0,2,0) 4J:(2,0,0) 6J:(1,1,1) 2D:(0,1,2)
1A:(0,0,0) 2E:(0,1,0) 4F:(2,0,0) 5G:(1,2,1) 6H:(1,1,1) 7G:(2,1,2) 3D:(0,2,2)
1A:(0,0,0) 2E:(0,1,0) 4F:(2,0,0) 5H:(0,2,1) 6A:(1,0,1) 7F:(1,0,2) 3G:(0,2,2)
1A:(0,0,0) 2E:(0,1,0) 4F:(2,0,0) 6A:(1,0,1) 7B:(1,1,1) 3G:(0,2,2) 5I:(0,0,1)
1A:(0,0,0) 2E:(0,1,0) 4C:(0,1,1) 5C:(2,1,0) 6I:(0,2,1) 7F:(1,0,2) 3H:(2,0,2)
1A:(0,0,0) 2E:(0,1,0) 3K:(2,0,0) 4J:(2,1,0) 6D:(1,2,1) 5A:(0,1,1) 7F:(1,0,2)
1A:(0,0,0) 2E:(0,1,0) 3K:(2,0,0) 4J:(2,1,0) 6G:(1,1,1) 7F:(1,0,2) 5L:(1,2,1)
1A:(0,0,0) 2E:(0,1,0) 3K:(2,0,0) 4K:(2,1,0) 5D:(1,2,1) 6D:(0,1,1) 7E:(0,1,2)
1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 4J:(2,0,0) 6I:(0,2,0) 2E:(0,1,2) 3B:(2,0,2)
1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 6A:(1,0,1) 7F:(1,1,1) 2E:(0,1,2) 5I:(0,0,1)
1A:(0,0,0) 3F:(2,0,0) 6A:(1,0,1) 7A:(0,1,0) 4C:(0,1,1) 5I:(0,0,1) 2E:(0,1,2)
1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 6A:(1,0,1) 7F:(1,1,1) 2E:(0,1,2) 5I:(0,0,1)
1A:(0,0,0) 7D:(1,2,0) 4J:(2,0,0) 5A:(0,1,0) 6F:(0,0,1) 2E:(0,1,2) 3G:(0,0,2)
1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 3J:(2,0,0) 6I:(0,2,0) 2E:(0,1,2) 4C:(0,0,2)
1A:(0,0,0) 3K:(2,0,0) 4L:(0,1,0) 7D:(1,2,0) 6I:(0,2,0) 2E:(0,1,2) 5K:(2,1,1)
1A:(0,0,0) 3F:(2,0,0) 6A:(1,0,1) 7A:(0,1,0) 4A:(0,0,1) 5K:(2,2,1) 2F:(1,0,2)
1A:(0,0,0) 3F:(2,0,0) 4H:(0,2,0) 6A:(1,0,1) 7H:(0,2,1) 2F:(1,0,2) 5K:(2,2,1)
1A:(0,0,0) 4H:(0,2,0) 6K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5D:(0,2,1) 2F:(1,0,2)
1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 4K:(2,2,0) 6F:(0,0,1) 2F:(1,0,2) 3H:(2,0,2)
1A:(0,0,0) 3K:(2,0,0) 4H:(0,2,0) 7D:(1,2,0) 6A:(1,1,1) 5D:(0,2,1) 2F:(1,0,2)
1A:(0,0,0) 3K:(2,0,0) 4H:(0,2,0) 7D:(1,2,0) 6E:(0,2,1) 2F:(1,0,2) 5J:(2,1,1)
1A:(0,0,0) 3F:(2,0,0) 5H:(1,1,1) 7A:(0,1,0) 4G:(2,2,1) 6D:(0,1,1) 2G:(2,2,2)
1A:(0,0,0) 3K:(2,0,0) 5C:(2,2,0) 7A:(0,1,0) 4G:(2,2,1) 6D:(0,1,1) 2G:(2,2,2)
1A:(0,0,0) 2H:(1,2,0) 4H:(0,2,0) 5E:(1,0,1) 6F:(1,1,1) 7E:(0,1,2) 3B:(2,0,2)
1A:(0,0,0) 2H:(1,2,0) 4H:(0,2,0) 5F:(2,0,1) 6C:(1,2,1) 7H:(1,2,2) 3G:(0,0,2)
1A:(0,0,0) 2H:(1,2,0) 4H:(0,2,0) 6C:(1,2,1) 7D:(1,1,1) 3G:(0,0,2) 5K:(2,2,1)
1A:(0,0,0) 2H:(1,2,0) 4C:(0,0,1) 5A:(0,1,0) 6K:(2,0,1) 7H:(1,2,2) 3H:(0,0,2)
1A:(0,0,0) 2H:(1,2,0) 3I:(0,2,0) 4I:(0,1,0) 5B:(1,0,1) 6B:(2,1,1) 7G:(2,1,2)
1A:(0,0,0) 2H:(1,2,0) 3I:(0,2,0) 4L:(0,1,0) 6B:(1,0,1) 5C:(2,1,1) 7H:(1,2,2)
1A:(0,0,0) 2H:(1,2,0) 3I:(0,2,0) 4L:(0,1,0) 6E:(1,1,1) 7H:(1,2,2) 5J:(1,0,1)
1A:(0,0,0) 3E:(0,2,0) 4J:(0,1,0) 5C:(2,1,0) 6H:(2,2,1) 7F:(1,0,2) 2H:(1,2,2)
1A:(0,0,0) 2I:(0,2,1) 4F:(2,0,0) 5I:(0,1,0) 6A:(1,0,1) 7F:(1,0,2) 3D:(0,2,2)
1A:(0,0,0) 2I:(0,2,1) 4F:(2,0,0) 6I:(0,1,0) 7F:(1,0,2) 3G:(0,2,2) 5J:(2,0,1)
1A:(0,0,0) 2I:(0,2,1) 4F:(2,0,0) 7E:(0,0,1) 3G:(0,2,2) 5J:(2,0,1) 6K:(1,0,1)
1A:(0,0,0) 3F:(2,0,0) 5G:(1,2,0) 6H:(1,1,1) 7G:(2,1,2) 2I:(0,2,2) 4C:(0,1,2)
1A:(0,0,0) 3F:(2,0,0) 5H:(1,1,1) 6F:(0,1,0) 7H:(1,2,2) 2J:(0,0,2) 4D:(1,0,2)
1A:(0,0,0) 3K:(2,0,0) 5C:(2,2,0) 6F:(0,1,0) 7H:(1,2,2) 2J:(0,0,2) 4D:(1,0,2)
1A:(0,0,0) 2J:(2,0,1) 7A:(0,1,0) 4A:(0,0,1) 6B:(2,1,1) 3A:(0,0,2) 5I:(1,0,1)
1A:(0,0,0) 2J:(2,0,1) 4H:(0,2,0) 7H:(0,2,1) 3A:(0,0,2) 6B:(2,1,1) 5I:(1,0,1)
1A:(0,0,0) 2J:(2,0,1) 4C:(0,0,1) 7A:(0,1,0) 3B:(2,0,2) 5D:(1,2,1) 6J:(0,1,1)
1A:(0,0,0) 2J:(2,0,1) 4C:(0,0,1) 5G:(1,2,0) 6C:(1,2,1) 7H:(1,2,2) 3B:(2,0,2)
1A:(0,0,0) 2J:(2,0,1) 4E:(0,2,0) 5L:(0,1,0) 6A:(1,1,1) 7E:(0,1,2) 3B:(2,0,2)
1A:(0,0,0) 2J:(2,0,1) 4A:(1,0,1) 6F:(0,1,0) 3C:(2,2,2) 5A:(0,1,1) 7F:(1,0,2)
1A:(0,0,0) 2J:(2,0,1) 4A:(1,0,1) 7A:(0,1,0) 3C:(2,2,2) 6D:(0,1,1) 5K:(1,2,1)
1A:(0,0,0) 2J:(2,0,1) 4H:(0,2,0) 5C:(1,1,1) 6I:(1,2,0) 7E:(0,1,2) 3C:(2,2,2)
1A:(0,0,0) 2J:(2,0,1) 7A:(0,1,0) 4C:(0,1,1) 5B:(1,0,1) 6L:(2,1,1) 3D:(0,2,2)
1A:(0,0,0) 2J:(2,0,1) 4E:(0,2,0) 7F:(1,1,1) 3D:(0,2,2) 5B:(1,0,1) 6L:(2,1,1)
1A:(0,0,0) 2J:(2,0,1) 7A:(0,1,0) 4G:(2,2,1) 6A:(1,1,1) 5A:(0,0,1) 3G:(0,0,2)
1A:(0,0,0) 2J:(2,0,1) 4H:(0,2,0) 6I:(1,2,0) 7E:(0,1,2) 3G:(0,0,2) 5I:(1,1,1)
1A:(0,0,0) 2J:(2,0,1) 4H:(0,2,0) 5L:(1,2,0) 6L:(2,2,1) 7E:(0,1,2) 3G:(0,0,2)
1A:(0,0,0) 2J:(2,0,1) 4E:(0,0,1) 7A:(0,1,0) 6C:(1,1,1) 5C:(2,2,1) 3G:(0,2,2)
1A:(0,0,0) 2J:(2,0,1) 4H:(2,2,1) 7A:(0,1,0) 5A:(1,1,1) 6A:(0,0,1) 3H:(0,0,2)
1A:(0,0,0) 2J:(2,0,1) 4E:(0,2,0) 6I:(0,1,0) 7E:(0,1,2) 3H:(2,0,2) 5I:(0,0,1)
1A:(0,0,0) 2J:(2,0,1) 4E:(0,2,0) 5L:(0,1,0) 6L:(1,1,1) 7E:(0,1,2) 3H:(2,0,2)
1A:(0,0,0) 2J:(2,0,1) 7A:(0,1,0) 4F:(0,0,1) 5C:(1,1,1) 6C:(2,2,1) 3H:(2,0,2)
1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 2K:(2,0,2) 5L:(0,1,1) 6F:(1,1,1) 4B:(2,1,2)
1A:(0,0,0) 3F:(2,0,0) 5G:(1,2,0) 6F:(1,1,1) 7E:(0,1,2) 2K:(2,0,2) 4C:(0,0,2)
1A:(0,0,0) 6B:(2,0,0) 7A:(0,1,0) 2K:(2,0,2) 3K:(2,2,0) 4B:(2,1,2) 5L:(0,1,1)
1A:(0,0,0) 5G:(1,2,0) 6B:(2,0,0) 2K:(2,0,2) 3K:(2,2,0) 4C:(0,0,2) 7E:(0,1,2)
1A:(0,0,0) 2K:(2,2,1) 4E:(0,2,1) 5C:(2,1,0) 6L:(2,1,1) 7E:(0,0,1) 3A:(0,0,2)
1A:(0,0,0) 2K:(2,2,1) 4E:(0,2,1) 5L:(0,1,0) 6B:(2,0,0) 7G:(2,1,2) 3A:(0,0,2)
1A:(0,0,0) 2K:(2,2,1) 4J:(0,1,0) 5C:(2,1,0) 6G:(2,1,1) 7F:(1,0,2) 3C:(2,2,2)
1A:(0,0,0) 2L:(2,2,1) 4L:(0,1,0) 5D:(0,2,0) 6H:(2,1,1) 7E:(0,1,2) 3C:(2,2,2)
1A:(0,0,0) 2L:(2,2,1) 5G:(1,2,0) 4B:(2,1,1) 6A:(1,0,1) 7F:(1,0,2) 3D:(0,2,2)
1A:(0,0,0) 2L:(2,2,1) 7A:(0,1,0) 4F:(0,0,1) 5A:(1,1,1) 6B:(2,0,1) 3G:(0,0,2)
1A:(0,0,0) 2L:(2,2,1) 5F:(2,0,1) 7A:(0,1,0) 4F:(0,0,1) 6I:(1,2,1) 3G:(0,0,2)
1A:(0,0,0) 2L:(2,2,1) 4F:(2,0,1) 7A:(0,1,0) 6B:(1,1,1) 5A:(0,0,1) 3G:(0,0,2)
1A:(0,0,0) 2L:(2,2,1) 4F:(2,0,1) 7A:(0,1,0) 6F:(0,0,1) 3G:(0,0,2) 5K:(1,2,1)
1A:(0,0,0) 2L:(2,2,1) 7A:(0,1,0) 5A:(1,1,1) 6B:(2,0,1) 4E:(0,0,1) 3H:(0,0,2)
1A:(0,0,0) 2L:(2,2,1) 5F:(2,0,1) 7A:(0,1,0) 4E:(0,0,1) 6I:(1,2,1) 3H:(0,0,2)
1A:(0,0,0) 2L:(2,2,1) 6F:(0,1,0) 4B:(2,0,1) 5I:(0,0,1) 7E:(0,1,2) 3H:(2,0,2)
1A:(0,0,0) 2L:(2,2,1) 7A:(0,1,0) 6B:(1,1,1) 5A:(0,0,1) 4G:(2,0,1) 3H:(2,0,2)
1A:(0,0,0) 2L:(2,2,1) 7A:(0,1,0) 6F:(0,0,1) 4G:(2,0,1) 5K:(1,2,1) 3H:(2,0,2)
1A:(0,0,0) 7A:(0,1,0) 5F:(1,0,1) 6B:(2,1,0) 3D:(0,2,2) 4J:(2,0,0) 2M:(0,0,1)
1A:(0,0,0) 5C:(2,1,0) 6F:(0,1,0) 7B:(1,1,1) 2M:(0,0,1) 4L:(2,2,0) 3D:(0,2,2)
1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 2M:(0,0,1) 4L:(2,2,0) 6H:(1,2,1) 3D:(0,2,2)
1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4B:(2,0,1) 5K:(1,2,1) 6L:(2,2,1) 2M:(0,0,1)
1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 7H:(1,2,2) 4B:(2,0,1) 5L:(0,2,1) 2M:(0,0,1)
1A:(0,0,0) 5C:(2,1,0) 6F:(0,1,0) 7B:(1,1,1) 2M:(0,0,1) 3L:(2,2,0) 4B:(2,1,2)
1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 2M:(0,0,1) 3L:(2,2,0) 6H:(1,2,1) 4B:(2,1,2)
1A:(0,0,0) 5C:(2,1,0) 6F:(0,1,0) 2M:(0,0,1) 3L:(2,2,0) 4E:(0,1,1) 7E:(0,1,2)
1A:(0,0,0) 5C:(2,1,0) 6F:(0,1,0) 7A:(0,0,1) 3B:(2,0,2) 4L:(2,2,0) 2M:(0,2,1)
1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 6I:(0,1,0) 7F:(1,0,2) 2M:(0,2,1) 5J:(2,0,1)
1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 7E:(0,0,1) 2M:(0,2,1) 5J:(2,0,1) 6K:(1,0,1)
1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 6I:(0,1,0) 7F:(1,0,2) 2M:(0,2,1) 5J:(2,0,1)
1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 7E:(0,0,1) 2M:(0,2,1) 5J:(2,0,1) 6K:(1,0,1)
1A:(0,0,0) 3F:(2,0,0) 4H:(0,2,0) 6K:(1,0,1) 7E:(1,1,1) 2M:(0,2,1) 5J:(2,0,1)
1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 4D:(1,0,1) 5K:(2,2,1) 7G:(2,1,2) 2N:(0,0,1)
1A:(0,0,0) 4K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5A:(0,1,0) 6A:(0,1,1) 2N:(0,0,1)
1A:(0,0,0) 4K:(2,0,0) 6D:(0,2,0) 7D:(1,2,0) 3H:(2,0,2) 5D:(0,2,1) 2N:(0,0,1)
1A:(0,0,0) 3K:(2,0,0) 6D:(0,2,0) 7D:(1,2,0) 4E:(0,2,1) 5K:(2,1,1) 2N:(0,0,1)
1A:(0,0,0) 6B:(2,0,0) 7A:(0,1,0) 4K:(2,2,0) 5H:(0,1,1) 2N:(2,0,1) 3A:(0,0,2)
1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 6I:(0,1,0) 7E:(0,1,2) 2N:(2,0,1) 5I:(0,0,1)
1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 5L:(0,1,0) 6L:(1,1,1) 7E:(0,1,2) 2N:(2,0,1)
1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 6I:(0,1,0) 7E:(0,1,2) 2N:(2,0,1) 5I:(0,0,1)
1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 5L:(0,1,0) 6L:(1,1,1) 7E:(0,1,2) 2N:(2,0,1)
1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4F:(0,0,1) 5C:(1,1,1) 6C:(2,2,1) 2N:(2,0,1)
1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4G:(2,2,1) 5I:(1,1,1) 6G:(1,0,1) 2O:(2,0,1)
1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 4A:(0,0,1) 5J:(2,0,1) 6K:(1,0,1) 2O:(2,2,1)
1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 4D:(1,0,1) 5J:(2,0,1) 7F:(1,0,2) 2O:(2,2,1)
1A:(0,0,0) 3F:(2,0,0) 4H:(0,2,0) 6K:(1,0,1) 7H:(0,2,1) 2O:(2,2,1) 5J:(2,0,1)
1A:(0,0,0) 3F:(2,0,0) 5E:(0,0,1) 6F:(0,1,0) 7G:(2,1,2) 4H:(0,2,1) 2O:(2,2,1)
1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 7C:(1,1,1) 4H:(0,2,1) 5J:(2,0,1) 2O:(2,2,1)
1A:(0,0,0) 3K:(2,0,0) 6E:(1,2,0) 5A:(0,1,0) 7A:(0,0,1) 2O:(2,2,1) 4C:(0,0,2)
1A:(0,0,0) 3K:(2,0,0) 6E:(1,2,0) 5A:(0,1,0) 2O:(2,2,1) 4E:(0,1,1) 7F:(1,0,2)
1A:(0,0,0) 3E:(0,2,0) 4F:(2,0,0) 5L:(0,1,0) 6J:(1,1,1) 7G:(2,1,2) 2P:(0,2,1)
1A:(0,0,0) 3F:(2,0,0) 4E:(0,2,0) 5L:(0,1,0) 6J:(1,1,1) 7G:(2,1,2) 2P:(0,2,1)
1A:(0,0,0) 4H:(0,2,0) 7D:(1,2,0) 2P:(0,2,1) 3J:(2,0,0) 5A:(1,1,1) 6J:(1,0,1)
1A:(0,0,0) 3K:(2,0,0) 4H:(0,2,0) 5F:(2,1,0) 6B:(2,1,1) 7E:(1,0,2) 2P:(0,2,1)
1A:(0,0,0) 3K:(2,0,0) 4H:(0,2,0) 5F:(2,1,0) 6C:(2,1,1) 7H:(1,2,2) 2P:(0,2,1)
1A:(0,0,0) 3E:(0,2,0) 4L:(0,1,0) 6B:(2,0,0) 7E:(0,1,2) 5B:(2,0,1) 2P:(2,2,1)
1A:(0,0,0) 3E:(0,2,0) 4L:(0,1,0) 5C:(2,1,0) 6C:(2,1,1) 7E:(0,1,2) 2P:(2,2,1)
1A:(0,0,0) 3F:(2,0,0) 6F:(0,1,0) 4B:(2,0,1) 5I:(0,0,1) 7E:(0,1,2) 2P:(2,2,1)
1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 6B:(1,1,1) 5A:(0,0,1) 4G:(2,0,1) 2P:(2,2,1)
1A:(0,0,0) 3F:(2,0,0) 7A:(0,1,0) 6F:(0,0,1) 4G:(2,0,1) 5K:(1,2,1) 2P:(2,2,1)
1A:(0,0,0) 2Q:(0,2,0) 4J:(0,1,0) 5C:(2,1,0) 6L:(2,2,0) 7F:(1,0,2) 3C:(2,2,2)
1A:(0,0,0) 2Q:(0,2,0) 3F:(2,0,0) 4J:(0,1,0) 5H:(1,1,1) 6L:(2,2,1) 7F:(1,0,2)
1A:(0,0,0) 2Q:(0,2,0) 3K:(2,0,0) 4J:(0,1,0) 5C:(2,2,0) 6L:(2,2,1) 7F:(1,0,2)
1A:(0,0,0) 2Q:(0,2,0) 4J:(0,1,0) 5C:(2,1,0) 7F:(1,0,2) 3L:(2,2,0) 6I:(1,1,1)
1A:(0,0,0) 2Q:(1,2,0) 4H:(0,2,0) 5C:(2,1,0) 6L:(2,1,1) 7D:(0,2,1) 3A:(0,0,2)
1A:(0,0,0) 2Q:(1,2,0) 4I:(0,2,0) 5C:(2,1,0) 6L:(2,1,1) 7E:(0,0,1) 3A:(0,0,2)
1A:(0,0,0) 2Q:(1,2,0) 4I:(0,2,0) 5L:(0,1,0) 6B:(2,0,0) 7G:(2,1,2) 3A:(0,0,2)
1A:(0,0,0) 2Q:(1,2,0) 3I:(0,2,0) 5C:(2,1,0) 6L:(2,1,1) 7E:(0,0,1) 4A:(0,0,2)
1A:(0,0,0) 2Q:(1,2,0) 3I:(0,2,0) 5L:(0,1,0) 6B:(2,0,0) 7G:(2,1,2) 4A:(0,0,2)
1A:(0,0,0) 2Q:(1,2,0) 3I:(0,2,0) 4L:(0,1,0) 5C:(2,1,0) 6L:(2,1,1) 7G:(1,2,2)
1A:(0,0,0) 2R:(0,1,0) 6G:(1,0,1) 7D:(1,2,0) 4J:(2,0,0) 5A:(1,1,1) 3B:(2,0,2)
1A:(0,0,0) 2R:(0,1,0) 3F:(2,0,0) 4I:(1,2,0) 6A:(0,1,1) 5B:(1,0,1) 7G:(2,1,2)
1A:(0,0,0) 2R:(0,1,0) 3F:(2,0,0) 4I:(1,2,0) 6H:(1,1,1) 7G:(2,1,2) 5I:(0,1,1)
1A:(0,0,0) 2R:(0,1,0) 4K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5E:(0,1,1) 6J:(0,0,1)
1A:(0,0,0) 2R:(0,1,0) 4K:(2,0,0) 5G:(1,1,1) 7D:(1,2,0) 3H:(2,0,2) 6L:(1,2,1)
1A:(0,0,0) 2R:(0,1,0) 6G:(1,0,1) 7D:(1,2,0) 3J:(2,0,0) 5A:(1,1,1) 4C:(0,0,2)
1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 5F:(2,1,0) 6B:(2,1,1) 7A:(0,0,1) 4C:(0,0,2)
1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 5F:(2,1,0) 6D:(0,1,1) 7C:(2,2,1) 4C:(0,1,2)
1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 6D:(0,1,1) 7D:(1,2,0) 5H:(1,2,1) 4C:(0,1,2)
1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 5F:(2,1,0) 6B:(2,1,1) 4E:(0,1,1) 7F:(1,0,2)
1A:(0,0,0) 2R:(0,1,0) 3K:(2,0,0) 5F:(2,1,0) 6D:(0,1,1) 4G:(2,1,1) 7H:(1,2,2)
1A:(0,0,0) 2R:(0,1,0) 5C:(2,1,0) 6L:(1,2,0) 7F:(1,0,2) 3L:(2,2,0) 4D:(2,0,2)
1A:(0,0,0) 2R:(2,1,0) 4J:(2,0,0) 7A:(0,1,0) 6B:(1,1,1) 5A:(0,0,1) 3G:(0,0,2)
1A:(0,0,0) 2R:(2,1,0) 4J:(2,0,0) 7A:(0,1,0) 6F:(0,0,1) 3G:(0,0,2) 5K:(1,2,1)
1A:(0,0,0) 2R:(2,1,0) 3J:(2,0,0) 4L:(0,1,0) 5D:(0,2,0) 6J:(1,0,1) 7E:(0,1,2)
1A:(0,0,0) 2R:(2,1,0) 3K:(2,0,0) 5D:(0,2,0) 6K:(2,1,1) 4J:(0,1,0) 7F:(1,0,2)
1A:(0,0,0) 2S:(1,2,0) 3F:(2,0,0) 5L:(0,1,0) 6F:(1,1,1) 7G:(2,1,2) 4A:(0,0,2)
1A:(0,0,0) 2S:(1,2,0) 3K:(2,0,0) 4I:(0,1,0) 6B:(2,1,0) 7F:(1,0,2) 5J:(2,1,1)
1A:(0,0,0) 2S:(1,2,0) 3K:(2,0,0) 4L:(0,1,0) 6B:(2,1,0) 7H:(0,1,2) 5J:(2,1,1)
1A:(0,0,0) 2S:(1,2,0) 3K:(2,2,0) 5C:(2,1,0) 6L:(2,1,1) 7E:(0,0,1) 4A:(0,0,2)
1A:(0,0,0) 2S:(1,2,0) 3K:(2,2,0) 5L:(0,1,0) 6B:(2,0,0) 7G:(2,1,2) 4A:(0,0,2)
1A:(0,0,0) 2S:(1,2,0) 3K:(2,2,0) 4L:(0,1,0) 5C:(2,1,0) 6L:(2,1,1) 7G:(1,2,2)
1A:(0,0,0) 2T:(0,2,0) 3F:(2,0,0) 4K:(1,2,0) 6H:(1,1,1) 7G:(2,1,2) 5K:(2,2,1)
1A:(0,0,0) 2T:(2,1,0) 7A:(0,1,0) 4K:(2,2,0) 5H:(0,1,1) 6A:(1,1,1) 3A:(0,0,2)
1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 6B:(2,1,1) 5A:(1,0,1) 7F:(1,0,2)
1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 5B:(1,0,1) 6B:(2,1,1) 7E:(1,0,2)
1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 5B:(1,0,1) 6C:(2,1,1) 7H:(1,2,2)
1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 5G:(2,1,1) 6J:(0,0,1) 7H:(1,2,2)
1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4J:(0,1,0) 6F:(1,0,1) 7F:(1,0,2) 5K:(2,2,1)
1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4L:(0,1,0) 5E:(1,1,1) 6J:(1,0,1) 7E:(0,1,2)
1A:(0,0,0) 2T:(2,1,0) 3E:(0,2,0) 4L:(0,1,0) 5G:(2,1,1) 6L:(2,2,1) 7E:(0,1,2)
1A:(0,0,0) 2T:(2,1,0) 4L:(2,2,0) 7A:(0,1,0) 5A:(1,1,1) 6A:(0,0,1) 3H:(0,0,2)
1A:(0,0,0) 2T:(2,1,0) 7A:(0,1,0) 3K:(2,2,0) 4F:(0,0,1) 5C:(1,1,1) 6K:(2,1,1)
1A:(0,0,0) 2T:(2,1,0) 3L:(2,2,0) 4L:(0,1,0) 5D:(0,2,0) 6J:(1,0,1) 7E:(0,1,2)
1A:(0,0,0) 2T:(2,2,0) 3K:(2,0,0) 4I:(1,2,0) 6D:(0,2,0) 7E:(0,1,2) 5I:(0,0,1)
1A:(0,0,0) 2T:(2,2,0) 3K:(2,0,0) 6D:(0,2,0) 7F:(1,0,2) 4K:(1,2,0) 5K:(2,2,1)
1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 2U:(1,0,2) 4I:(0,2,0) 6A:(1,1,1) 3A:(0,0,2)
1A:(0,0,0) 3E:(0,2,0) 4J:(0,1,0) 5K:(2,1,0) 6J:(0,0,1) 7H:(1,2,2) 2U:(1,0,2)
1A:(0,0,0) 3E:(0,2,0) 4L:(0,1,0) 5K:(2,1,0) 6L:(2,2,1) 7E:(0,1,2) 2U:(1,0,2)
1A:(0,0,0) 5L:(0,1,0) 7D:(1,2,0) 2U:(1,0,2) 3I:(0,2,0) 6A:(1,1,1) 4A:(0,0,2)
1A:(0,0,0) 4I:(0,1,0) 5B:(1,0,1) 6E:(1,2,0) 2U:(1,0,2) 3I:(0,2,0) 7H:(1,2,2)
1A:(0,0,0) 4L:(0,1,0) 6B:(1,0,1) 7D:(1,2,0) 2U:(1,0,2) 3I:(0,2,0) 5J:(2,1,1)
1A:(0,0,0) 5C:(2,1,0) 6L:(2,1,1) 7A:(0,1,0) 4A:(0,0,1) 2U:(1,2,2) 3A:(0,0,2)
1A:(0,0,0) 4H:(0,2,0) 5C:(2,1,0) 6L:(2,1,1) 7H:(0,2,1) 2U:(1,2,2) 3A:(0,0,2)
1A:(0,0,0) 4L:(0,1,0) 7D:(1,2,0) 2V:(0,1,2) 3J:(2,0,0) 5A:(1,1,1) 6J:(1,0,1)
1A:(0,0,0) 3K:(2,0,0) 5F:(2,1,0) 6B:(2,1,1) 7E:(0,0,1) 2V:(0,1,2) 4C:(0,0,2)
1A:(0,0,0) 3K:(2,0,0) 4L:(0,1,0) 5F:(2,1,0) 6B:(2,1,1) 7E:(1,0,2) 2V:(0,1,2)
1A:(0,0,0) 3K:(2,0,0) 4L:(0,1,0) 5F:(2,1,0) 6C:(2,1,1) 7H:(1,2,2) 2V:(0,1,2)
1A:(0,0,0) 3E:(0,2,0) 4J:(0,1,0) 6K:(2,0,0) 7F:(1,0,2) 2V:(2,0,2) 5K:(2,2,1)
1A:(0,0,0) 5C:(2,1,0) 7A:(0,1,0) 4F:(0,0,1) 6G:(2,1,1) 2V:(2,1,2) 3B:(2,0,2)
1A:(0,0,0) 3K:(2,0,0) 4K:(2,1,0) 6F:(0,1,0) 2V:(2,1,2) 5A:(0,1,1) 7F:(1,0,2)
1A:(0,0,0) 3K:(2,0,0) 4K:(2,1,0) 7A:(0,1,0) 2V:(2,1,2) 6D:(0,1,1) 5K:(1,2,1)
1A:(0,0,0) 3F:(2,0,0) 4I:(1,2,0) 6I:(0,1,0) 7F:(1,0,2) 2W:(1,2,2) 5J:(2,0,1)
1A:(0,0,0) 3F:(2,0,0) 4I:(1,2,0) 7E:(0,0,1) 2W:(1,2,2) 5J:(2,0,1) 6K:(1,0,1)
1A:(0,0,0) 4K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 5I:(0,1,0) 6J:(0,0,1) 2W:(1,2,2)
1A:(0,0,0) 3K:(2,0,0) 4I:(0,1,0) 6E:(1,2,0) 7F:(1,0,2) 5D:(1,2,1) 2W:(1,2,2)
1A:(0,0,0) 3K:(2,0,0) 4L:(0,1,0) 6E:(1,2,0) 7H:(0,1,2) 5D:(1,2,1) 2W:(1,2,2)
1A:(0,0,0) 6K:(2,0,0) 7D:(1,2,0) 3H:(2,0,2) 4I:(0,2,0) 5I:(0,0,1) 2X:(0,2,2)
1A:(0,0,0) 3K:(2,0,0) 7D:(1,2,0) 4I:(0,2,0) 6A:(1,1,1) 2X:(0,2,2) 5I:(0,0,1)
1A:(0,0,0) 7A:(0,1,0) 6B:(2,1,0) 4C:(0,0,1) 5L:(0,1,1) 2X:(2,1,2) 3D:(0,2,2)
1A:(0,0,0) 3E:(0,2,0) 4J:(2,1,0) 6I:(0,1,0) 7E:(0,1,2) 2X:(2,1,2) 5I:(0,0,1)
1A:(0,0,0) 3E:(0,2,0) 4J:(2,1,0) 5L:(0,1,0) 6L:(1,1,1) 7E:(0,1,2) 2X:(2,1,2)
2B:(2,1,0) 4B:(2,0,0) 1A:(0,1,1) 3I:(0,0,0) 5C:(2,1,1) 6L:(2,2,1) 7E:(0,1,2)
2B:(2,1,0) 4B:(2,0,0) 1A:(0,1,1) 3I:(0,0,0) 5L:(0,2,1) 6B:(2,1,1) 7G:(2,1,2)
2C:(1,2,0) 3C:(2,2,0) 4K:(1,0,0) 5C:(2,1,1) 1A:(0,1,1) 6L:(2,2,1) 7E:(0,1,2)
2C:(1,2,0) 3C:(2,2,0) 4K:(1,0,0) 1A:(0,1,1) 5L:(0,2,1) 6B:(2,1,1) 7G:(2,1,2)
2D:(0,1,0) 3D:(0,2,0) 4J:(2,1,0) 1A:(0,1,1) 5B:(1,0,1) 6I:(0,2,1) 7G:(2,1,2)
2D:(0,1,0) 3D:(0,2,0) 4J:(2,1,0) 6A:(1,0,1) 1A:(0,1,1) 5I:(0,0,1) 7E:(0,1,2)
2D:(0,1,0) 4B:(2,1,0) 1A:(0,1,1) 3L:(2,2,0) 5B:(1,0,1) 6I:(0,2,1) 7G:(2,1,2)
2D:(0,1,0) 4B:(2,1,0) 1A:(0,1,1) 3L:(2,2,0) 6A:(1,0,1) 7E:(0,1,2) 5I:(0,0,1)
2I:(0,2,1) 5G:(1,1,0) 7C:(2,1,0) 1A:(0,1,1) 4H:(2,2,1) 6K:(1,0,1) 3D:(0,2,2)
2I:(0,2,1) 5H:(0,1,0) 6E:(1,1,0) 1A:(0,1,1) 4H:(2,2,1) 7F:(1,0,2) 3D:(0,2,2)
2J:(0,0,1) 5E:(1,0,0) 6F:(1,1,0) 1A:(0,1,1) 4G:(2,0,1) 7E:(0,1,2) 3C:(2,2,2)
2J:(2,0,1) 4H:(2,2,1) 5F:(1,1,0) 7B:(1,0,0) 1A:(0,1,1) 3D:(0,2,2) 6K:(1,0,1)
2Q:(1,0,0) 4I:(0,0,0) 6G:(1,1,0) 7D:(1,2,0) 1A:(0,1,1) 3A:(0,0,2) 5J:(2,1,1)
2Q:(1,0,0) 3I:(0,0,0) 6G:(1,1,0) 7D:(1,2,0) 1A:(0,1,1) 4D:(1,0,2) 5J:(2,1,1)
2R:(0,1,0) 5H:(1,1,0) 6E:(1,2,0) 1A:(0,1,1) 3I:(0,0,0) 4B:(2,0,2) 7H:(1,2,2)
2R:(0,1,0) 6F:(1,1,0) 7C:(2,1,0) 1A:(0,1,1) 3I:(0,0,0) 4B:(2,0,2) 5J:(2,1,1)
2R:(0,1,0) 5E:(1,0,0) 6F:(1,1,0) 1A:(0,1,1) 3I:(0,0,0) 4C:(0,1,2) 7G:(2,1,2)
2R:(0,1,0) 5H:(1,1,0) 7D:(1,2,0) 1A:(0,1,1) 3I:(0,0,0) 4C:(0,1,2) 6L:(2,1,1)
2R:(2,1,0) 3J:(2,0,0) 5F:(1,1,0) 7B:(1,0,0) 1A:(0,1,1) 4B:(2,1,2) 6K:(1,0,1)
2A:(1,0,0) 3A:(0,0,0) 4I:(1,2,0) 5A:(0,1,1) 1A:(1,0,1) 6I:(1,1,1) 7F:(1,0,2)
2A:(1,0,0) 4E:(0,2,0) 6F:(0,0,0) 1A:(1,0,1) 3C:(2,2,2) 5A:(0,1,1) 7F:(1,0,2)
2B:(2,1,0) 3B:(2,0,0) 4L:(0,1,0) 6C:(1,2,1) 1A:(1,0,1) 5L:(1,1,1) 7H:(1,2,2)
2B:(2,1,0) 4B:(2,0,0) 6J:(0,0,0) 1A:(1,0,1) 3B:(2,0,2) 5D:(1,2,1) 7E:(0,1,2)
2B:(2,1,0) 4B:(2,0,0) 1A:(1,0,1) 3J:(0,0,0) 5L:(1,1,1) 6C:(1,2,1) 7H:(1,2,2)
2D:(0,1,0) 4B:(2,1,0) 5K:(2,2,0) 1A:(1,0,1) 3C:(2,2,2) 6D:(0,1,1) 7E:(0,1,2)
2D:(0,1,0) 6H:(2,2,0) 1A:(1,0,1) 4E:(0,2,0) 5A:(0,1,1) 7F:(1,0,2) 3C:(2,2,2)
2D:(0,1,0) 4B:(2,1,0) 1A:(1,0,1) 3K:(2,2,0) 5A:(0,1,1) 6I:(1,1,1) 7F:(1,0,2)
2I:(0,0,1) 6H:(2,2,0) 7A:(0,1,0) 1A:(1,0,1) 4G:(2,2,1) 5L:(0,1,1) 3C:(2,2,2)
2I:(0,2,1) 4G:(2,2,1) 5F:(2,0,0) 6G:(1,0,0) 1A:(1,0,1) 3C:(2,2,2) 7F:(1,0,2)
2Q:(1,2,0) 3I:(0,2,0) 5F:(2,0,0) 6G:(1,0,0) 1A:(1,0,1) 4D:(2,0,2) 7F:(1,0,2)
2R:(0,1,0) 3B:(2,0,0) 5G:(1,1,1) 7D:(1,2,0) 1A:(1,0,1) 4B:(2,0,2) 6I:(1,2,1)
2R:(0,1,0) 4J:(0,0,0) 5F:(2,1,0) 6G:(2,0,0) 1A:(1,0,1) 3B:(2,0,2) 7H:(1,2,2)
2R:(0,1,0) 3J:(0,0,0) 5F:(2,1,0) 6G:(2,0,0) 1A:(1,0,1) 4B:(2,0,2) 7H:(1,2,2)
</code></pre>
<!--kg-card-end: markdown--><p>Many thanks to my colleagues Mouna and Mariem for their precious help in this project.</p>]]></content:encoded></item><item><title><![CDATA[Weather Station : Indoor Temperature]]></title><description><![CDATA[<p>Having a weather station at home is very useful. The most important information is the indoor temperature.</p><h2 id="required-parts">Required parts</h2><ul><li>WeMos D1 mini (ESP8266)</li><li>DS18B20: digital thermometer</li><li>MAX7221: LED display driver</li><li>7 segments LED: 4 digits common cathode</li><li>4.7 k&#x3A9; resistor: 1-Wire pull-up resistor</li><li>10 k&#x3A9; resistor: LED</li></ul>]]></description><link>https://aminebenhariz.com/weather-station-indoor-temperature/</link><guid isPermaLink="false">5c600ad16a1c32362c047a0d</guid><category><![CDATA[Tinkering]]></category><category><![CDATA[Weather Station]]></category><category><![CDATA[Tech]]></category><category><![CDATA[ESP8266]]></category><category><![CDATA[WeMos]]></category><category><![CDATA[DS18B20]]></category><category><![CDATA[MAX7221]]></category><category><![CDATA[Arduino]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Tue, 06 Nov 2018 08:12:43 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2018/10/IMG_0384-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2018/10/IMG_0384-1.jpg" alt="Weather Station : Indoor Temperature"><p>Having a weather station at home is very useful. The most important information is the indoor temperature.</p><h2 id="required-parts">Required parts</h2><ul><li>WeMos D1 mini (ESP8266)</li><li>DS18B20: digital thermometer</li><li>MAX7221: LED display driver</li><li>7 segments LED: 4 digits common cathode</li><li>4.7 k&#x3A9; resistor: 1-Wire pull-up resistor</li><li>10 k&#x3A9; resistor: LED brightness</li><li>Micro USB power supply</li></ul><p>The WeMos D1 mini was introduced in a <a href="https://aminebenhariz.com/wemos-d1-mini-presentation/">previous post</a>. It will be used to read the temperature from the DS18B20, and send it to MAX7221 to be displayed.</p><p>MAX7221 is a LED display driver. It can control up to 8 digits. Currently, we will be using just 4 digits. The brightness can be adjusted too.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://aminebenhariz.com/content/images/2018/11/MAX7221.JPG" class="kg-image" alt="Weather Station : Indoor Temperature" loading="lazy"></figure><p>The 8 black wires connected to the LCD are for controlling 1 digit segments at a time (7 segments + 1 decimal point).</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0384.jpg" class="kg-image" alt="Weather Station : Indoor Temperature" loading="lazy"></figure><p>On the back side, there are 4 red wires. Each one is for controlling a digit.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0385.jpg" class="kg-image" alt="Weather Station : Indoor Temperature" loading="lazy"></figure><h2 id="connecting-the-wemos">Connecting the WeMos</h2><p>I might reuse the WeMos in other projects in the future, so I soldered 2 rows of sockets.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0390-1.jpg" class="kg-image" alt="Weather Station : Indoor Temperature" loading="lazy"></figure><p>Here is the WeMos with the sockets soldered in place:</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0391.jpg" width="1497" height="998" loading="lazy" alt="Weather Station : Indoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0391.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0391.jpg 1000w, https://aminebenhariz.com/content/images/2018/10/IMG_0391.jpg 1497w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0392.jpg" width="1267" height="845" loading="lazy" alt="Weather Station : Indoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0392.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0392.jpg 1000w, https://aminebenhariz.com/content/images/2018/10/IMG_0392.jpg 1267w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>To connect the WeMos to the MAX7221, we need 5 wires:</p><ul><li>3V3 &lt;==&gt; VCC</li><li>G &lt;==&gt; GND</li><li>D6 &lt;==&gt; LOAD</li><li>D7 &lt;==&gt; CLK</li><li>D8 &lt;==&gt; DIN</li></ul><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0396.jpg" class="kg-image" alt="Weather Station : Indoor Temperature" loading="lazy"></figure><p>The WeMos is running the following code:</p><!--kg-card-begin: markdown--><pre><code class="language-arduino">#include &lt;OneWire.h&gt;
#include &lt;DallasTemperature.h&gt;
#include &lt;LedControl.h&gt;

// start oneWire connection on Pin D5
OneWire oneWire(D5);

// Pin D6 &lt;==&gt; LOAD
// Pin D7 &lt;==&gt; CLK
// Pin D8 &lt;==&gt; DIN
LedControl lc = LedControl(D8, D7, D6, 1);
 
DallasTemperature DS18B20(&amp;oneWire);
char temperatureCString[7];

// reads temperature and returns a string. Example: 24.9 or -12.2
void getTemperature() {
  float tempC;
  do {
    DS18B20.requestTemperatures(); 
    tempC = DS18B20.getTempCByIndex(0);
    dtostrf(tempC, 4, 1, temperatureCString);
    delay(100);
  } while (tempC == 85.0 || tempC == (-127.0));
}

// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);

  DS18B20.begin();

  // Initialize the MAX7219 device
  lc.shutdown(0,false);   // Enable display
  lc.setIntensity(0,10);  // Set brightness level (0 is min, 15 is max)
  lc.clearDisplay(0);     // Clear display register

}

// runs over and over again
void loop() {
  getTemperature();
  Serial.println(temperatureCString);

  // refresh LED Display
  lc.clearDisplay(0);
  if (temperatureCString[0] == &apos;-&apos;) {
    // Format: -XX.X
    lc.setDigit(0,0, &apos;-&apos;, false);
    lc.setDigit(0,1, temperatureCString[1] - &apos;0&apos;, false);
    lc.setDigit(0,2, temperatureCString[2] - &apos;0&apos;, true);
    lc.setDigit(0,3, temperatureCString[4] - &apos;0&apos;, false);    
  } else {
    // format: XX.X
    lc.setDigit(0,0, &apos;0&apos;, false);
    lc.setDigit(0,1, temperatureCString[0] - &apos;0&apos;, false);
    lc.setDigit(0,2, temperatureCString[1] - &apos;0&apos;, true);
    lc.setDigit(0,3, temperatureCString[3] - &apos;0&apos;, false);
  }

  // wait 10 seconds to avoid DS18B20 self-heating
  delay(10000);
}
</code></pre>
<!--kg-card-end: markdown--><h2 id="cutting-the-case">Cutting the case</h2><p>I used my soldering iron to make holes in the wooden case. Then, I joined the holes to make a continuous cut. Finally, I smoothed the edges.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0398.jpg" width="2000" height="1333" loading="lazy" alt="Weather Station : Indoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0398.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0398.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0398.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0398.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0399.jpg" width="2000" height="1333" loading="lazy" alt="Weather Station : Indoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0399.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0399.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0399.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0399.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0401.jpg" width="2000" height="1333" loading="lazy" alt="Weather Station : Indoor Temperature" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0401.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0401.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0401.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0401.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>The result was acceptable, and the burning coloration was a beautiful addition to aesthetics.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0402.jpg" class="kg-image" alt="Weather Station : Indoor Temperature" loading="lazy"></figure><p>The board is not attached to the box yet, but I managed to make it stay in place temporarily. I will add 4 screws to secure the PCB.</p><p>Notice that the DS18B20 (thermometer) is not on the board, but attached with long wires instead. The reason is that I want to eliminate the self-heating issue.</p><p>The WeMos and the other components generate heat. This could interfere with the temperature readings. The best solution is to put the DS18B20 as far as possible, or even outside the case for better results.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0403.jpg" class="kg-image" alt="Weather Station : Indoor Temperature" loading="lazy"></figure><p></p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0406.jpg" class="kg-image" alt="Weather Station : Indoor Temperature" loading="lazy"></figure><p>The display is bright enough. Current temperature is 24.5&#xB0; Celsius.</p><h2 id="future-upgrades">Future upgrades</h2><ul><li>Etching a thermometer icon with my soldering iron next to the LCD.</li><li>Adding an external thermometer, and a second 4 digits display.</li></ul>]]></content:encoded></item><item><title><![CDATA[WeMos D1 mini : Presentation]]></title><description><![CDATA[<p>The WeMos D1 mini was developed for the tinkerers. It&apos;s based on the ESP8266 chip. There are many cool DIY projects that you can achieve with this board. It&apos;s very similar to the Arduino, has a built-in WiFi, and much cheaper (around $3 on eBay).</p><p>I</p>]]></description><link>https://aminebenhariz.com/wemos-d1-mini-presentation/</link><guid isPermaLink="false">5c600ad16a1c32362c047a06</guid><category><![CDATA[Tinkering]]></category><category><![CDATA[Tech]]></category><category><![CDATA[ESP8266]]></category><category><![CDATA[WeMos]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Tue, 30 Oct 2018 14:32:02 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2018/10/IMG_0387-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2018/10/IMG_0387-2.jpg" alt="WeMos D1 mini : Presentation"><p>The WeMos D1 mini was developed for the tinkerers. It&apos;s based on the ESP8266 chip. There are many cool DIY projects that you can achieve with this board. It&apos;s very similar to the Arduino, has a built-in WiFi, and much cheaper (around $3 on eBay).</p><p>I currently have 2 of these, and I will be using them soon in 2 home projects.</p><p>The ESP8266 chip is soldered on the front side. It has 16 pins and a WiFi antenna.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0387.jpg" class="kg-image" alt="WeMos D1 mini : Presentation" loading="lazy"><figcaption>Front of the WeMos D1 mini</figcaption></figure><p>On the back, we find the micro USB connector, a USB to serial interface &quot;CH340G&quot;, a voltage regulator, a reset button, a 12MHz resonator, and a fuse.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0388.jpg" class="kg-image" alt="WeMos D1 mini : Presentation" loading="lazy"><figcaption>Back of the WeMos D1 mini</figcaption></figure><h2 id="esp8266-12s">ESP8266-12S</h2><p>The ESP8266 has a single core 32-bit CPU that runs at 80 MHz.</p><ul><li>4MB Flash</li><li>3.0 ~ 3.6V (recommendation 3.3V)</li><li>80mA Nominal working current</li><li>802.11 b / g / n</li><li>2.4GHz-2.5GHz (2400M-2483.5M), PCB trace antenna</li><li>UART / HSPI / I2C / I2S / Ir Remote Control / GPIO / PWM</li><li>24 x 16mm PCB, 2x8 castellated connections</li><li>Operating temperature: -40&#xB0;C ~ 125&#xB0;C</li></ul><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/esp8266.JPG" class="kg-image" alt="WeMos D1 mini : Presentation" loading="lazy"></figure><h2 id="ch340g">CH340G</h2><p>The &quot;WCH CH340G&quot; is an USB to UART interface. It provides a virtual serial port to a PC. The role of this chip is to make communication with the ESP8266 easier. No need for a separate FTDI serial adapter.</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/CH340G.PNG" class="kg-image" alt="WeMos D1 mini : Presentation" loading="lazy"></figure><p>The resonator schematics:</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/resonator.PNG" class="kg-image" alt="WeMos D1 mini : Presentation" loading="lazy"></figure><p>Here you can find the pinout of the chip (the grayed pins are not used):</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:center">Pin#</th>
<th style="text-align:center">Name</th>
<th style="text-align:center">Direction</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">GND</td>
<td style="text-align:center">Power</td>
<td>Ground reference of the chip. Connect to the ground of USB bus.</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">TXD</td>
<td style="text-align:center">Output</td>
<td>UART Data Transmit output.</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">RXD</td>
<td style="text-align:center">Input</td>
<td>UART Data Receive input.</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">V3</td>
<td style="text-align:center">Power</td>
<td>Internal 3.3V reference for USB physical layer. Decouple with a 4.7-20nF capacitor when in 5V operation, or tie to VCC when in 3.3V operation.</td>
</tr>
<tr>
<td style="text-align:center">5</td>
<td style="text-align:center">UD+</td>
<td style="text-align:center">Analog</td>
<td>USB D+ signal.</td>
</tr>
<tr>
<td style="text-align:center">6</td>
<td style="text-align:center">UD-</td>
<td style="text-align:center">Analog</td>
<td>USB D- signal.</td>
</tr>
<tr>
<td style="text-align:center">7</td>
<td style="text-align:center">XI</td>
<td style="text-align:center">Input</td>
<td>Input of the crystal oscillator. Connect to the crystal resonator and load capacitors.</td>
</tr>
<tr>
<td style="text-align:center">8</td>
<td style="text-align:center">XO</td>
<td style="text-align:center">Output</td>
<td>Output of the crystal oscillator. Connect to the crystal resonator and load capacitors.</td>
</tr>
<tr>
<td style="text-align:center"><span style="color:lightgrey">9</span></td>
<td style="text-align:center"><span style="color:lightgrey">CTS#</span></td>
<td style="text-align:center"><span style="color:lightgrey">Input</span></td>
<td><span style="color:lightgrey">UART flow control signal Clear to Send.</span></td>
</tr>
<tr>
<td style="text-align:center"><span style="color:lightgrey">10</span></td>
<td style="text-align:center"><span style="color:lightgrey">DSR#</span></td>
<td style="text-align:center"><span style="color:lightgrey">Input</span></td>
<td><span style="color:lightgrey">UART flow control signal Data Set Ready.</span></td>
</tr>
<tr>
<td style="text-align:center"><span style="color:lightgrey">11</span></td>
<td style="text-align:center"><span style="color:lightgrey">RI#</span></td>
<td style="text-align:center"><span style="color:lightgrey">Input</span></td>
<td><span style="color:lightgrey">UART flow control signal Ring In.</span></td>
</tr>
<tr>
<td style="text-align:center"><span style="color:lightgrey">12</span></td>
<td style="text-align:center"><span style="color:lightgrey">DCD#</span></td>
<td style="text-align:center"><span style="color:lightgrey">Input</span></td>
<td><span style="color:lightgrey">UART flow control signal Data Carrier Detect.</span></td>
</tr>
<tr>
<td style="text-align:center">13</td>
<td style="text-align:center">DTR#</td>
<td style="text-align:center">Output</td>
<td>UART flow control signal Data Terminal Ready.</td>
</tr>
<tr>
<td style="text-align:center">14</td>
<td style="text-align:center">RTS#</td>
<td style="text-align:center">Output</td>
<td>UART flow control signal Request to Send.</td>
</tr>
<tr>
<td style="text-align:center"><span style="color:lightgrey">15</span></td>
<td style="text-align:center"><span style="color:lightgrey">R232</span></td>
<td style="text-align:center"><span style="color:lightgrey">Input</span></td>
<td><span style="color:lightgrey">Auxiliary RS232 enable. Active high, internal pull down.</span></td>
</tr>
<tr>
<td style="text-align:center">16</td>
<td style="text-align:center">VCC</td>
<td style="text-align:center">Power</td>
<td>Supply rail for the chip.</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><h2 id="me6211-voltage-regulator">ME6211 Voltage Regulator</h2><ul><li>has a maximum output of 500 mA.</li><li>Operating Voltage Range: 2V&#xFF5E;6.0V</li><li>Low Power Consumption: 40 &#xB5;A</li><li>Standby Current: 0.1 &#xB5;A</li></ul><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/me6211.JPG" class="kg-image" alt="WeMos D1 mini : Presentation" loading="lazy"></figure><p>In the next post, we will see how to connect the WeMos to a PC, and upload programs using the Arduino IDE.</p>]]></content:encoded></item><item><title><![CDATA[PHILIPS AZ7481/00 portable CD player]]></title><description><![CDATA[<p>This is the second device that I bought last week (see the <a href="https://aminebenhariz.com/koss-ks5302/">KOSS KS5302</a>).</p><p>This device is presenting no physical damage, and the PCB looks fine too. But, unlike the KOSS, it&apos;s partially working: the CD motor is rotating, the LCD screen has some faint scrambled data.</p><h2 id="external-case-specification">External</h2>]]></description><link>https://aminebenhariz.com/philips-az7481/</link><guid isPermaLink="false">5c600ad16a1c32362c047a15</guid><category><![CDATA[Tinkering]]></category><category><![CDATA[Tech]]></category><category><![CDATA[Flea Market]]></category><category><![CDATA[PHILIPS AZ7481/00]]></category><category><![CDATA[Portable CD Player]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Mon, 29 Oct 2018 10:30:00 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2018/10/IMG_0446-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2018/10/IMG_0446-1.jpg" alt="PHILIPS AZ7481/00 portable CD player"><p>This is the second device that I bought last week (see the <a href="https://aminebenhariz.com/koss-ks5302/">KOSS KS5302</a>).</p><p>This device is presenting no physical damage, and the PCB looks fine too. But, unlike the KOSS, it&apos;s partially working: the CD motor is rotating, the LCD screen has some faint scrambled data.</p><h2 id="external-case-specification">External case specification</h2><ul><li>ESA25: 25 second electronic shock absorption</li><li>Digital Sound Processing: 3 stage dynamic bass boost</li><li>Battery supply: 2 x LR6/AA/UM3</li><li>External supply: 4.5V - 400mA</li><li>Made in China</li></ul><h2 id="internal-ics-reference">Internal ICs reference</h2><ul><li>SAA7374GP: Low voltage digital servo processor and Compact Disc decoder</li><li>AZ7395.3 87CK20AF2320: 8-bits MCU / LCD driver / timer</li><li>NPC SM5902AF: shock-proof memory controller LSI</li><li>MPC17A50: Servo driver</li><li>BA3574BFS: Headphone amplifier</li><li>2 x HYB314400BJ-60: DRAM 4Mbit (8Mbit total)</li></ul><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0446.jpg" width="2000" height="2000" loading="lazy" alt="PHILIPS AZ7481/00 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0446.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0446.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0446.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0446.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0447.jpg" width="2000" height="2000" loading="lazy" alt="PHILIPS AZ7481/00 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0447.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0447.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0447.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0447.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0448.jpg" width="2000" height="1333" loading="lazy" alt="PHILIPS AZ7481/00 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0448.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0448.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0448.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0448.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0449.jpg" width="2000" height="2000" loading="lazy" alt="PHILIPS AZ7481/00 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0449.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0449.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0449.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0449.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>PHILIPS AZ7481/00</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[KOSS KS5302 portable CD player]]></title><description><![CDATA[<p>Last week, I bought 2 audio CD players from the flea market for 10 TND ($3.50). Here I&apos;m presenting the first device : KOSS KS5302. Currently it&apos;s not working, but I&apos;m trying to fix it.</p><p>I noticed some alkaline battery leakage on the connector</p>]]></description><link>https://aminebenhariz.com/koss-ks5302/</link><guid isPermaLink="false">5c600ad16a1c32362c047a14</guid><category><![CDATA[Tinkering]]></category><category><![CDATA[Tech]]></category><category><![CDATA[Flea Market]]></category><category><![CDATA[KOSS KS5302]]></category><category><![CDATA[Portable CD Player]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Mon, 29 Oct 2018 09:30:32 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2018/10/IMG_0436-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2018/10/IMG_0436-2.jpg" alt="KOSS KS5302 portable CD player"><p>Last week, I bought 2 audio CD players from the flea market for 10 TND ($3.50). Here I&apos;m presenting the first device : KOSS KS5302. Currently it&apos;s not working, but I&apos;m trying to fix it.</p><p>I noticed some alkaline battery leakage on the connector and also on the PCB (see photos). So the first step will be to clean the mess.</p><h2 id="specification">Specification</h2><p>Here are some specification printed on the case:</p><ul><li>Model: KS5302 Series</li><li>External DC supply: 4.5V</li><li>Battery supply: 3V (2 x 1.5V AA)</li><li>Manufactured : February 2004</li><li>Custom manufactured in China</li><li>45 seconds ASP</li><li>CD-RW playback</li></ul><h2 id="ics-reference">ICs reference</h2><p>Some ICs references from the PCB:</p><ul><li>BU9534KV (IC201): Signal processor LSI with anti-shock memory controller for CD players.</li><li>4453 (IC301): Headphone Audio Amplifiers</li><li>1X16Y3VTW (IC401): 16M SDRAM</li><li>BU24590-8W (IC501): ICMCU-16K-LCD 4BIT CPU</li><li>BH6575FV (IC601): ICMOTORDRIVER-04CH</li></ul><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0435.jpg" width="2000" height="2000" loading="lazy" alt="KOSS KS5302 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0435.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0435.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0435.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0435.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0436-1.jpg" width="2000" height="2000" loading="lazy" alt="KOSS KS5302 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0436-1.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0436-1.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0436-1.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0436-1.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0437.jpg" width="2000" height="1334" loading="lazy" alt="KOSS KS5302 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0437.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0437.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0437.jpg 1600w, https://aminebenhariz.com/content/images/2018/10/IMG_0437.jpg 2023w" sizes="(min-width: 720px) 720px"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0439.jpg" width="2000" height="1333" loading="lazy" alt="KOSS KS5302 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0439.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0439.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0439.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0439.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0440.jpg" width="2000" height="2000" loading="lazy" alt="KOSS KS5302 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0440.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0440.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0440.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0440.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0442.jpg" width="2000" height="2000" loading="lazy" alt="KOSS KS5302 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0442.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0442.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0442.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0442.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0443.jpg" width="2000" height="2000" loading="lazy" alt="KOSS KS5302 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0443.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0443.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0443.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0443.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0444.jpg" width="1959" height="1959" loading="lazy" alt="KOSS KS5302 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0444.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0444.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0444.jpg 1600w, https://aminebenhariz.com/content/images/2018/10/IMG_0444.jpg 1959w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_0445.jpg" width="2000" height="2000" loading="lazy" alt="KOSS KS5302 portable CD player" srcset="https://aminebenhariz.com/content/images/size/w600/2018/10/IMG_0445.jpg 600w, https://aminebenhariz.com/content/images/size/w1000/2018/10/IMG_0445.jpg 1000w, https://aminebenhariz.com/content/images/size/w1600/2018/10/IMG_0445.jpg 1600w, https://aminebenhariz.com/content/images/size/w2400/2018/10/IMG_0445.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption>KOSS KS5302</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[How I got my SteelSeries 6GV2 mechanical keyboard]]></title><description><![CDATA[<p>Few months ago, on a beautiful Sunday morning, I visited a local flea market. I was not looking for something in particular, but what I found that day was beyond my expectation: a SteelSeries 6GV2 mechanical keyboard.</p><p>The vendor was an old man, and the items he was selling were</p>]]></description><link>https://aminebenhariz.com/steelseries-6gv2-mechanical-keyboard/</link><guid isPermaLink="false">5c600ad16a1c32362c047a07</guid><category><![CDATA[Tinkering]]></category><category><![CDATA[Tech]]></category><category><![CDATA[Flea Market]]></category><category><![CDATA[SteelSeries 6GV2]]></category><category><![CDATA[Keyboard]]></category><category><![CDATA[Mechanical Keyboard]]></category><category><![CDATA[Cherry MX]]></category><category><![CDATA[SteelSeries]]></category><category><![CDATA[USB]]></category><dc:creator><![CDATA[Amine Ben Hariz]]></dc:creator><pubDate>Wed, 24 Oct 2018 10:15:07 GMT</pubDate><media:content url="https://aminebenhariz.com/content/images/2018/10/IMG_9432.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://aminebenhariz.com/content/images/2018/10/IMG_9432.jpg" alt="How I got my SteelSeries 6GV2 mechanical keyboard"><p>Few months ago, on a beautiful Sunday morning, I visited a local flea market. I was not looking for something in particular, but what I found that day was beyond my expectation: a SteelSeries 6GV2 mechanical keyboard.</p><p>The vendor was an old man, and the items he was selling were pretty much useless junk. I noticed the keyboard by pure luck. It was thicker than usual, and the keys were high. I pressed down the keys, thinking it was one of those fake membrane gamer keyboards, and to my surprise it was not. I asked for the price. The man wanted 5 TND for it (around $2).</p><p>Given the price, I suspected that it was not functional. I bought it anyway, at least for the switches (Cherry MX Black).</p><p>During the first test, the keyboard was detected, but was not working properly. Many keys were typing doubles when pressed, and the escape key was not working at all. I knew it was the time to bring my tools.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_9427.jpg" class="kg-image" alt="How I got my SteelSeries 6GV2 mechanical keyboard" loading="lazy"><figcaption>The front and back panels</figcaption></figure><p>Once opened, I noticed some dirt, corrosion, and even water damage. Not very promising. The &quot;double keystroke&quot; was caused by a short circuit. A deep cleaning with a toothbrush and alcohol fixed the issue.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_9429.jpg" class="kg-image" alt="How I got my SteelSeries 6GV2 mechanical keyboard" loading="lazy"><figcaption>The escape key&apos;s soldering was faulty</figcaption></figure><p>For the escape key, the connection needed some soldering. My trusty Chinese 25W soldering iron was up to the task.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_9419.jpg" class="kg-image" alt="How I got my SteelSeries 6GV2 mechanical keyboard" loading="lazy"><figcaption>soaking the caps in water</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_9431.jpg" class="kg-image" alt="How I got my SteelSeries 6GV2 mechanical keyboard" loading="lazy"></figure><p>I washed all the key caps, and the plastic case with soap and water. &#xA0;I also painted the rusty metallic chassis with black paint. It was like new!</p><figure class="kg-card kg-image-card"><img src="https://aminebenhariz.com/content/images/2018/10/IMG_9432-1.jpg" class="kg-image" alt="How I got my SteelSeries 6GV2 mechanical keyboard" loading="lazy"></figure><p>Since then, I have used it as my primary keyboard. It has worked flawlessly for 7 months now.</p>]]></content:encoded></item></channel></rss>