tag:blogger.com,1999:blog-66782284860646311332024-03-14T06:37:08.825-05:00WhiskeyTangoHotel.ComElectronic projects and other DIY musings.WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/16789452680602626004noreply@blogger.comBlogger133125tag:blogger.com,1999:blog-6678228486064631133.post-56776749130421239502024-02-28T14:19:00.003-06:002024-02-28T15:32:24.734-06:00USB Jump Battery "Hack" for Meshtastic WisBlock Base Board <p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijZXLNhAKTFz1chIWBxAr_7d5Bwc5IE3D1e5qvox-9bz520NNEG218Fc_kRpDjSgRxZ2QDx7EUPjBtJEWiYfk1RUiNR6ZIDyDmKwoK-K7QMHMEgSki0GBn-_Otdh9wBCKQhyphenhyphenRnwpxFhDXcdu5o6svwiXLr9h7GCawT5Y2LbB3u2BKqwmg8VzYZLL0tU_-Q/s1521/m.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="176" data-original-width="1521" height="46" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijZXLNhAKTFz1chIWBxAr_7d5Bwc5IE3D1e5qvox-9bz520NNEG218Fc_kRpDjSgRxZ2QDx7EUPjBtJEWiYfk1RUiNR6ZIDyDmKwoK-K7QMHMEgSki0GBn-_Otdh9wBCKQhyphenhyphenRnwpxFhDXcdu5o6svwiXLr9h7GCawT5Y2LbB3u2BKqwmg8VzYZLL0tU_-Q/w400-h46/m.JPG" width="400" /></a></div>-----<p></p><p></p><p><a href="https://meshtastic.org/" target="_blank">Meshtasic</a> is cool. The quickie description from their website is: <i>"An open source, off-grid, decentralized, mesh network built to run on affordable, low-power devices"</i>. It's a way to send SMS type messages without the use of the internet, cell phone infrastructure, etc. The hardware is cheap and there are Android and iPhone apps to that support it.</p><p></p><p>We wanted to experiment with <a href="https://meshtastic.org/" target="_blank">Meshtasic</a> and purchased the <a href="https://meshtastic.org/docs/hardware/devices/rak/base-board/" target="_blank">RAKwireless WisBlock Base Board</a> from <a href="https://store.rokland.com/" target="_blank">Rokland</a>. One nice thing about the WisBlock Base Board are the many supported 'plug and play' <a href="https://store.rokland.com/apps/omega-search/?q=wisblock" target="_blank">modules</a> that allow for easy expansion. <br /></p><p>-----</p><p>Enough about that... the problem we had was running the WisBlock base board with battery power. There is a right way to do this and there is the way we did it. The right way is to use a <a href="https://www.amazon.com/EEMB-Rechargeable-Connector-Wireless-Polarity/dp/B0B7N2T1TD" target="_blank">rechargeable LiPo battery</a> with the connector already installed. <br /></p><p>But... this is what we did mainly because we already had a drawer full of <a href="https://www.google.com/search?newwindow=1&sca_esv=f5ffd29b8bf133f7&q=usb+portable+charging+battery&tbm=isch&source=lnms&sa=X&ved=2ahUKEwjOu5vF5M6EAxWFG9AFHebHCvAQ0pQJegQIDhAB&biw=1740&bih=773&dpr=1" target="_blank">USB portable charging battery</a> bricks. Like many other USB powered devices, the current draw from the WisBlock Base Board is so low that when powering it from a <a href="https://www.google.com/search?newwindow=1&sca_esv=f5ffd29b8bf133f7&q=usb+portable+charging+battery&tbm=isch&source=lnms&sa=X&ved=2ahUKEwjOu5vF5M6EAxWFG9AFHebHCvAQ0pQJegQIDhAB&biw=1740&bih=773&dpr=1" target="_blank">USB portable charging battery</a> the portable charger will just shut down thinking there is nothing connected to it. Our fix was to add a 100 ohm load. The WisBlock makes this super easy from the on board BATTERY socket (see "right way" above).<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMdbnVb9bsATdSOJ2Yb8zcC88g2wX0MZ4wPgC0eTvEOdPiJ7IlQnGxzvGhAaBKDUcX9RHRZ28xjdJ8QzLk2v3E5IC7xTeq7bqpCX73hZVMgzS40sij8A6z2p0AyRVBG6Tsqa2JW1d7ZeVpbAjBRoR6PYz54SpX0iXOh9KwuT3xzfHOG7nIW1P5-hVpS4QN/s569/schmatic.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="284" data-original-width="569" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMdbnVb9bsATdSOJ2Yb8zcC88g2wX0MZ4wPgC0eTvEOdPiJ7IlQnGxzvGhAaBKDUcX9RHRZ28xjdJ8QzLk2v3E5IC7xTeq7bqpCX73hZVMgzS40sij8A6z2p0AyRVBG6Tsqa2JW1d7ZeVpbAjBRoR6PYz54SpX0iXOh9KwuT3xzfHOG7nIW1P5-hVpS4QN/s320/schmatic.JPG" width="320" /></a></div><p>----</p><p>Here's the current draw (~15mA) without the 100 ohm load added. All of our tested <a href="https://www.google.com/search?newwindow=1&sca_esv=f5ffd29b8bf133f7&q=usb+portable+charging+battery&tbm=isch&source=lnms&sa=X&ved=2ahUKEwjOu5vF5M6EAxWFG9AFHebHCvAQ0pQJegQIDhAB&biw=1740&bih=773&dpr=1" target="_blank">USB portable charging battery</a> bricks would shut down:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJsaKGyHluUv7QTg1W1kqZORZzXh4o9H5XoUrHxyuJgPOdnyf_cVtdAhKQ2Ht20fGWzqP0jsC0IfSRYTaJxa_sgf4VlYmsAJDl2DuYnIUQBeInJ-p4TbvXPjBoO9VBFjCtVwNhYDtjUFrJfc6o8lWTgsu22WHzSy1_US7uMUQ5w2vl2rwozYj0tV6CVzxS/s1512/current-no100.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1512" data-original-width="1458" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJsaKGyHluUv7QTg1W1kqZORZzXh4o9H5XoUrHxyuJgPOdnyf_cVtdAhKQ2Ht20fGWzqP0jsC0IfSRYTaJxa_sgf4VlYmsAJDl2DuYnIUQBeInJ-p4TbvXPjBoO9VBFjCtVwNhYDtjUFrJfc6o8lWTgsu22WHzSy1_US7uMUQ5w2vl2rwozYj0tV6CVzxS/s320/current-no100.jpg" width="309" /></a></div>-----<br /><p>We plug in the 100 ohm resistor and now all of our tested <a href="https://www.google.com/search?newwindow=1&sca_esv=f5ffd29b8bf133f7&q=usb+portable+charging+battery&tbm=isch&source=lnms&sa=X&ved=2ahUKEwjOu5vF5M6EAxWFG9AFHebHCvAQ0pQJegQIDhAB&biw=1740&bih=773&dpr=1" target="_blank">USB portable charging battery</a> bricks stay activated with ~53mA current draw: </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM6FhAmMZg8eO3h4F4rCo_n53a2EZVUZfd-uGFv-Z5qKDv-PYHm-TjHgJoj7AKv_KrL4a5HLWspyPe1B0HQVbCFM3MwLvFU9cfpJn8E15suy66S_FubH-LwEKD3gtiEUsEP018CBL2Du_RcWitzngcgHQj_nEFu7HGB5Cm5vfiMStZcZIIamppcEOQl3KC/s1304/current-with100.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="984" data-original-width="1304" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM6FhAmMZg8eO3h4F4rCo_n53a2EZVUZfd-uGFv-Z5qKDv-PYHm-TjHgJoj7AKv_KrL4a5HLWspyPe1B0HQVbCFM3MwLvFU9cfpJn8E15suy66S_FubH-LwEKD3gtiEUsEP018CBL2Du_RcWitzngcgHQj_nEFu7HGB5Cm5vfiMStZcZIIamppcEOQl3KC/s320/current-with100.jpg" width="320" /></a></div> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirm7yQz-UWV9BrJdwE0TsWEFMH52P63XhsyIjmx_ZRjktNLkwU3hBQrrtVeBnEyR6gChWfST9HSetfyH6Qj5Sb0YggNv08SgdKBR5JZ85Q4L0Nbv5PNVdU62lnBJS1HID0ZWihlQOcsnbyi98pt9FiI71sWpw_YtPL5rc7mB6Fpql2myBGtxeuAeB_dGgl/s1713/wis-with100-.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1373" data-original-width="1713" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirm7yQz-UWV9BrJdwE0TsWEFMH52P63XhsyIjmx_ZRjktNLkwU3hBQrrtVeBnEyR6gChWfST9HSetfyH6Qj5Sb0YggNv08SgdKBR5JZ85Q4L0Nbv5PNVdU62lnBJS1HID0ZWihlQOcsnbyi98pt9FiI71sWpw_YtPL5rc7mB6Fpql2myBGtxeuAeB_dGgl/s320/wis-with100-.jpg" width="320" /></a></div><br /><p></p><p>-----<br /></p><p>Does it use more juice? Of course it does, but even the small lipstick battery shown will last for days and that's good enough for our use.</p><p>-----</p><p>FWIW, here is what our <a href="https://meshtastic.org/" target="_blank">Meshtasic</a> portable rig looks like:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNXXjS29T6o8sEtBIPBYJoOSVsaroEgtxZ250_9aFu6ojQdYqZBx1nrONIt_s7r24YeZ2GUcW2tBFjW98A1tlcp8Z43r3J8i4V1mH520Lzrwh7pXAOBzm-Ue-XzvvhrLbgs0IO4ZHauJrxZPvbylwjV4bfq5Ic3DsgU1DdOnnrb8ynKWT0i7bMg8TzrKIG/s1555/rig-in-case.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1555" data-original-width="1091" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNXXjS29T6o8sEtBIPBYJoOSVsaroEgtxZ250_9aFu6ojQdYqZBx1nrONIt_s7r24YeZ2GUcW2tBFjW98A1tlcp8Z43r3J8i4V1mH520Lzrwh7pXAOBzm-Ue-XzvvhrLbgs0IO4ZHauJrxZPvbylwjV4bfq5Ic3DsgU1DdOnnrb8ynKWT0i7bMg8TzrKIG/s320/rig-in-case.jpg" width="225" /></a></div><p>-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s231/Green45-32x32Line.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s231/Green45-32x32Line.jpg" width="231" /></a></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-25890852426593642112024-01-23T15:10:00.001-06:002024-01-23T15:15:04.713-06:00WS2812B LED Fireworks Simulator<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEYZHNTwm2scv8_m9N-dri9g5BIA-05n8b4Bw64kaYFJtL46NYBcUnHrUYBLY8VmtdlW1EjLTuTdnvEsakdNu5SK1mJ_akhZW6gKyPmfvnS2ditcl1aDOPu15VQ5cKEYI2IAG4SOXFanN6fKUFfMLHerbg88za0X6yxIielQYrlS8eLPmZflHNodzVs0bd/s534/WS2812B.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="366" data-original-width="534" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEYZHNTwm2scv8_m9N-dri9g5BIA-05n8b4Bw64kaYFJtL46NYBcUnHrUYBLY8VmtdlW1EjLTuTdnvEsakdNu5SK1mJ_akhZW6gKyPmfvnS2ditcl1aDOPu15VQ5cKEYI2IAG4SOXFanN6fKUFfMLHerbg88za0X6yxIielQYrlS8eLPmZflHNodzVs0bd/s320/WS2812B.JPG" width="320" /></a></div><br />-----<p></p><p>WS2812B LED strips are pretty cool. They are string of individually addressable RGB LEDs. This allows control of the color and brightness of each LED.</p><p>Fireworks are also pretty cool. On the downside they can be dangerous, scare wildlife, start fires, be expensive, illegal, etc. So, until we can afford our own <a href="https://www.youtube.com/watch?v=44KvHwRHb3A" target="_blank">fleet of drones</a> we settled on this alternative. Like many projects, we stand on the <a href="https://en.wikipedia.org/wiki/Standing_on_the_shoulders_of_giants" target="_blank">shoulders of giants</a> mentioned in the Ardunio source code below. Our main issue with their code was the effect was never changing so we improved mainly on that aspect; a few other things as well.<br /></p><p>----</p><p>Result: <br /></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/Kd_FGCt1wWE" width="320" youtube-src-id="Kd_FGCt1wWE"></iframe></div>-----<p>The hardware is an ESP8266 and a WS2812B LED-strip with 300 LEDs (16.5 feet). We wanted to use a Ardunio Nano (because we had one), but due to the amount of memory needed to define the arrays for the 300 LEDs we went with an ESP8266 (because we had one).</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi60uqzRS_m2MSbB5qtto7tAv9Z5Cu8_MeNoTOwkx4RyVjWii6s4Q_SJgj1TvehRdEnJyZLmZg9vT7_aCaQMbm0KPzUh46dS1OuASLGd0DOpPWR35dIAL5-vjHERgonRYMO-kvwXl9p1hktLI7D2La-hjnmT5oSBbE6wLoi1ltSBJA3hAAUt7o_nC-_6heK/s606/8266.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="606" data-original-width="436" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi60uqzRS_m2MSbB5qtto7tAv9Z5Cu8_MeNoTOwkx4RyVjWii6s4Q_SJgj1TvehRdEnJyZLmZg9vT7_aCaQMbm0KPzUh46dS1OuASLGd0DOpPWR35dIAL5-vjHERgonRYMO-kvwXl9p1hktLI7D2La-hjnmT5oSBbE6wLoi1ltSBJA3hAAUt7o_nC-_6heK/w198-h275/8266.JPG" width="198" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho4NVPmn-7S5Vhy2N34uNcxBhB35YrshbV6g4K5sPOcfSAra5jsPtq7CxX44Ixcz6RfkT-yUK5ps-uCBtVlIx87o-jEviVQ7AkiL2-HLwc5_KAEYVXOwEXNchmq49aoF17S_M_-ZwOLvOXfISeMC_0q5P-5Fo0Axy7eHYbMOh9jmsnuPYFE_2IoTtyRGs2/s679/stripled.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="339" data-original-width="679" height="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho4NVPmn-7S5Vhy2N34uNcxBhB35YrshbV6g4K5sPOcfSAra5jsPtq7CxX44Ixcz6RfkT-yUK5ps-uCBtVlIx87o-jEviVQ7AkiL2-HLwc5_KAEYVXOwEXNchmq49aoF17S_M_-ZwOLvOXfISeMC_0q5P-5Fo0Axy7eHYbMOh9jmsnuPYFE_2IoTtyRGs2/w187-h94/stripled.JPG" width="187" /></a></div>-----<br />You are also going to need a big pole.<p></p><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLLATUXbpyoFcrdgiLemTlPZF8ge4Ghpw2RB19C1R4VKdOoR1l0x8VJJd4qUHDtvTNnuH1soArmrMx_7oNBubfHWqG1y4rMuC9uV-E2r7ID8whzHdobQ9ZfVLa2jaoIXKRQsJwNDr8YDP6wXDKCBy6OjBJL30jAjtBAzz6Dg63Oh5qXxhpjE-T2VX2C9_u/s4032/1D-on-grnd%20(2).JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="4032" data-original-width="3024" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLLATUXbpyoFcrdgiLemTlPZF8ge4Ghpw2RB19C1R4VKdOoR1l0x8VJJd4qUHDtvTNnuH1soArmrMx_7oNBubfHWqG1y4rMuC9uV-E2r7ID8whzHdobQ9ZfVLa2jaoIXKRQsJwNDr8YDP6wXDKCBy6OjBJL30jAjtBAzz6Dg63Oh5qXxhpjE-T2VX2C9_u/s320/1D-on-grnd%20(2).JPG" width="240" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlv3HJXI1P5R6Hxx15zi6fpAsHmHCVW3311DV5J7VuqD0SFrK_Vp0BfbLY0CwQsbczVVYZ41X7FVPMUPEUB2Z5sveT3V1u_Ti2sGzi_KUMulg7QU1-6_BVTUETKI1mthZZrIYSCuC4VOgA-8I_bNWYZ8AGn2icoAt8GQRVJmlCDJ113NHWxCYbhYJTDPVe/s4032/1D-on-grnd%20(1).JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="3024" data-original-width="4032" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlv3HJXI1P5R6Hxx15zi6fpAsHmHCVW3311DV5J7VuqD0SFrK_Vp0BfbLY0CwQsbczVVYZ41X7FVPMUPEUB2Z5sveT3V1u_Ti2sGzi_KUMulg7QU1-6_BVTUETKI1mthZZrIYSCuC4VOgA-8I_bNWYZ8AGn2icoAt8GQRVJmlCDJ113NHWxCYbhYJTDPVe/s320/1D-on-grnd%20(1).JPG" width="320" /></a></div><br />-----<p></p><p>/* <br /> * LED Fireworks Simulator <br /> * WhiskeyTangoHotel.Com <br /> * JAN 2024<br /> *<br /> * To vary the effect experiments randomizing variables <br /> * within acceptable limits was done. Otherwise the effect<br /> * just looks to same 'shot after shot'. Other mods as well <br /> *<br /> * Leverage from https://www.Daniel-Westhof.de and <br /> * https://www.anirama.com/1000leds/1d-fireworks/<br /> *<br /> * Hardware: <br /> * HiLetgo 1PC ESP8266 NodeMCU CP2102 ESP-12E Development Board and a <br /> * WS2812B LED-strip with 300 LEDs (16.5 feet).<br /> */<br /> <br />#include <FastLED.h> <br />#define NUM_LEDS 300<br />#define DATA_PIN 5 // Labeled a D1 on the board.<br />#define LED_PIN 2 // This is the BLUE LED on board<br />#define NUM_SPARKS NUM_LEDS/2 // OG: NUM_LEDS/2 <br /> <br />CRGB leds[NUM_LEDS]; // sets up block of memory<br /> <br />float sparkPos[NUM_SPARKS];<br />float sparkVel[NUM_SPARKS];<br />float sparkCol[NUM_SPARKS];<br />float flarePos; <br />float gravity = -.008; // m/s/s<br />int launch_delay; // we later randomize seconds between launches<br /> <br />void setup() {<br /> Serial.begin(115200);<br /> FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);<br /> pinMode(LED_PIN, OUTPUT);<br />}<br /> <br />void loop() { <br /> // Delay untill next launch. Blink BLUE on board LED<br /> Serial.println(" ");<br /> launch_delay = int(random(5,30)); // Min>=5. Randomize secs between BOOMs. <br /> //launch_delay = 5; <br /> for (int i = (launch_delay - 5); i > 0; i--) {<br /> Serial.println(String(i + 5) + " seconds to launch...");<br /> digitalWrite(LED_PIN, LOW); // ON<br /> delay(500);<br /> digitalWrite(LED_PIN, HIGH); // OFF<br /> delay(500); <br /> }<br /><br /> // Slower timer done . Fast blink for ~5 seconds to warn of BOOM<br /> Serial.print("5 seconds to launch!!!");<br /> for (int i = 50; i > 0; i--) {<br /> Serial.print(".");<br /> digitalWrite(LED_PIN, LOW); // ON<br /> delay(50);<br /> digitalWrite(LED_PIN, HIGH); // OFF<br /> delay(50); <br /> }<br /><br /> Serial.println(".");<br /> Serial.print("BOOM...");<br /> digitalWrite(LED_PIN, LOW); // LED ON<br /> <br /> // send up flare<br /> flare();<br /> digitalWrite(LED_PIN, HIGH); // LED OFF<br /> <br /> // explode<br /> explodeLoop();<br />} <br /> <br /><br />void flare() { <br /> flarePos = 0; // 0<br /> // flareVel is how hight the BOOM is. 2.2 is max height<br /> float flareVel = float(random(180, 215)) / 100; // Start: (180, 195)) / 100; trial and error to get reasonable range<br /> Serial.println(" with flare height of " + String((flareVel*100)/2.2) + "%"); // How high is the BOOM?<br /> float brightness = 5; // OG: 1<br /> <br /> // initialize launch sparks<br /> int blast_base = random(5,20); // number of sparks at blast base.<br /> for (int i = 0; i < blast_base; i++) { // OG: int i = 0; i < 5; i++ <br /> sparkPos[i] = 0; sparkVel[i] = (float(random8()) / 255) * (flareVel / 2); // OG: (float(random8()) / 255) * (flareVel / 5); the / xx); is control value for BURST<br /> sparkCol[i] = sparkVel[i] * 1000; sparkCol[i] = constrain(sparkCol[i], 0, 255);<br /> //Serial.println(String(i) + " " + String(sparkVel[i]) + " " + String(sparkCol[i]));<br /> } <br /><br /> // launch<br /> while (flareVel >= -.2) { // OG: flareVel >= -.2 when to explode after peak BOOM. Bigger neg val means more fall before sparks<br /> // sparks<br /> for (int i = 0; i < blast_base; i++) { // OG: int i = 0; i < 5; i++ <br /> sparkPos[i] += sparkVel[i];<br /> sparkPos[i] = constrain(sparkPos[i], 0, 120);<br /> sparkVel[i] += gravity;<br /> sparkCol[i] += -.8;<br /> sparkCol[i] = constrain(sparkCol[i], 0, 255);<br /> leds[int(sparkPos[i])] = HeatColor(sparkCol[i]);<br /> leds[int(sparkPos[i])] %= 50; // reduce brightness to 50/255<br /> }<br /> <br /> // flare<br /> leds[int(flarePos)] = CHSV(0, 0, int(brightness * 255));<br /> FastLED.show();<br /> delay(5);<br /> FastLED.clear();<br /> flarePos += flareVel;<br /> flarePos = constrain(flarePos, 0, NUM_LEDS-1);<br /> flareVel += gravity;<br /> brightness *= .99; // OG = .98<br /> } // while (flareVel >= -.2)<br />} // end void flare<br /> <br />void explodeLoop() {<br /> int nSpark_var = random(2, 10); // Bigger number is less BOOM sparks<br /> int nSparks = flarePos / nSpark_var; // OG: nSparks = flarePos / 2 <br /> //Serial.println(String(nSparks));<br /><br /> <br /> // initialize sparks<br /> for (int i = 0; i < nSparks; i++) {<br /> sparkPos[i] = flarePos; sparkVel[i] = (float(random(0, 20000)) / 10000.0) - 1.0; // from -1 to 1<br /> sparkCol[i] = abs(sparkVel[i]) * 500; // set colors before scaling velocity to keep them bright<br /> sparkCol[i] = constrain(sparkCol[i], 0, 255);<br /> sparkVel[i] *= flarePos / NUM_LEDS; // proportional to height<br /> }<br /> sparkCol[0] = 255; // OG: 255 This will be our known spark<br /> float dying_gravity = gravity;<br /> float c1 = random(80,130); // OG: 120<br /> float c2 = random(1,30); // OG: 50<br /> //Serial.println("c1 is: " + String(c1));<br /> //Serial.println("c2 is: " + String(c2));<br /> <br /> <br /> while(sparkCol[0] > c2/128) { // OG: (sparkCol[0] > c2/128) As long as our known spark is lit, work with all the sparks<br /> int decay_rate = (random(0,50)); // Slow to decay the blast sparks. (0,50) seems right. Bigger is slower. OG: delay(0);<br /> delay(decay_rate);<br /> //Serial.println(String(decay_rate));<br /> FastLED.clear();<br /> <br /> for (int i = 0; i < nSparks; i++) { <br /> sparkPos[i] += sparkVel[i];<br /> sparkPos[i] = constrain(sparkPos[i], 0, NUM_LEDS-1);<br /> sparkVel[i] += dying_gravity;<br /> sparkCol[i] *= .975;<br /> sparkCol[i] = constrain(sparkCol[i], 0, 255); // RED cross dissolve. OG: constrain(sparkCol[i], 0, 255);<br /> <br /> if(sparkCol[i] > c1) { // fade white to yellow<br /> leds[int(sparkPos[i])] = CRGB(random(0,255), random(200,255), (255 * (sparkCol[i] - c1)) / (255 - c1)); // OG: CRGB(255, 255, (255 * (sparkCol[i] - c1)) / (255 - c1));<br /> }<br /> else if (sparkCol[i] < c2) { // fade from red to black<br /> leds[int(sparkPos[i])] = CRGB((random(200,255) * sparkCol[i]) / c2, 0, 0); // OG: CRGB((255 * sparkCol[i]) / c2, 0, 0);<br /> }<br /> else { // fade from yellow to red<br /> leds[int(sparkPos[i])] = CRGB(random(0,255), (random(200,255) * (sparkCol[i] - c2)) / (c1 - c2), 0); // OG: CRGB(255, (255 * (sparkCol[i] - c2)) / (c1 - c2), 0);<br /> } <br /> }<br /> dying_gravity *= .99; // OG: dying_gravity *= .99; As sparks burn out they fall slower<br /> FastLED.show(); <br /> } // end while(sparkCol)<br /> <br /> delay(5);<br /> FastLED.clear();<br /> delay(5); <br /> FastLED.show();<br /> Serial.println("Effect Complete!!!");<br />} // end void explodeLoop() </p><p>-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s231/Green45-32x32Line.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s231/Green45-32x32Line.jpg" width="231" /></a></div><br />WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-22553870877896580592023-12-23T10:39:00.006-06:002023-12-23T10:46:27.265-06:00Make Your Own Tombstone and SAVE!<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisMlmbh6A6BgCYH5vRhcIFXVy5t0zCGH5HAZjrosIl-YQY796uiV4q8vd_W-irJ6mj6GZqG2K3g9i5kNDdNtZpNBSur5ANoukxTdsowMzj1oXkcqX_vCk5j2VFu0HZh19I21JNCIf0a7VY6cGPJZhdEMVs93t2k_lGjXWg_S1JuZgapDemHPdX0LS-ZnsX/s578/xKelso_Brick.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="469" data-original-width="578" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisMlmbh6A6BgCYH5vRhcIFXVy5t0zCGH5HAZjrosIl-YQY796uiV4q8vd_W-irJ6mj6GZqG2K3g9i5kNDdNtZpNBSur5ANoukxTdsowMzj1oXkcqX_vCk5j2VFu0HZh19I21JNCIf0a7VY6cGPJZhdEMVs93t2k_lGjXWg_S1JuZgapDemHPdX0LS-ZnsX/s320/xKelso_Brick.jpg" width="320" /></a></div>-----<p></p><p>We saw this <a href="https://hackaday.com/2023/10/14/making-a-concrete-sign/" target="_blank">Hackaday</a> article where <a href="https://www.youtube.com/watch?v=k3wRDKiN2Do" target="_blank">[Proper DIY]</a> used his woodworking skills to produce some excellent quality concrete signs and decorations. We liked the idea but the effort required fashioning the wood for the letters seemed like a lot of work to us.</p><p>-----</p><p>So.... we have a 3D printer and set out to find an easier way. The 'recipe' is pretty easy:</p><p><span> </span>1)Print your design on a 3D printer. 2)Glue the design to the bottom of a concrete mold. 3)Pour concrete, shake out the bubbles, and wait for curing. 4)Unscrew the mold and release the final product.</p><p>The results are good enough with only a fraction of the time (and skill). </p><p>-----</p><p>Maybe not needed, but here is a little more detail:</p><p>- Build mold (use long wood screws to allow reuse):</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinT1IwU0oJndgm8Y8BaFWdPSMyn88mCLdcjs434gpeyyYaDTyNkeFF_UswxPOvniVCyYnyEH5LpZSuuxoWAQviL085OzUFvDhOh9aEK8CNmL-6B4apWYgIO7qEAkKW9kWN43S-0EPOSc6tM67coHuiHdWw4kzXx6YW_uV3ej1BXrBy3fFE7CIBp35heq2T/s4030/xBrickMoldx.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2799" data-original-width="4030" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinT1IwU0oJndgm8Y8BaFWdPSMyn88mCLdcjs434gpeyyYaDTyNkeFF_UswxPOvniVCyYnyEH5LpZSuuxoWAQviL085OzUFvDhOh9aEK8CNmL-6B4apWYgIO7qEAkKW9kWN43S-0EPOSc6tM67coHuiHdWw4kzXx6YW_uV3ej1BXrBy3fFE7CIBp35heq2T/s320/xBrickMoldx.jpg" width="320" /></a></div><p></p><p>- Print your 3D design and glue it the the bottom of the mold:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx8-FFqyTUTFUMtOi9-ZYZQ7NCughbvXAsBb5-UUhENlOlWSrAXIeRiTvPSMySzGz6yO3NRoh7N7FJD_g4RAzJPpikOcHsAzx6colgnEaG3n0tl4czIZfhbTZH8lg5wThexKjDWgZ-Ihj4Ir3PFg9dDkQEsLTK3COCqhyphenhyphenvxJUBCYU1-mnRpF1dNTJgTeIP/s791/k-cad.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="390" data-original-width="791" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx8-FFqyTUTFUMtOi9-ZYZQ7NCughbvXAsBb5-UUhENlOlWSrAXIeRiTvPSMySzGz6yO3NRoh7N7FJD_g4RAzJPpikOcHsAzx6colgnEaG3n0tl4czIZfhbTZH8lg5wThexKjDWgZ-Ihj4Ir3PFg9dDkQEsLTK3COCqhyphenhyphenvxJUBCYU1-mnRpF1dNTJgTeIP/s320/k-cad.JPG" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkvRSbW3k-tOXH9XKyayudUMX7vID_HU_E8wo3D18YZ37-q1wHLkXLbw3dGwbLdbkSFHejUtxTD3p6CGjH4lMfilvoxSFVPqAIgfUf-E3ujdwwe0nTLtQ3VFonexye7YVBFhdfqxfvhN75sIIQIsWBraBZ8CIliw-3hyNIhl-ssfXCSXtKnO3aJno8GLSf/s675/b-cad.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="393" data-original-width="675" height="186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkvRSbW3k-tOXH9XKyayudUMX7vID_HU_E8wo3D18YZ37-q1wHLkXLbw3dGwbLdbkSFHejUtxTD3p6CGjH4lMfilvoxSFVPqAIgfUf-E3ujdwwe0nTLtQ3VFonexye7YVBFhdfqxfvhN75sIIQIsWBraBZ8CIliw-3hyNIhl-ssfXCSXtKnO3aJno8GLSf/s320/b-cad.JPG" width="320" /></a></div><p></p><p>- Fill the mold, vibrate out the voids, then wait. We used this material mainly because we had some on hand:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcKiwlT3Xdu9JemZPe6dMn4IVlC4yjmwZbS7ta0k6fRayt7KURPFuLqTdqh9knHOgrzLY_5qJmp6SMakmOFKUalzZfAppO5jjdr36dUy7gRs9tmCdNxrI4PqZnOWx2A2KN1ZT3Okf_7dpYbH_MIiYoN_wZ0vVGl7D4Z0tBJVLO8uOvCGZb0cJV6c38-IPH/s283/xQikcrete.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="199" data-original-width="283" height="199" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcKiwlT3Xdu9JemZPe6dMn4IVlC4yjmwZbS7ta0k6fRayt7KURPFuLqTdqh9knHOgrzLY_5qJmp6SMakmOFKUalzZfAppO5jjdr36dUy7gRs9tmCdNxrI4PqZnOWx2A2KN1ZT3Okf_7dpYbH_MIiYoN_wZ0vVGl7D4Z0tBJVLO8uOvCGZb0cJV6c38-IPH/s1600/xQikcrete.JPG" width="283" /></a></div><p></p><p>- Results:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgndSAJbO6JJmOinHGErP6J1ByBmiNVGyB61QwOzcWCfSvx7TVf3g6wd1ST1GckfFOCeqbnYUCWUjN1nknpG6MKsXH5LYf7nqsv9qNeiLjGj7_Z6WWm2BXS44ioGDnCnfUZBjRv9mDS1tSZbOhH8sUxhB153c0D1uv9tLx6bIFBWlA5MaVrfJtnNF8cYPzO/s3402/xBison_Brickx.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2577" data-original-width="3402" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgndSAJbO6JJmOinHGErP6J1ByBmiNVGyB61QwOzcWCfSvx7TVf3g6wd1ST1GckfFOCeqbnYUCWUjN1nknpG6MKsXH5LYf7nqsv9qNeiLjGj7_Z6WWm2BXS44ioGDnCnfUZBjRv9mDS1tSZbOhH8sUxhB153c0D1uv9tLx6bIFBWlA5MaVrfJtnNF8cYPzO/s320/xBison_Brickx.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbnlaCXN7ZcJ6w6w4qBZtUVsjDQ0NATCZpyhvO0JtmNb4cH9jUgK0_Pmb3iRqQeaHSLUncPye8dkTk5RdxIBuGds1ZPZfK4s1vafhvvY7NC6XOijRwsu_GSPoXkt-xHDxOnybwDV534x9Dif8Ja0zLxX3MWhjOlTGhimZ6uGv-thdi66YCvgaD-Q2Cor20/s578/xKelso_Brick.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="469" data-original-width="578" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbnlaCXN7ZcJ6w6w4qBZtUVsjDQ0NATCZpyhvO0JtmNb4cH9jUgK0_Pmb3iRqQeaHSLUncPye8dkTk5RdxIBuGds1ZPZfK4s1vafhvvY7NC6XOijRwsu_GSPoXkt-xHDxOnybwDV534x9Dif8Ja0zLxX3MWhjOlTGhimZ6uGv-thdi66YCvgaD-Q2Cor20/s320/xKelso_Brick.jpg" width="320" /></a></div><p>-----</p><p>We are happy with outcome. <a href="https://www.youtube.com/watch?v=k3wRDKiN2Do" target="_blank">[Proper DIY]</a> did have better results, but with a whole, whole, whole lot more effort.</p><p>-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s231/Green45-32x32Line.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s231/Green45-32x32Line.jpg" width="231" /></a></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-42841295342742471222023-12-04T12:04:00.000-06:002023-12-04T12:04:29.292-06:00 Measuring CW Keyer speed on the Flex 6400 and QRP Labs QCX<p> </p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/SvXelAaDPfI" width="320" youtube-src-id="SvXelAaDPfI"></iframe></div>----<p></p><p>We are linking to the <a href="https://www.youtube.com/@w2aew" target="_blank">Alan W2AEW</a> video above. Alan's YouTube channel is an excellent resource for ham radio, test and measurement, as well as other electronics knowledge. The video gave us the idea to check the CW keyer speeds on our most expensive rig and our lowest price rig. It seemed like a good excuse to use the <a href="https://www.liquidinstruments.com/" target="_blank">Liquid Instruments</a> Moku:Lab oscilloscope, plus we were curious. </p><p>----</p><p>We won't explain the method, Alan W2AEW does a great job with that in the <a href="https://www.youtube.com/watch?v=SvXelAaDPfI" target="_blank">video</a>. One different is we used the audio output for our delta(t) measurement.</p><p>-----</p><p>Here are our results:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgar1MQcmHXe5QeLiTTH0wZ3cnWkGCWyzcCrxsfu0u72VXAJXumLyoiAPH_AFvv50gWRGzFMRqKUUXYOmmZKRD4bcP8I66wqjCGziDH23rUhPiH1jdEW-VCM_O7oUx5tPNmd3XuaP092L6BRJjFvC3zNmcOhTCaQT_3rQB9PZ6gJ_-yr8McCZNrhD3mDySh/s521/cw-table.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="276" data-original-width="521" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgar1MQcmHXe5QeLiTTH0wZ3cnWkGCWyzcCrxsfu0u72VXAJXumLyoiAPH_AFvv50gWRGzFMRqKUUXYOmmZKRD4bcP8I66wqjCGziDH23rUhPiH1jdEW-VCM_O7oUx5tPNmd3XuaP092L6BRJjFvC3zNmcOhTCaQT_3rQB9PZ6gJ_-yr8McCZNrhD3mDySh/w400-h213/cw-table.JPG" width="400" /></a></div><p>We haven't seen the same <a href="https://reversebeacon.net/" target="_blank">RBN</a> vs. Rig WPM speed different as Alan pointed out and the table helps explain why. Sure, the numbers are 'off' at the 25WPM test, but we seldom operate at those CW speeds.</p><p>----</p><p><a href="https://www.flexradio.com/products/flex-6400-signature-series-sdr-transceiver/" target="_blank">FlexRadio 6400</a>: <a href="https://www.liquidinstruments.com/products/hardware-platforms/mokulab/" target="_blank">Moku:Lab oscilloscope</a> captures:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVYJGTU6p1-mhbTHfTPSO4_1QntvKhmCnjraUI-KMAGJDzEsdhaWaq-soI_iGKkMOjKgy3g91SEDdrqKbZ4Fnij-Z-0yxwb8dueYxp9oQJ53d86SzdZ-l7O__e4LTu4sH4r9t2mTsve3uPiZr5iWr0InuP4kG9SOJ4aEbRz6VwzHa8bxva941Vf7LGk0lo/s1086/flex15wpm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="352" data-original-width="1086" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVYJGTU6p1-mhbTHfTPSO4_1QntvKhmCnjraUI-KMAGJDzEsdhaWaq-soI_iGKkMOjKgy3g91SEDdrqKbZ4Fnij-Z-0yxwb8dueYxp9oQJ53d86SzdZ-l7O__e4LTu4sH4r9t2mTsve3uPiZr5iWr0InuP4kG9SOJ4aEbRz6VwzHa8bxva941Vf7LGk0lo/w400-h130/flex15wpm.JPG" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhofwO4x8qn8mIIXiHUZGagOG5V6m71zYexMlQGgp9F8AoEt5qvhXbjHSFC9Kiy5AQ8uhURH7J_pVRcC7LwTj84glsBgMIC8lcQCPPjnPwKS7f3u2hHYFOj_sdg8fRyMO9uG4hKy5FakqXGGLzkttC9dM-G4AJthoVJarLxwT-Jl6suEZUZLgyrZXi1H0lD/s828/flex20wpm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="345" data-original-width="828" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhofwO4x8qn8mIIXiHUZGagOG5V6m71zYexMlQGgp9F8AoEt5qvhXbjHSFC9Kiy5AQ8uhURH7J_pVRcC7LwTj84glsBgMIC8lcQCPPjnPwKS7f3u2hHYFOj_sdg8fRyMO9uG4hKy5FakqXGGLzkttC9dM-G4AJthoVJarLxwT-Jl6suEZUZLgyrZXi1H0lD/w400-h166/flex20wpm.JPG" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfptoYZOHrsyg_xOKRwDPoOw_P36jgHodV9uzBLqqlGyq8-aHQJUszmMWTiAZXPLO6hD3dlo3bGCCSR88tXpopqsGWSRMS7gm3vt1nYdlEO-zSf_h3fLhOjM3uf0CqN32oLDBWl3BO4KB7dAJjA2WOgYwXhu-_K2hjPvBXuaE5f6FtZ3UUCrfPBwqowdtj/s725/flex25wpm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="351" data-original-width="725" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfptoYZOHrsyg_xOKRwDPoOw_P36jgHodV9uzBLqqlGyq8-aHQJUszmMWTiAZXPLO6hD3dlo3bGCCSR88tXpopqsGWSRMS7gm3vt1nYdlEO-zSf_h3fLhOjM3uf0CqN32oLDBWl3BO4KB7dAJjA2WOgYwXhu-_K2hjPvBXuaE5f6FtZ3UUCrfPBwqowdtj/w400-h194/flex25wpm.JPG" width="400" /></a></div><p>-----</p><p><a href="https://qrp-labs.com/qcx.html" target="_blank">QRP Labs QCX</a>: <a href="https://www.liquidinstruments.com/products/hardware-platforms/mokulab/" target="_blank">Moku:Lab oscilloscope</a> captures: <br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgluKKwQyC5JS99jMpeWaMZFub2et6TlU-CaQHeKIf5Eo_TYuxOdqyczt7mH1oYSj64bfwam1BKzZ0lI36pCRMaawFrhojLnUdhgJI1ra8MWNYbb4yHTzpOvREM_YpVkHrT4L2qGWT6E_nb0ny7Rtjkl2kVMiieCrftpxC_T200ZRbXIcKZJ5Eytv_VGSyR/s1081/qcx15wpm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="308" data-original-width="1081" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgluKKwQyC5JS99jMpeWaMZFub2et6TlU-CaQHeKIf5Eo_TYuxOdqyczt7mH1oYSj64bfwam1BKzZ0lI36pCRMaawFrhojLnUdhgJI1ra8MWNYbb4yHTzpOvREM_YpVkHrT4L2qGWT6E_nb0ny7Rtjkl2kVMiieCrftpxC_T200ZRbXIcKZJ5Eytv_VGSyR/w400-h114/qcx15wpm.JPG" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUpDXNrTuOxc7xvtcMlTz0dBqs3fbzCvBC6iZeFIsDxAuHv8oRc34FsIE1frpZfQYD4Q1i8cFwawDLoL8z_htI2NvmMI2hpM4N12k6JKPM_9nm9jv9sFxO4rzkYl5iisilIQCB-3WBFbLh4sVONOnpHWYZnJySj2H970bgCLCh2R7d4mBn-H0XZ51ZDxEF/s843/qcx20wpm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="306" data-original-width="843" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUpDXNrTuOxc7xvtcMlTz0dBqs3fbzCvBC6iZeFIsDxAuHv8oRc34FsIE1frpZfQYD4Q1i8cFwawDLoL8z_htI2NvmMI2hpM4N12k6JKPM_9nm9jv9sFxO4rzkYl5iisilIQCB-3WBFbLh4sVONOnpHWYZnJySj2H970bgCLCh2R7d4mBn-H0XZ51ZDxEF/w400-h145/qcx20wpm.JPG" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibPGllTQ6AArgrUcD2qvWX-6I0uLBIeZUNH-uKmCXn64xXPItjkIxq_M3Y6YHSkcq7bCdwFpcqg6dMW5f3yyNO_DADBAozgUhA_uVXLl0gawe32Z5PDAQ43VMD_6Zq6kEJF_nsN1CkMGZm-a0rQcliaOMvhA6KlvjuCclEwyJ4wCLGDqcf6AvW94CCyukE/s722/qcx25wpm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="346" data-original-width="722" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibPGllTQ6AArgrUcD2qvWX-6I0uLBIeZUNH-uKmCXn64xXPItjkIxq_M3Y6YHSkcq7bCdwFpcqg6dMW5f3yyNO_DADBAozgUhA_uVXLl0gawe32Z5PDAQ43VMD_6Zq6kEJF_nsN1CkMGZm-a0rQcliaOMvhA6KlvjuCclEwyJ4wCLGDqcf6AvW94CCyukE/w400-h191/qcx25wpm.JPG" width="400" /></a></div>-----<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s231/Green45-32x32Line.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s1600/Green45-32x32Line.jpg" width="231" /></a></div><br /><p><br /></p><p><br /></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-41349489560408172272023-11-17T11:42:00.008-06:002023-11-23T21:11:53.032-06:00Vintage Megger turned Self Torture Device<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp2DQ5dbhc1-NBBKfUwu8IDcgKesmZvLm-IwHATD2n6kHslW2Ep-TMYZk6uqp6LhCT4u0B2Np7Fzw1-L94CAW1Zwi07wE5gQDC6mb47TR4b5zQ7CzIBQB-xOJuF4hzfBqHFScEThASIDG9LeC1zfxR9IP8k2-mgp6PKaBUVevP-7eaGAI4GCn6yDvecXNB/s3729/Clyde_Megger_Meter%20(1).jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="3729" data-original-width="3024" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp2DQ5dbhc1-NBBKfUwu8IDcgKesmZvLm-IwHATD2n6kHslW2Ep-TMYZk6uqp6LhCT4u0B2Np7Fzw1-L94CAW1Zwi07wE5gQDC6mb47TR4b5zQ7CzIBQB-xOJuF4hzfBqHFScEThASIDG9LeC1zfxR9IP8k2-mgp6PKaBUVevP-7eaGAI4GCn6yDvecXNB/s320/Clyde_Megger_Meter%20(1).jpg" width="260" /></a></div><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3e9dm4CGhQt1PTR1BsOb9Q0-lnsaLHNXua27RxNuKgTOkJf3XZ4evsen61pxHvpWNO-gEXU1A3gmUpw7j-Xc1bcvu_JF-D77F4278K7XNz6LkLKlPjtPmhqB5g62K5nal4E-tqK4K0AMflX24zasFRos80yee6QN60HhZ2yZKuDtxzWTnEO8BymA-tVUv/s533/Untitled.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="173" data-original-width="533" height="104" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3e9dm4CGhQt1PTR1BsOb9Q0-lnsaLHNXua27RxNuKgTOkJf3XZ4evsen61pxHvpWNO-gEXU1A3gmUpw7j-Xc1bcvu_JF-D77F4278K7XNz6LkLKlPjtPmhqB5g62K5nal4E-tqK4K0AMflX24zasFRos80yee6QN60HhZ2yZKuDtxzWTnEO8BymA-tVUv/s320/Untitled.png" width="320" /></a></div><p style="text-align: left;">-----</p><p style="text-align: left;">We found this ~60 year old <a href="https://us.megger.com/company/about-us" target="_blank">Biddle Megger</a> while going through the closet. It was used by my father's and was no longer working. The fix was possibly something simple, but we don't need a <a href="https://carelabz.com/megger-test-performed/" target="_blank">Megger</a> so the crank voltage transformer became more interesting. </p><p style="text-align: left;">-----</p><p style="text-align: left;">Just for the heck of it we decided to mount the crank voltage transformer and discover what it could still do. </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Ap4veF94VYF-EZRR5f5S-T3Wp9YQWA0JF69T47pPisDpUiBK9_cW31KTP2-HRAPxhsB1zqtSzKaK0LfbyV5b63JFhdkPrMxvfcDWGA6fggKXlgsIOfMxA7dOuSA2owlx-mQvCcNiP36l6V3sGSNmpuBXzUgEGsCOD43cxerN0Hz9xp_RWga6KY9d5Kod/s1708/IMG_2130.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1708" data-original-width="1355" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Ap4veF94VYF-EZRR5f5S-T3Wp9YQWA0JF69T47pPisDpUiBK9_cW31KTP2-HRAPxhsB1zqtSzKaK0LfbyV5b63JFhdkPrMxvfcDWGA6fggKXlgsIOfMxA7dOuSA2owlx-mQvCcNiP36l6V3sGSNmpuBXzUgEGsCOD43cxerN0Hz9xp_RWga6KY9d5Kod/s320/IMG_2130.jpg" width="254" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: left;">We knew based on the dial setting on the Megger that an output of ~1000 Volts AC was possible. To not cook any of our instruments during the test we built 100K:1K Ohm resistive divider to tame the signal. This makes the amplitude of the crank voltage transformer output about 100 times smaller.</div><p>Here the results using the <a href="https://www.liquidinstruments.com/products/hardware-platforms/mokulab/" target="_blank">Moku:Lab</a> as our measurement tool. This was easy duty for the Moku which has an 13 amazing instruments in one box and <a href="https://www.liquidinstruments.com/products/" target="_blank">worth reading</a> about. </p><p>----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt1ejDGGoAFNxZrQVjvt8U8PieFfrDW8bXMPGe3FOuczVu4XK7lLbBAXD4C5BFIlTmTzAU0yXkYvB6GPV-WB3Q8Y2KtGX5sHSArH6OmfTrLzI_BjhhAm5hikJIAh3xUKkoE_rhbegjYaOJEM5Us8p5nwuFEJalYRvZPjjfUcOErZuRgacMPj3RPSzW8qJ5/s1640/48v-13h.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="917" data-original-width="1640" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt1ejDGGoAFNxZrQVjvt8U8PieFfrDW8bXMPGe3FOuczVu4XK7lLbBAXD4C5BFIlTmTzAU0yXkYvB6GPV-WB3Q8Y2KtGX5sHSArH6OmfTrLzI_BjhhAm5hikJIAh3xUKkoE_rhbegjYaOJEM5Us8p5nwuFEJalYRvZPjjfUcOErZuRgacMPj3RPSzW8qJ5/w400-h224/48v-13h.JPG" width="400" /></a></div><p>Turning the crank as slow as we could yielded about ~480V RMS at 13Hz. Touching the output terminals not was screamingly painful, but we did verify that it is uncomfortable to touch.</p><p>----</p><p>Max output was ~800V RMS at 55Hz and we <a href="https://www.creativesafetysupply.com/qa/electrical-safety/what-levels-of-voltage-are-lethal" target="_blank">wisely</a> decided not to sample the pain level of this output.<br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRJSCrgFKyTASFeQgZ1ELsouKpy2YtegsElezOSLRVbbKlUHqp0Eq-MXEyhJj6rBGbfbBSK1mbYpKJpW6hmCEfAOSl4MfbVvTz9soRTq6OgzInTzdw6_GrJpETyp9gCqfK-QTsN86CWY2az6kSNi8uLAEpN-dZlD275p7_Xt_fSd6Z_6OPpkQiXt98-5RO/s1637/800v-60h.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="926" data-original-width="1637" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRJSCrgFKyTASFeQgZ1ELsouKpy2YtegsElezOSLRVbbKlUHqp0Eq-MXEyhJj6rBGbfbBSK1mbYpKJpW6hmCEfAOSl4MfbVvTz9soRTq6OgzInTzdw6_GrJpETyp9gCqfK-QTsN86CWY2az6kSNi8uLAEpN-dZlD275p7_Xt_fSd6Z_6OPpkQiXt98-5RO/w400-h226/800v-60h.JPG" width="400" /></a></div><p>----- <br /></p><p></p><p><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s1600/Green45-32x32Line.jpg" width="231" /><br /> <br /></p><p><br /></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-884316576751891482023-10-27T10:39:00.014-05:002023-12-08T11:55:38.045-06:00Automagically Switch an Idle FlexRadio to WSPR<p> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTc2rwwUOHL4-dmPm7w2O0AtXcvizy4S-K6Zf7iaS3QSUQruP1aQS8CY4DCWlNQms_EehYv-ZuCARrGtlVmhCE9lOiO-hhqLm90NJJc_E6NmR5d7PvHhJOmiG5lzF7bb_F1YxuTRiwsk4O9N9IxG6q4VmZgfFqeOvGsObi_vm_OEGearZ6SJzLlHuX6nuZ/s843/Untitled.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="512" data-original-width="843" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTc2rwwUOHL4-dmPm7w2O0AtXcvizy4S-K6Zf7iaS3QSUQruP1aQS8CY4DCWlNQms_EehYv-ZuCARrGtlVmhCE9lOiO-hhqLm90NJJc_E6NmR5d7PvHhJOmiG5lzF7bb_F1YxuTRiwsk4O9N9IxG6q4VmZgfFqeOvGsObi_vm_OEGearZ6SJzLlHuX6nuZ/w640-h388/Untitled.png" width="640" /></a></p>-----<p></p><p>When our <a href="https://www.flexradio.com/products/categories/radios/" target="_blank">FlexRadio</a> is not being used it really should do 'something'. We typically put it in a <a href="https://en.wikipedia.org/wiki/WSPR_(amateur_radio_software)" target="_blank">WSPR</a> spotting mode via <a href="https://wsjt.sourceforge.io/wsjtx.html" target="_blank">WSJT-X</a>, but sometimes we forget. This short simple Python script takes care of that.</p><p>----</p><p><a href="http://www.whiskeytangohotel.com/2021/01/flex-radio-turned-boat-anchor.html" target="_blank">FlexRadio</a> has an <a href="http://www.whiskeytangohotel.com/2021/01/flex-radio-turned-boat-anchor.html" target="_blank">open API</a> and we could have just used it to accomplish the project. However, there are two wonderful (and free) programs that are always open on the PC running the FlexRadio <a href="https://www.flexradio.com/ssdr/" target="_blank">SmartSDR</a> software that make things easier; <a href="https://www.mkcmsoftware.com/download/FRStackWebApiReadme.html#apis" target="_blank">FRStack</a> and <a href="https://github.com/K1DBO/slice-master-6000" target="_blank">Slice Master</a>. In this project we use <a href="https://www.mkcmsoftware.com/download/FRStackWebApiReadme.html#apis">FRStack</a> for API calls and <a href="https://github.com/K1DBO/slice-master-6000" target="_blank">Slice Master</a> to automatically launch <a href="https://wsjt.sourceforge.io/wsjtx.html" target="_blank">WSJT-X</a>. <i>NOTE: We use <a href="https://www.mkcmsoftware.com/download/FRStackWebApiReadme.html#apis" target="_blank">FRStack</a> and <a href="https://github.com/K1DBO/slice-master-6000" target="_blank">Slice Master</a> for other features as well. IMO they are must have programs to make your Flex more flexible. </i><br /></p><p>-----</p><p>The Python script listed below looks at user defined intervals (in the example it is every 30 minutes) to see if any settings on the rig have changed. If a setting has changed (frequency, band, mode, volume, filters, etc. etc. etc...) the program assumes the rig is in use and just waits for the next check interval. </p><p></p><p></p><p></p><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3XX33PzbePTcLDYq8HkavVWG-BHDQJZBJcRg6WmoeOLU-4tn4B1-bIyCH8fro0aTqlaY_SjzI-roU0Il8LACsKWoRvR-lZTGwSwWuzv98P9kYEgUgzOVTWdhH6BP3FMYbe0QqXWnhSbsdA-JyyvqqHAOwcU2yUd1OjCK-v6_2F4sElYgO4p1X_xCerxY/s464/Untitled.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="210" data-original-width="464" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3XX33PzbePTcLDYq8HkavVWG-BHDQJZBJcRg6WmoeOLU-4tn4B1-bIyCH8fro0aTqlaY_SjzI-roU0Il8LACsKWoRvR-lZTGwSwWuzv98P9kYEgUgzOVTWdhH6BP3FMYbe0QqXWnhSbsdA-JyyvqqHAOwcU2yUd1OjCK-v6_2F4sElYgO4p1X_xCerxY/w400-h181/Untitled.png" width="400" /></a></div>-----<p></p><p>If the time interval expires and no settings have been changed the program assumes the rig is idle and switches it to DIGU mode.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3NSMUksveO4zaXorq-Qag6Xkv2iUIGZey8e3d_xcZ800DQsJxRyNCDutPjpClbmCxq7VPIAxNDnIpoQ5cGy7Dh0D9HIpdWXtcu7QDiY2oWsRBtm6m08tuDtP8oNxPaNiQBBaQgCKJBa9JncYgOKgZvIJpXKeIMDBytOL7FJOvpzP3FQfUCFxpYg7NWxjw/s392/Untitled.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="223" data-original-width="392" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3NSMUksveO4zaXorq-Qag6Xkv2iUIGZey8e3d_xcZ800DQsJxRyNCDutPjpClbmCxq7VPIAxNDnIpoQ5cGy7Dh0D9HIpdWXtcu7QDiY2oWsRBtm6m08tuDtP8oNxPaNiQBBaQgCKJBa9JncYgOKgZvIJpXKeIMDBytOL7FJOvpzP3FQfUCFxpYg7NWxjw/s320/Untitled.png" width="320" /></a></div> <a href="https://github.com/K1DBO/slice-master-6000" target="_blank">Slice Master</a> takes that switch to DIGU mode as a trigger to launch <a href="https://wsjt.sourceforge.io/wsjtx.html" target="_blank">WSJT-X</a> and start doing <a href="https://en.wikipedia.org/wiki/WSPR_(amateur_radio_software)" target="_blank">WSPR</a> stuff.<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSLg_m9jsI0CDKkwMAz4wHk4RkBSenrw1JYaIRClfZU7OQP5r86_25aoJ1iyYrTeahLafuEb9JLN0i_57s16HONTa-9q6xudYCMCv4jomfrf7FHa8_XuB_GV9WIIg0xzLEhjWzscSLJzNQ6c_aUufXfWYyWqFTJPINkop80p2s7UKYEYNwchl8dzGp3ymA/s417/Untitled.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="214" data-original-width="417" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSLg_m9jsI0CDKkwMAz4wHk4RkBSenrw1JYaIRClfZU7OQP5r86_25aoJ1iyYrTeahLafuEb9JLN0i_57s16HONTa-9q6xudYCMCv4jomfrf7FHa8_XuB_GV9WIIg0xzLEhjWzscSLJzNQ6c_aUufXfWYyWqFTJPINkop80p2s7UKYEYNwchl8dzGp3ymA/s320/Untitled.png" width="320" /></a></div>-----<p></p><p># auto_wspr.py OCT2023<br />#<br /># Python script to make the Flex Radio switch to WSPR mode when idle.<br />#<br /># Written by: WhiskeyTangoHotel.Com<br />#<br /># Leverages the auto LAUNCH feature of "Slice Master".<br /># https://github.com/K1DBO/slice-master-6000<br />#<br /># Leverages WSJT-X for TX/Rx spotting<br /># https://wsjt.sourceforge.io/wsjtx.html<br />#<br /># Leverages FRStack<br /># https://www.mkcmsoftware.com/download/FRStackWebApiReadme.html#apis<br /><br />import requests<br />import urllib.request<br />import time<br /><br /># Set idle_max to the number of minutes between checks to see if any rig settings have changed.<br /># If idle rig then switch to DIGU mode. DIGU mode will trigger Slice Master to start WSJT-X.<br /><br />idle_max = 60 # in minutes, How ofen to check to see if the rig is idle.<br /><br />last_status = 'First_run'<br />mode = ' '<br /><br />#print ( 'Entering endless loop.....' )<br />while True: <br /> print ('Checking for rig activity every' , idle_max , 'minutes.')<br /> print ('---------------------------------------------------')<br /><br /> # If rig is in DIGU mode then do nothing. We are already running WXJT<br /> response = requests.get('http://localhost:13522/api/ActiveSlice/MODE?')<br /> response = response.text<br /> mode = response<br /> #print ('MODE is:' , response)<br /> <br /> if response == '"DIGU"':<br /> print ('Rig in DIGU mode. Do nothing.')<br /> else: # not in DIGU mode. Have rig settings changed or is it idle?<br /> response = requests.get('http://localhost:13522/api/ActiveSlice/INFO?')<br /> current_status = response.text<br /> if last_status != current_status: <br /> print ('Rig in use. Do not change to DIGU. Do not launch WSJT')<br /><br /> #print(last_status)<br /> print (' ')<br /> #print (current_status)<br /><br /> last_status = current_status <br /> else: <br /> print ('Rig has been idle for' , idle_max , 'minutes.')<br /> print ('Switch to DIGU mode. Slice Master will launch WSJT.')<br /><br /> #print(last_status)<br /> print (' ')<br /> #print (current_status)<br /> <br /> # DIGU modes can be LOUD. Adjust the volume to low<br /> urllib.request.urlopen('http://localhost:13522/api/ActiveSlice/AUDIOGAIN?=+1')</p><p><span> </span><span> </span><span> </span># Switch rig to DIGU mode<br /> urllib.request.urlopen('http://localhost:13522/api/ActiveSlice/MODE?=DIGU')<br /><br /> for nextcheck in range(idle_max, 0, -1):<br /> response = requests.get('http://localhost:13522/api/ActiveSlice/MODE?')<br /> response = response.text<br /> mode = response<br /> print ('MODE is', mode, '-', int(nextcheck) , "minutes until next idle rig check...")<br /> time.sleep(60)<br /> <br /> print (' ') <br /> <br /> # end endless while loop<br />-----</p><p><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s1600/Green45-32x32Line.jpg" width="231" /></p><p><br /></p><p><br /></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-16177765499675511542023-05-27T16:01:00.005-05:002023-11-23T21:12:31.943-06:00HamAlert.Org Integration with Pimoroni Galactic Unicorn<p style="text-align: center;"> <a href="https://www.qrz.com/db/K5TR" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" data-original-height="414" data-original-width="709" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0cbt6XVnqJA2Km4WeJ_EY-87JzvePtsN2WxScrAgefrAxqT3lhbu7fJ1yHg6LYnRBoiFGM3gkmntW0lM8EitKoXvIuSJVbgo32_YTbhNcvIsgsV68EoIl2eiiKB2uS6fe5twS3eBB8ISbZusF7XFLR4EsU1csp5Z6az1QXDQqCLVW9ysn7rkDzjtAmg/w320-h187/View%20recent%20photos.png" width="320" /></a></p><p style="text-align: left;">-----</p><p style="text-align: left;">The <a href="https://shop.pimoroni.com/products/galactic-unicorn?variant=40057440960595" target="_blank">Pimoroni Galactic Unicorn</a> is a cool piece of kit that we have had our eye on for a while. The item is popular and sells out quickly, but we finally got our hands on one. <b>Summary: It's awesome!</b> After the initial <i>"WOW!"</i> factor diminished we went in search of a project for it.</p><p style="text-align: left;">----- <br /></p><p style="text-align: left;">The answer was obvious. How many times are you sitting comfortably in your home theater room with the family and you miss a <a href="https://morsecode.ninja/" target="_blank">Morse Code</a> CQ from one of your <a href="https://n5oak.org/nets" target="_blank">ham radio friends</a>? That's what we thought, so we set out to solve that inconvenient and irritating problem! </p><p style="text-align: left;">-----</p><p style="text-align: left;">The project needs a WiFi connection for the <a href="https://shop.pimoroni.com/products/galactic-unicorn?variant=40057440960595" target="_blank">Pimoroni Galactic Unicorn</a>. No ham radio or RF access to the <a href="https://www.arrl.org/band-plan" target="_blank">ham bands</a> are needed. </p><p style="text-align: left;"><b>Steps:</b></p><p style="text-align: left;"><span> </span>- Buy a <a href="https://shop.pimoroni.com/products/galactic-unicorn?variant=40057440960595" target="_blank">Pimoroni Galactic Unicorn</a> and set it up to run <a href="https://github.com/pimoroni/pimoroni-pico/releases" target="_blank">MicroPython</a>.</p><p style="text-align: left;"><span> </span>- Create a <a href="https://hamalert.org/" target="_blank">HamAlert</a> account and set up some triggers for the ham operators of interest. You will need to select the "telnet" reporting option in the trigger menu.</p><p style="text-align: left;"><span> </span>- Copy/Paste our MicroPython source code below into the <a href="https://shop.pimoroni.com/products/galactic-unicorn?variant=40057440960595" target="_blank">Pimoroni Galactic Unicorn</a>. We used <a href="https://thonny.org" target="_blank">Thonny</a> as our development environment. Name the program "main.py" so it will autostart at bootup.<br /></p><p style="text-align: left;"><span> </span>- Place the rig under that big screen TV in the home theater room. Simply wait for your movie or favorite show to be interrupted letting you know it's time to drop everything and fire up your ham radio for a QSO!</p><p style="text-align: left;">-----</p><p style="text-align: left;">Here is a live demo of the setup. What happens is:</p><p style="text-align: left;"><span> </span>- <a href="https://www.qrz.com/db/K5JM" target="_blank">K5JM</a>, who is in my <a href="https://hamalert.org/" target="_blank">HamAlert</a> triggers is spotted calling CQ.</p><p style="text-align: left;"><span> </span>- The <a href="https://shop.pimoroni.com/products/galactic-unicorn?variant=40057440960595" target="_blank">Pimoroni Galactic Unicorn</a> is logged into and monitoring the <a href="https://hamalert.org/" target="_blank">HamAlert</a> telenet server.</p><p style="text-align: left;"><span> </span>- We parse the response of the <a href="https://hamalert.org/" target="_blank">HamAlert</a> telnet server and display the information we want on the LED matrix.</p><p style="text-align: left;"><span> </span>- Of course, we answer K5JM. Success!!! Next we return to the home theater room and await the next interruption. <br /></p><p style="text-align: left;"></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/1ZCNzaiF4ZA" width="320" youtube-src-id="1ZCNzaiF4ZA"></iframe></div><br /> -----<p></p><p style="text-align: left;">Source code below:</p><p style="text-align: left;"> '''<br />Morse Alert<br />MAY2023<br />WhiskeyTangoHotel.Com<br /><br />This program displays your individual hamalert.org telnet CW triggers<br />onto the display of the Raspberry PI PicoW based Pimoroni Galactic Unicorn.<br />Thanks HamAlert.Org by Manuel Kasper (HB9DQM) for their telnet service!<br /><br />CW CQ info shown is "Callsign", "Frequency", and "WPM", but other options are available.<br />The text is color coded by band.<br />Scroll speed and total display variables are adjustable.<br />Alert 'chirp' is adjustable.<br /><br />A CW beacon, such as WR5U which transmits about every 30 minutes,<br />may be a suggested hamalert telnet trigger to avoid timeouts from the<br />hamalert.org server.<br /><br />NOTE: Does not work with hamalert.org simulated triggers</p><p style="text-align: left;">'''</p><p style="text-align: left;"><br />#Variable set up:<br />wifi_ssid = "wifi_ssid"<br />wifi_password = "wifi_password"<br /><br /># hamalert.org login info<br />username = "telnet_username"<br />password = "telnet_passord"<br />telnetaddr = "hamalert.org" # "telnetaddress.com"<br />port = 7300 # port as a number, not a string<br /><br />from galactic import GalacticUnicorn<br />gu = GalacticUnicorn()<br /><br /># Set up speaker for a sweeping 'chirp' alert<br />volume = .5 # range is 0 to 1. 0 = For no sound<br />start_tone = 500 #500 is a good start Adjust to suit.<br />end_tone = 1000 #1000 is a good start. Adjust to suit.<br />channels = [gu.synth_channel(i) for i in range(1)]<br /><br />waitmsg = "HamAlert..."<br />howbright = 0.1 # value range 0.0 to 1.0<br />dwelltime = 5 # how many seconds to display Callsign, Freq, WPM<br />tot_time = 60 # how long (seconds) to cycle this info<br /><br />utc_offset = -5 # we print to screen (not to LEDs the zulu and local time)<br /><br />import network<br />import usocket as socket<br />import time<br />import utime<br /><br />from picographics import PicoGraphics, DISPLAY_GALACTIC_UNICORN<br />graphics = PicoGraphics(display=DISPLAY_GALACTIC_UNICORN)<br /><br />#Define some colours<br />BLACK = graphics.create_pen(0, 0, 0)<br />RED = graphics.create_pen(255, 0, 0)<br />YELLOW = graphics.create_pen(255, 255, 0)<br />GREEN = graphics.create_pen(0, 255, 0)<br />CYAN = graphics.create_pen(0, 255, 255)<br />BLUE = graphics.create_pen(0, 0, 255)<br />MAGENTA = graphics.create_pen(255, 0, 255)<br />WHITE = graphics.create_pen(200, 200, 200)<br />GREY = graphics.create_pen(100, 100, 100)<br />DRKGRY = graphics.create_pen(50, 50, 50)<br />FREQCOLOR = WHITE # this is the text color that will change per band<br />waitmsgcolor = GREY # number, not a string<br /><br /># create a PicoGraphics framebuffer to draw into<br />graphics = PicoGraphics(display=DISPLAY_GALACTIC_UNICORN)<br />gu.set_brightness(howbright)<br /><br />#Create a single wlan object and use as a global for all net calls<br />wlan = network.WLAN(network.STA_IF)<br /><br />wlan.active(True)<br />wlan.connect(wifi_ssid, wifi_password)<br /><br /># Wait for connect success or failure<br />max_wait = 100<br />while max_wait > 0:<br /> if wlan.status() < 0 or wlan.status() >= 3:<br /> break<br /> max_wait -= 1<br /> wifistat = 'WiFi...' + str(100-max_wait)<br /> if max_wait == 0:<br /> wifistat = "WiFi fail"<br /> print(wifistat)<br /> width = graphics.measure_text(wifistat, 1)<br /> startplace = int(float(GalacticUnicorn.WIDTH) - width) / 2<br /> # clear the graphics object<br /> graphics.set_pen(BLACK)<br /> graphics.clear()<br /> # draw the text<br /> graphics.set_pen(waitmsgcolor)<br /> graphics.text(wifistat, round(startplace), 2, -1, 0.55); <br /> # update the display<br /> gu.update(graphics)<br /> time.sleep(.5)<br /> <br />if max_wait > 0:<br /> print("WIFI OK!")<br /> width = graphics.measure_text('WIFI OK!', 1)<br /> startplace = int(float(GalacticUnicorn.WIDTH) - width) / 2<br /> # clear the graphics object<br /> graphics.set_pen(BLACK)<br /> graphics.clear()<br /> # draw the text<br /> graphics.set_pen(waitmsgcolor)<br /> graphics.text('WIFI OK!', round(startplace), 2, -1, 0.55); <br /> # update the display<br /> gu.update(graphics) <br /> time.sleep(5)<br /><br /># Connect to the telnet server<br />tn = socket.socket()<br />addr = socket.getaddrinfo(telnetaddr, port)[0][-1]<br />tn.connect(addr)<br /><br /># Log in with the username and password to telnet server<br />tn.send(username + "\r\n")<br />tn.send(password + "\r\n")<br /><br />last_spot = utime.time() # we track/print time between spots<br /><br /># Read and process the telnet server response<br />while True:<br /> data = tn.recv(1024)<br /> data = data.decode("utf-8")<br /> print(data)<br /> <br /> # Center "waitmsg"<br /> width = graphics.measure_text(waitmsg, 1)<br /> startplace = int(float(GalacticUnicorn.WIDTH) - width) / 2<br /> # clear the graphics object<br /> graphics.set_pen(BLACK)<br /> graphics.clear()<br /> # draw the text<br /> graphics.set_pen(waitmsgcolor)<br /> graphics.text(waitmsg, round(startplace), 2, -1, 0.55); <br /> # update the display<br /> gu.update(graphics)<br /><br /> # Play 'connected' Chirp alert<br /> for tone in range(start_tone, end_tone):<br /> channels[0].play_tone(tone, volume)<br /> gu.play_synth()<br /> time.sleep(.0009)<br /> gu.stop_playing()<br /> <br /> if "DX de" in data:<br /> #print(data)<br /> <br /> # Split the string into a list of values<br /> data_list = data.split()<br /> <br /> # Assign each value to separate variables<br /> dx = data_list[0]<br /> de = data_list[1]<br /> spotter = data_list[2]<br /> freq = data_list[3]<br /> spotted = data_list[4]<br /> db = data_list[5]<br /> wpm = data_list[6]<br /> zulu = data_list[7]<br /><br /> # Print the values of the variables<br /> print("HamAlert returns:")<br /> #print('dx:', dx )<br /> #print('de:', de)<br /> #print('spotter:', spotter)<br /> print('Freq:', freq)<br /> print('Spotted:', spotted)<br /> #print('db:', db)<br /> print('WPM:', wpm)<br /> #print('zulu:', zulu)<br /> <br /> #Convert zulu to local<br /> hours = int(zulu[:2])<br /> minutes = int(zulu[2:4]) <br /> local_hours = hours + utc_offset<br /> local_minutes = minutes<br /> # If negative hour fix wraparound<br /> if local_hours < 0:<br /> local_hours += 24<br /> # Format to local timeg<br /> local_time = "{:02d}:{:02d}".format(local_hours, local_minutes)<br /> print('Local time:', local_time)<br /> #print('Minutes last spot:', int( (utime.time() - last_spot)/ 60) )<br /> last_spot = utime.time() # we track/print time between spots<br /> print('-------------------')<br /> print<br /> <br /> FREQCOLOR = WHITE<br /> band = float(freq)<br /> if 24890 <= band <= 24990:<br /> FREQCOLOR = CYAN # text color for 12 meter spots<br /> if 18068 <= band <= 18168:<br /> FREQCOLOR = BLUE # text color for 17 meter spots<br /> if 14000 <= band <= 14350:<br /> FREQCOLOR = MAGENTA # text color for 20 meter spots <br /> if 10100 <= band <= 10150:<br /> FREQCOLOR = RED # text color for 30 meter spots<br /> if 7000 <= band <= 7300:<br /> FREQCOLOR = YELLOW # text color for 40 meter spots <br /> if 3500 <= band <= 4000:<br /> FREQCOLOR = GREEN # text color for 80 meter spots <br /> <br /> for x in range(0, int((tot_time/(dwelltime*3)))):<br /> # Center position of the text<br /> width = graphics.measure_text(spotted, 1)<br /> startplace = int(float(GalacticUnicorn.WIDTH) - width) / 2<br /> # clear the graphics object<br /> graphics.set_pen(BLACK)<br /> graphics.clear()<br /> # draw the text<br /> graphics.set_pen(FREQCOLOR)<br /> graphics.text(spotted, round(startplace), 2, -1, 0.55);<br /> # update the display<br /> gu.update(graphics)<br /> time.sleep(dwelltime)<br /> <br /> # Center position of the text<br /> width = graphics.measure_text(freq, 1)<br /> startplace = int(float(GalacticUnicorn.WIDTH) - width) / 2<br /> # clear the graphics object<br /> graphics.set_pen(BLACK)<br /> graphics.clear()<br /> # draw the text<br /> graphics.set_pen(FREQCOLOR)<br /> graphics.text(freq, round(startplace), 2, -1, 0.55);<br /> # update the display<br /> gu.update(graphics) <br /> time.sleep(dwelltime)<br /> <br /> # Center position of the text<br /> width = graphics.measure_text(wpm, 1)<br /> startplace = int(float(GalacticUnicorn.WIDTH) - width) / 2<br /> # clear the graphics object<br /> graphics.set_pen(BLACK)<br /> graphics.clear()<br /> # draw the text<br /> graphics.set_pen(FREQCOLOR)<br /> graphics.text(wpm, round(startplace), 2, -1, 0.55);<br /> # update the display<br /> gu.update(graphics)<br /> time.sleep(dwelltime)<br /> <br /> #print(waitmsg)<br /> <br /> # Below if you want time of last spot shown. This can help ID a telnet timeout.<br /> # See our reason for having a CW beacon comment at the very top.<br /> waitmsg = 'Last ' + local_time<br /> <br /> # This if you want the your pre-defined waitmsg after a spot<br /> #width = graphics.measure_text(waitmsg, 1)<br /> <br /> width = graphics.measure_text(waitmsg, 1)<br /> startplace = int(float(GalacticUnicorn.WIDTH) - width) / 2<br /> # clear the graphics object<br /> graphics.set_pen(BLACK)<br /> graphics.clear()<br /> # draw the text<br /> graphics.set_pen(waitmsgcolor)<br /> graphics.text(waitmsg, round(startplace), 2, -1, 0.55);<br /> # update the display<br /> gu.update(graphics) <br />-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX3-D2Fg9lQEK_SymWM9bgUC8AruZ0tnLUyKjtHIhny_0nmCn7lNIBEP_PcuDPa7dkivQs99PUFTj0NYoVh29H8WDkYDLPxWwU7WeOduK6hoGEkSZWWMdLN7g0t-BdgH6My6Wvq_fHPMy3rk8uPjKGYBghzYdE25otgcUr8fb5pon8j5qxxbI6UEq49A/s231/Green45-32x32Line.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX3-D2Fg9lQEK_SymWM9bgUC8AruZ0tnLUyKjtHIhny_0nmCn7lNIBEP_PcuDPa7dkivQs99PUFTj0NYoVh29H8WDkYDLPxWwU7WeOduK6hoGEkSZWWMdLN7g0t-BdgH6My6Wvq_fHPMy3rk8uPjKGYBghzYdE25otgcUr8fb5pon8j5qxxbI6UEq49A/s1600/Green45-32x32Line.jpg" width="231" /></a> <br /></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-18573810136781947182023-05-15T21:18:00.008-05:002023-11-30T10:22:51.414-06:00Low Cost Temperature Data Logger<p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTSdMHNjBgNR3zayxaiGjqF6TYGsvAEMK6Ccv1_XMc6BHtkzVumKW4YPBo5krGRiiLnbO_WZ7LLnQ9qygDS0WPnzRhb-eO2dDVkmO_Z0fhgU3fDJEi-K8-BZfX4d9Spw93_rnPYE3wYSKz1dUeK6chqEzSpoIdr6I8bUBxzQirMdoCoqjeK3leaODNYQ/s592/Capture.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="393" data-original-width="592" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTSdMHNjBgNR3zayxaiGjqF6TYGsvAEMK6Ccv1_XMc6BHtkzVumKW4YPBo5krGRiiLnbO_WZ7LLnQ9qygDS0WPnzRhb-eO2dDVkmO_Z0fhgU3fDJEi-K8-BZfX4d9Spw93_rnPYE3wYSKz1dUeK6chqEzSpoIdr6I8bUBxzQirMdoCoqjeK3leaODNYQ/s320/Capture.JPG" width="320" /></a></div><p> -----</p><p>We saw this <a href="https://www.amazon.com/dp/B074PNM4RV?th=1" target="_blank">Elitech RC-5+ Temperature Data Logger</a> at Amazon for $19.95 USD. The specs looked great and for the price we just had to give a try. We were not disappointed. </p><p>The ElitechLog software is a free <a href="http://www.elitechlog.com/softwares/elitechlogwin-v6-0-0/" target="_blank">download</a> and provides easy to view graphs and stats on the gathered data. Just to do 'something' with the unit we placed it in our refrigerator overnight in various locations. Below are the overnight averages:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKX3nQj7UpsE2rFEmNnKzzWAlF7mkJuDqNe4XNJVyJqNm16OV1cAvkYp6g8c5mUfVaI3XmY_9mMCYs4GVN3j8U-aa4yeJiMz0HfNT1iM9i4Yfhuqr2bwkxuq3X-ri5jmAeQf9ZN5u22H9vlVZupTh19bxp08-4eZIfAlIJNRlWxYc69vO968HTBLN4wA/s730/ge_FRIGTEMPS.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="527" data-original-width="730" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKX3nQj7UpsE2rFEmNnKzzWAlF7mkJuDqNe4XNJVyJqNm16OV1cAvkYp6g8c5mUfVaI3XmY_9mMCYs4GVN3j8U-aa4yeJiMz0HfNT1iM9i4Yfhuqr2bwkxuq3X-ri5jmAeQf9ZN5u22H9vlVZupTh19bxp08-4eZIfAlIJNRlWxYc69vO968HTBLN4wA/s320/ge_FRIGTEMPS.jpg" width="320" /></a></div><p> ----- </p><p>Here is a temperature graph taken over a 20 hour time period and a data point every 60 seconds.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQjw95D4qHlQQEOa-xYUUaN2c8iumvlJ6Ue9QinO-bZCRuN-UhjDXGA0XhQpDQNz14X1EuIqoXSJYV_zTzvkLIOyklAa07gE5AwtMn-nHVKv1UdtGbSi6pNXtCO1waNWlqxiJ3BvH5DhorAif5zxaaySyAysRsjgNuLBw0s0zzkBB4yzdqiNGgr7bpTQ/s1895/20h.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="775" data-original-width="1895" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQjw95D4qHlQQEOa-xYUUaN2c8iumvlJ6Ue9QinO-bZCRuN-UhjDXGA0XhQpDQNz14X1EuIqoXSJYV_zTzvkLIOyklAa07gE5AwtMn-nHVKv1UdtGbSi6pNXtCO1waNWlqxiJ3BvH5DhorAif5zxaaySyAysRsjgNuLBw0s0zzkBB4yzdqiNGgr7bpTQ/w400-h164/20h.jpg" width="400" /></a></div> -----<br /><p></p><p></p><p>More equally useless projects come to mind and we will post the them below as they happen. In the end this is a great value and a useful tool.</p><p>-----</p><p>After getting a new LG refrigerator we reran the experiment (NOV2023):</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6RnpAtgKwP43rAPl8ixtYY53cSDAQ1Yn9jjUbjesphsRm9E_GP9i33Un6jm1Uk0UStF7p1mxM-cU3K8JPYOBXbGlpARCTQYVhyphenhyphen2mU3mTPBb2prCeEhgK2ofA0xry3hRdhJW7kogDxctO9aOF8Ea0tujRrhSYxpKLPAWkNHhI3By2kc4p8lHmiAJfUMgye/s730/NEW_LG.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="527" data-original-width="730" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6RnpAtgKwP43rAPl8ixtYY53cSDAQ1Yn9jjUbjesphsRm9E_GP9i33Un6jm1Uk0UStF7p1mxM-cU3K8JPYOBXbGlpARCTQYVhyphenhyphen2mU3mTPBb2prCeEhgK2ofA0xry3hRdhJW7kogDxctO9aOF8Ea0tujRrhSYxpKLPAWkNHhI3By2kc4p8lHmiAJfUMgye/s320/NEW_LG.jpg" width="320" /></a></div> -----<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s231/Green45-32x32Line.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0tlYqVMwRGUCsrMe00ppqleX9LDrDOfnIzDTTsorFjIS5HNc3RLRAJpf-cldrzbulCl0dEzBPV_KZ_sK6QKcmN-sx2WnJzDpmv8DkHPxddVIwZakvA-8StlfADXqRRznfs7HVOI-kpovTsp1X2l3tDWy69iSjhAZFhjknGG6owesaY1DwfDM2thUVYQ/s1600/Green45-32x32Line.jpg" width="231" /></a></div><br /> <p></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-3194718097747584892023-03-02T11:54:00.005-06:002023-11-23T21:11:09.892-06:00DIY Morse (CW) Key on the Cheap [Paddle Version]<p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/1UTVNf2Do3w" width="320" youtube-src-id="1UTVNf2Do3w"></iframe></div><br /> Schematics sent on request. HIHI.<br /><p></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-25630265786140988042023-01-16T10:58:00.002-06:002023-11-23T21:10:27.433-06:00DIY Morse (CW) Key on the Cheap<p style="text-align: center;"> <iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/f-Ava0gNkiM" width="320" youtube-src-id="f-Ava0gNkiM"></iframe></p>Schematics sent on request. HIHI.<br /><p></p><p>-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOpRun3GzoFdsd3i3AZ7cEghBO4oTBwrQeYGLuB34nr0XA3147_McI59BfLkbS5W8X29btChOR3_Aj9Z54SWt0wma6AWMzUDMJVdVSb5t0QA5D7mscMm7-DFtl8FPqIVtP1ZL_SySmddh4/s231/Green45-32x32Line.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOpRun3GzoFdsd3i3AZ7cEghBO4oTBwrQeYGLuB34nr0XA3147_McI59BfLkbS5W8X29btChOR3_Aj9Z54SWt0wma6AWMzUDMJVdVSb5t0QA5D7mscMm7-DFtl8FPqIVtP1ZL_SySmddh4/s1600/Green45-32x32Line.jpg" width="231" /></a></div><br /><p><br /><br /></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-14980868942543055872022-09-16T13:18:00.005-05:002023-11-23T21:10:10.667-06:00Morse Code (CW) Paddle becomes Bug<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrsghv2RZ6sk84fe5khYkgXN3OvxQRjcXuIr54CztPrHneVuGguNpfR4-uYimVwn_5e0qr3i6iritBQcyl9mWTtzzDEvLbcui3S2fEVXYtFVFBKFwv62PzoP72htHieIQPN05McyUh3mBXCocm1hrre8GuBovaSh8cDdghY0zLlNrE1qn5SLkwXlqzkQ/s1274/bug-convert.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="856" data-original-width="1274" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrsghv2RZ6sk84fe5khYkgXN3OvxQRjcXuIr54CztPrHneVuGguNpfR4-uYimVwn_5e0qr3i6iritBQcyl9mWTtzzDEvLbcui3S2fEVXYtFVFBKFwv62PzoP72htHieIQPN05McyUh3mBXCocm1hrre8GuBovaSh8cDdghY0zLlNrE1qn5SLkwXlqzkQ/w400-h269/bug-convert.jpg" width="400" /></a></div>-----<p></p><p><a href="http://www.arrl.org/cw-mode" target="_blank">CW</a> or <a href="https://en.wikipedia.org/wiki/Morse_code" target="_blank">Morse Code</a> is a way <a href="http://www.arrl.org/licensing-education-training" target="_blank">ham radio</a> operators send messages with a simple tone of two durations. It was a
must before the days of wireless voice communications and still remains
popular because it is a fun challenge. Like most things, Morse keys range from <a href="http://www.whiskeytangohotel.com/2023/01/diy-morse-cw-key-on-cheap.html" target="_blank">low cost</a> to <a href="http://www.i2rtf.com/keys---paddles.html" target="_blank">expensive</a>. Generally speaking Morse keys come in three <a href="https://www.electronics-notes.com/articles/ham_radio/morse_code/cw-keys-keyers.php" target="_blank">styles</a>: straight key, paddle, and bug. Each has pros and cons requiring unique skills to operate with the "bug" typically being more expensive and requiring more skill. <br />
<br />
To use this rig, you don't need a ham radio license unless you connect to
an actually ham radio transmitter; which is kinda the whole point. My
quick ham radio advertisement: Get a <a href="http://www.arrl.org/licensing-education-training" target="_blank">FCC Amateur Radio license</a>; it's not hard and is an extremely interesting hobby. BTW, learning Morse Code is no longer a requirement.</p><p>-----</p><p>We wanted to try a Morse <a href="https://www.electronics-notes.com/articles/ham_radio/morse_code/use-setup-vibroplex-bug-mechanical-key.php" target="_blank">bug key</a>, but didn't want one 'forever' and didn't want to spend the money. Plus like most ham radio operators we think any project is a good project regardless of it's usefulness. Basically, with a bug key the dahs (dashes) are made manually and the dits (dots) are generated semi automatically via a spring mechanism. The design is mechanically challenging so we opted for a different method.</p><p>-----</p><p>The dah (dash) part is easy. For the semi automatic dash (dit) part the traditional mechanical spring system was replaced with a <a href="https://www.amazon.com/gp/product/B078X9PVX3/" target="_blank">$10 signal generator kit</a>. Pressing the dit key powers up a 7404 and a square wave output is passed through the <a href="https://www.digikey.com/en/products/detail/texas-instruments/SN7404N/555980" target="_blank">7404</a> simply to provide the "umph" for the <a href="https://www.amazon.com/gp/product/B00VRUAHLE/" target="_blank">relay</a> to open and close providing the dits. The signal generator frequency control allows for an easy way to adjust the sending WPM (words per minute).</p><p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/XtrISflLS-E" width="320" youtube-src-id="XtrISflLS-E"></iframe></div><br /> The video shows our very first unpracticed test of the rig. After a bit of practice we put the key on the air for a few <a href="https://www.skccgroup.com/" target="_blank">SKCC</a> <a href="https://www.electronics-notes.com/articles/ham_radio/morse_code/cw-qso-morse-contact.php" target="_blank">QSOs</a>. Fun was had on our end and tolerance was shown by the OPs decoding our sig, <br /><p></p><p>-----</p><p>Here are a few pics of the rig on the bench:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib9v9m5_l6jkdPpPyVEnTXHY1-0azAFF8XtkvBKK_Wea_jmfFaSJpDUT4sVwqLw3SGbWCqTndLLEYI0DUPKzXO5fGusoxg4n4n2eZ9jRj5R4jSbgpySPHqTuJ92UGwW9ui3c9ET3gK_DJqoAUgH-nOHz4R0uxDVXXIwLZW8Mc3dKRvAlWWZjbONjfw6A/s4032/BugFaker%20(3).jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="4032" data-original-width="3024" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib9v9m5_l6jkdPpPyVEnTXHY1-0azAFF8XtkvBKK_Wea_jmfFaSJpDUT4sVwqLw3SGbWCqTndLLEYI0DUPKzXO5fGusoxg4n4n2eZ9jRj5R4jSbgpySPHqTuJ92UGwW9ui3c9ET3gK_DJqoAUgH-nOHz4R0uxDVXXIwLZW8Mc3dKRvAlWWZjbONjfw6A/w300-h400/BugFaker%20(3).jpg" width="300" /></a></div><br /> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0zsV0OjvvEFdKihBOaC1wXwiBADrigKE2412YCwHe5CoOYbipZ0CQWRsSKAE6Xw7g7Z2ACMoKDY3rR8g7KFjWcwNHb1P6O6_lhn8eDwhxJlwXzdGLnb6gg-HprHiGSetc-jINkLLtsyE2d8Ad-cY9npqUWX11YzXWezbYi_nAh0hQF0yI4NXyCCV39g/s4032/BugFaker%20(1).jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="4032" data-original-width="3024" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0zsV0OjvvEFdKihBOaC1wXwiBADrigKE2412YCwHe5CoOYbipZ0CQWRsSKAE6Xw7g7Z2ACMoKDY3rR8g7KFjWcwNHb1P6O6_lhn8eDwhxJlwXzdGLnb6gg-HprHiGSetc-jINkLLtsyE2d8Ad-cY9npqUWX11YzXWezbYi_nAh0hQF0yI4NXyCCV39g/w300-h400/BugFaker%20(1).jpg" width="300" /></a></div><br />-----<p></p><p>And here's the schematic:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgfLiY10WFWyWAzLnL42tbfduhMzH_x2AFegX7VqK8BT4yEql67BH4xvqUZBYVYx29UmCOO_jfZ1XEB7e-ktrCFWys-Xc-jmWTFRuviVIW1B2UNsiTs9Pi5uJ78Uv0vZZvsZdwsGfbnEA11Hi7FysdSXG3b5A__zaRUPf3Xs2wdVN4jbwwiTi34j0o5g/s1280/bug_schematic.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgfLiY10WFWyWAzLnL42tbfduhMzH_x2AFegX7VqK8BT4yEql67BH4xvqUZBYVYx29UmCOO_jfZ1XEB7e-ktrCFWys-Xc-jmWTFRuviVIW1B2UNsiTs9Pi5uJ78Uv0vZZvsZdwsGfbnEA11Hi7FysdSXG3b5A__zaRUPf3Xs2wdVN4jbwwiTi34j0o5g/w400-h225/bug_schematic.jpg" width="400" /></a></div><p></p><p>Of course, not the traditional Morse key bug, but a nice afternoon project diversion. 73!!!</p><p>----- <br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOpRun3GzoFdsd3i3AZ7cEghBO4oTBwrQeYGLuB34nr0XA3147_McI59BfLkbS5W8X29btChOR3_Aj9Z54SWt0wma6AWMzUDMJVdVSb5t0QA5D7mscMm7-DFtl8FPqIVtP1ZL_SySmddh4/s231/Green45-32x32Line.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOpRun3GzoFdsd3i3AZ7cEghBO4oTBwrQeYGLuB34nr0XA3147_McI59BfLkbS5W8X29btChOR3_Aj9Z54SWt0wma6AWMzUDMJVdVSb5t0QA5D7mscMm7-DFtl8FPqIVtP1ZL_SySmddh4/s1600/Green45-32x32Line.jpg" width="231" /></a></div><br /><p><br /></p><p><br /></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-88594655111760852662022-07-30T13:40:00.010-05:002023-11-23T21:09:49.278-06:00@Cheerlights Project: Now with Sound<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEilrsLNqBR3oTpUoBXf-acwFsZmIlpKdkT5pKmPDwCXC7T8QLG1oM_OEEWEO1qpZo6pX03E4PfM3fqq4bMGEstB-K231npmePRapEWspSGI01WU9c5dt9bMdMDmumOLqSQ3zTsk7Ns3TbHJNxkmYi-J2URpS8aphMz4dzXzeb6d2qVPwj4xGjZJD0gSnw=s800" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="689" data-original-width="800" height="276" src="https://blogger.googleusercontent.com/img/a/AVvXsEilrsLNqBR3oTpUoBXf-acwFsZmIlpKdkT5pKmPDwCXC7T8QLG1oM_OEEWEO1qpZo6pX03E4PfM3fqq4bMGEstB-K231npmePRapEWspSGI01WU9c5dt9bMdMDmumOLqSQ3zTsk7Ns3TbHJNxkmYi-J2URpS8aphMz4dzXzeb6d2qVPwj4xGjZJD0gSnw=s320" width="320" /></a></div><p>-----<br /></p><p>We did a <a href="https://twitter.com/cheerlights" target="_blank">@cheerlights</a> <a href="http://www.whiskeytangohotel.com/2022/03/cheerlights-control-of-blinkt-via.html">project</a> that used a Raspberry PI Zero and a <a href="http://www.whiskeytangohotel.com/2022/03/cheerlights-control-of-blinkt-via.html" target="_blank">Blinkt! LED bar</a> to keep track of the last eight color changes the cheerlights server received. We put the rig in the garage and enjoyed the Blinkt! LED bar change color as The Internet masses dictated what rainbow of colors would be displayed. But, that wasn't enough. <span style="-webkit-text-size-adjust: auto;">To control CheerLights, send a tweet to @cheerlights or include “cheerlights” somewhere in your message with the name of a color. for example, @CheerLights Paint the town red. </span><i>[UPDATE: After <a href="https://www.reddit.com/r/EnoughMuskSpam/" target="_blank">The RocketMan</a> took over Twitter the API no longer functions. To learn more about how to control any <a href="https://cheerlights.com/" target="_blank">cheerlights</a> project, including this one, go to <a href="https://cheerlights.com/" target="_blank">https://cheerlights.com/</a>]</i></p><p>-----</p><p>The Amazon impulse buy AI suggested that our life could be complete only if we spent $7.99US on the <a href="https://www.amazon.com/gp/product/B081JPC7DS/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1" target="_blank">DollaTEK DY-SV17F</a> mini MP3 module and an idea was born. <a href="https://www.youtube.com/results?search_query=hewlett+packard+what+if+commercials" target="_blank">What if</a>, we added sound to the existing <a href="https://twitter.com/cheerlights" target="_blank">@cheerlights</a> project and a short MP3 sound clip was played in addition to the LED color change? If The Internet masses demand 'purple' we change an LED to 'purple' and play a clip from the song "Purple Rain". 'pink' would trigger "Pink Cadillac". 'red' triggers "Red Red Wine". You get the idea....</p><p>-----</p><p>The <a href="https://www.amazon.com/gp/product/B081JPC7DS/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1" target="_blank">DollaTEK DY-SV17F</a> module has a UART mode to reduce the pins needed to control it, but the module is big on features and short on documentation for use with the Raspberry PI. After not being able to get UART mode to work (probably<a href="http://www.whiskeytangohotel.com/" target="_blank"> user error</a>) it was decided to use the plentiful GPIO pins on the <a href="https://pinout.xyz/pinout/blinkt#" target="_blank">Raspberry PI Zero</a> and go with a parallel interface solution. Here is a short video of the result: </p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/LWzDZd-eaYA" width="320" youtube-src-id="LWzDZd-eaYA"></iframe></div><p></p><p>----- <br /></p><p>Connection was straightforward:</p><p></p><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEibEBSAxE4DwZH54hSxniD4KhinUYAjAujaFvoocBCROk_CSbxAi9-SQP4s_zc0OcVUWbCu-_SJHVHPe8j-iGFTQhq_PPgijRyl-oMwCpZDKFq0c44HXyGk4x-vPJWlUpxIznZGrrevxe1gk7YnoCkeyflN5sIbTt4Zfxhg_eFFD1OIhuYIfv_8lYK-Zg=s789" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="602" data-original-width="789" height="244" src="https://blogger.googleusercontent.com/img/a/AVvXsEibEBSAxE4DwZH54hSxniD4KhinUYAjAujaFvoocBCROk_CSbxAi9-SQP4s_zc0OcVUWbCu-_SJHVHPe8j-iGFTQhq_PPgijRyl-oMwCpZDKFq0c44HXyGk4x-vPJWlUpxIznZGrrevxe1gk7YnoCkeyflN5sIbTt4Zfxhg_eFFD1OIhuYIfv_8lYK-Zg=w320-h244" width="320" /></a><br /></div><div> The rig looked like this on the bench:<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMuL3mu39f0oGnNoH_KbaTZdOFN22SsZXSuYLbj5wKazxnrmcNlog7E3_pes4ui_6KC5A3-uMiNloYwyYBltkXlLlQQbvJb3aUGYu-l-J2I965EJqyh66soDlDOql0UKu1w23bcMd5XpI_fOtwpVufMoS8mN5J4VNVwaf20_esi1Xth-KSPyVyfXnz2A/s3652/IMG_8840.heic" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="3652" data-original-width="2712" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMuL3mu39f0oGnNoH_KbaTZdOFN22SsZXSuYLbj5wKazxnrmcNlog7E3_pes4ui_6KC5A3-uMiNloYwyYBltkXlLlQQbvJb3aUGYu-l-J2I965EJqyh66soDlDOql0UKu1w23bcMd5XpI_fOtwpVufMoS8mN5J4VNVwaf20_esi1Xth-KSPyVyfXnz2A/s320/IMG_8840.heic" width="238" /></a></div><p>Packaged and mounted in the garage: <br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEilrsLNqBR3oTpUoBXf-acwFsZmIlpKdkT5pKmPDwCXC7T8QLG1oM_OEEWEO1qpZo6pX03E4PfM3fqq4bMGEstB-K231npmePRapEWspSGI01WU9c5dt9bMdMDmumOLqSQ3zTsk7Ns3TbHJNxkmYi-J2URpS8aphMz4dzXzeb6d2qVPwj4xGjZJD0gSnw=s800" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="689" data-original-width="800" height="276" src="https://blogger.googleusercontent.com/img/a/AVvXsEilrsLNqBR3oTpUoBXf-acwFsZmIlpKdkT5pKmPDwCXC7T8QLG1oM_OEEWEO1qpZo6pX03E4PfM3fqq4bMGEstB-K231npmePRapEWspSGI01WU9c5dt9bMdMDmumOLqSQ3zTsk7Ns3TbHJNxkmYi-J2URpS8aphMz4dzXzeb6d2qVPwj4xGjZJD0gSnw=s320" width="320" /></a> </div><div class="separator" style="clear: both; text-align: center;"></div>----- <br /><p></p><p>For the rig to work the two python programs below run on the RasPI at the same time; cheerlights.py and cheerlights_sound.py.</p><p>----- <br /></p><p>The cheerlights.py source code below updates the LEDs on the <a href="http://www.whiskeytangohotel.com/2022/03/cheerlights-control-of-blinkt-via.html" target="_blank">Blinkt! LED bar</a>:</p><p> #!/usr/bin/env python<br /><br /># Cheerlights with Pimoroni BlinkT module and RasPI Zero<br />#<br /># A tweet to @Cheerlights will change the LEFT most color of the BlinkT (LED#7)<br /># Color history maintained by shifting old color to the RIGHT (LED#0)<br /><br /># Valid color tweets to @Cheerlights are:<br /># RED GREEN BLUE CYAN WHITE OLDLACE PURPLE MAGENTA YELLOW ORANGE PINK<br />#<br /># Project details at: <br /># WhiskeyTangoHotel.Com<br />#<br /># MARCH 2022<br /># JULY 2022 add DollaTek DY-SV17F to play sound clip pwr color as independent and seperate program<br />#<br /><br />import time<br />import sys<br /><br />try:<br /> import requests # needed to poll @Cheerlights<br />except ImportError:<br /> exit("Install needed to run. Use the command: sudo pip install requests")<br /><br />from blinkt import set_clear_on_exit, set_pixel, show, set_brightness, clear # https://shop.pimoroni.com/products/blinkt#<br /><br />LED_delay = 0.5<br />brightness = 0.1 # 0.05 is lowest useable dim. 1.0 is full bright (the BLINKT is *really* bright if you want!)<br /><br />#Set up a matrix for r, g, b values (m stands for matrix)<br />rm = [0,1,2,3,4,5,6,7,8]<br />gm = [0,1,2,3,4,5,6,7,8]<br />bm = [0,1,2,3,4,5,6,7,8]<br /><br /># set_pixel(pixel_no, red, green, blue, brightness)<br /><br />print "Testing LEDs..."<br />print "---------------------------------------------"<br />for i in range(3):<br /> for j in range (0,8):<br /> set_pixel(j, 30, 0, 0, brightness)<br /> print "RED"<br /> show()<br /> time.sleep(LED_delay)<br /> for j in range (0,8):<br /> set_pixel(j, 0, 30, 0, brightness)<br /> print "GREEN"<br /> show()<br /> time.sleep(LED_delay)<br /> for j in range (0,8):<br /> set_pixel(j, 0, 0, 30, brightness)<br /> print "BLUE"<br /> show()<br /> time.sleep(LED_delay)<br /><br /> # all LEDs off<br /> for j in range (0,8):<br /> set_pixel(j, 0, 0,0)<br /> show()<br />print "LED Self test complete!"<br /><br />for j in range (0,8): # set values that we know are 'wrong' to enter main loop<br /> rm[j] = 73.73<br /> gm[j] = 73.73<br /> bm[j] = 73.73<br />print " "<br /><br />while True:<br /> try:<br /> r = requests.get('http://api.thingspeak.com/channels/1417/field/2/last.json')<br /> col = r.json()['field2']<br /> r, g, b = tuple(ord(c) for c in col[1:].lower().decode('hex'))<br /> time.sleep(5) # delay until we look for a new color change<br /><br /><br /> if (r != rm[7]) or (g != gm[7]) or (b != bm[7]): # new color selected<br /> print "New color placed far LEFT. Shift old colors RIGHT one place"<br /> for j in range (0,7): #shift in the new values<br /> rm[j] = rm[j+1]<br /> gm[j] = gm[j+1]<br /> bm[j] = bm[j+1] <br /> set_pixel(j, rm[j], gm[j], bm[j], brightness) <br /> show()<br /> time.sleep(LED_delay) # show change as a sweep<br /><br /> rm[7] = r<br /> gm[7] = g<br /> bm[7] = b<br /> set_pixel(7, rm[7], gm[7], bm[7], brightness)<br /> show()<br /> <br /> # All LED off on control C<br /> except KeyboardInterrupt:<br /> print("stopping ...")<br /> sys.exit(0)<br /> except:<br /> time.sleep(1)<br />----- <br /></p><p>The cheerlights_sound.py source code below runs the <a href="https://www.amazon.com/gp/product/B081JPC7DS/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1" target="_blank">DollaTEK DY-SV17F</a>:</p><p></p><p><br /># Cheerlights with DY-SV17F module for sound and RasPI Zero<br />#<br /># A tweet to @Cheerlights will play sound file<br /><br /># Valid color tweets to @Cheerlights are:<br /># RED GREEN BLUE CYAN WHITE OLDLACE PURPLE MAGENTA YELLOW ORANGE PINK<br />#<br /># Project details at: <br /># WhiskeyTangoHotel.Com<br />#<br /># MARCH 2022<br /># JULY 2022 add DollaTek DY-SV17F to play sound clip pwr color as independent and seperate program<br />#<br /><br /># DallaTEK DY-SV17F Files mapped to Cheerlights color. MP3s vary from ~10-30 secs<br /># 00001.mp3 = red (red red wine)<br /># 00002.mp3 = green (green green gras of home)<br /># 00003.mp3 = blue (blue bayoe)<br /># 00004.mp3 = cyan (call me cyan)<br /># 00005.mp3 = white (whiter shade of pale)<br /># 00006.mp3 = oldlace (leather and lace)<br /># 00007.mp3 = purple (purple rain [of course])<br /># 00008.mp3 - magenta (some song calll 'magenta')<br /># 00009.mp3 = yellow (yellow submarine)<br /># 00010.mp3 = orange (orange crush)<br /># 00011.mp3 = pink (pink cadi)<br /># 00012.mp3 = start speaker test file (start me up)<br /><br />import time<br />import requests # needed to poll @Cheerlights<br /><br />import RPi.GPIO as GPIO<br />GPIO.setmode(GPIO.BOARD) # to use Raspberry PI board pin numbers<br /><br />#Define some pins and vars<br />IO_0 = 31<br />IO_1 = 29<br />IO_2 = 3<br />IO_3 = 5<br />IO_4 = 7<br />IO_5 = 11<br />IO_6 = 13<br />IO_7 = 15<br /><br />CON_1 = 19<br />CON_2 = 21<br />CON_3 = 23<br /><br />current_color_mp3 = "clear" # set color value that we know is 'wrong' to enter main loop<br />delta_time = 0 # track seconds since last color change<br /><br />#Setup the GPIO and make sure the speaker is OFF<br /><br />GPIO.setwarnings(False) # To disable warnings.<br />GPIO.setup(IO_0, GPIO.OUT)<br />GPIO.setup(IO_1, GPIO.OUT)<br />GPIO.setup(IO_2, GPIO.OUT)<br />GPIO.setup(IO_3, GPIO.OUT)<br />GPIO.setup(IO_4, GPIO.OUT)<br />GPIO.setup(IO_5, GPIO.OUT)<br />GPIO.setup(IO_6, GPIO.OUT)<br />GPIO.setup(IO_7, GPIO.OUT)<br /><br />GPIO.setup(CON_1, GPIO.OUT)<br />GPIO.setup(CON_2, GPIO.OUT)<br />GPIO.setup(CON_3, GPIO.OUT) #HIGH = speaker sound. LOW = sound off<br /><br />GPIO.output(CON_1, GPIO.LOW)<br />GPIO.output(CON_2, GPIO.LOW)<br />GPIO.output(CON_3, GPIO.LOW) #HIGH = speaker sound. LOW = sound off<br /><br /># Test the speaker at startup <br />print "Testing speaker..."<br />GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /><br />GPIO.output(IO_0, GPIO.HIGH)<br />GPIO.output(IO_1, GPIO.HIGH)<br />GPIO.output(IO_2, GPIO.LOW)<br />GPIO.output(IO_3, GPIO.LOW)<br />GPIO.output(IO_4, GPIO.HIGH)<br />GPIO.output(IO_5, GPIO.HIGH)<br />GPIO.output(IO_6, GPIO.HIGH)<br />GPIO.output(IO_7, GPIO.HIGH)<br />time.sleep(5) # secs in this mp3<br />GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br />print "Speaker test complete!"<br />print<br /><br />while True: # main loop<br /> # ID the Color and Play the MP3 file asscd with that color<br /> r = requests.get('http://api.thingspeak.com/channels/1417/field/1/last.json')<br /> color_mp3 = r.json()['field1']<br /> #color_mp3 = "pink" # override color_mp3 var for debug.<br /> print str(delta_time * 5) + " seconds spent waiting for color change..."<br /> time.sleep(5) # delay until we look for a new color change<br /> delta_time = delta_time + 1<br /> <br /> if (color_mp3 != current_color_mp3): # new color selected<br /> current_color_mp3 = color_mp3<br /> delta_time = 0<br /> print color_mp3 + " found and..."<br /><br /> if (color_mp3 == "red"): # is 00001.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.LOW)<br /> GPIO.output(IO_1, GPIO.HIGH)<br /> GPIO.output(IO_2, GPIO.HIGH)<br /> GPIO.output(IO_3, GPIO.HIGH)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(19) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /><br /> if (color_mp3 == "green"): # is 00002.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.HIGH)<br /> GPIO.output(IO_1, GPIO.LOW)<br /> GPIO.output(IO_2, GPIO.HIGH)<br /> GPIO.output(IO_3, GPIO.HIGH)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(33) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> if (color_mp3 == "blue"): # is 00003.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.LOW)<br /> GPIO.output(IO_1, GPIO.LOW)<br /> GPIO.output(IO_2, GPIO.HIGH)<br /> GPIO.output(IO_3, GPIO.HIGH)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(20) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> if (color_mp3 == "cyan"): # is 00004.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.HIGH)<br /> GPIO.output(IO_1, GPIO.HIGH)<br /> GPIO.output(IO_2, GPIO.LOW)<br /> GPIO.output(IO_3, GPIO.HIGH)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(16) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> if (color_mp3 == "white"): # is 00005.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.LOW)<br /> GPIO.output(IO_1, GPIO.HIGH)<br /> GPIO.output(IO_2, GPIO.LOW)<br /> GPIO.output(IO_3, GPIO.HIGH)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(19) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> if (color_mp3 == "oldlace"): # is 00006.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.HIGH)<br /> GPIO.output(IO_1, GPIO.LOW)<br /> GPIO.output(IO_2, GPIO.LOW)<br /> GPIO.output(IO_3, GPIO.HIGH)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(27) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> if (color_mp3 == "purple"): # is 00007.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.LOW)<br /> GPIO.output(IO_1, GPIO.LOW)<br /> GPIO.output(IO_2, GPIO.LOW)<br /> GPIO.output(IO_3, GPIO.HIGH)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(25) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> if (color_mp3 == "magenta"): # is 00008.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.HIGH)<br /> GPIO.output(IO_1, GPIO.HIGH)<br /> GPIO.output(IO_2, GPIO.HIGH)<br /> GPIO.output(IO_3, GPIO.LOW)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(26) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> if (color_mp3 == "yellow"): # is 00009.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.LOW)<br /> GPIO.output(IO_1, GPIO.HIGH)<br /> GPIO.output(IO_2, GPIO.HIGH)<br /> GPIO.output(IO_3, GPIO.LOW)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(18) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> if (color_mp3 == "orange"): # is 00010.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.HIGH)<br /> GPIO.output(IO_1, GPIO.LOW)<br /> GPIO.output(IO_2, GPIO.HIGH)<br /> GPIO.output(IO_3, GPIO.LOW)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(22) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> if (color_mp3 == "pink"): # is 00010.mp3<br /> GPIO.output(CON_3, GPIO.HIGH) # turn ON the speaker <br /> <br /> GPIO.output(IO_0, GPIO.LOW)<br /> GPIO.output(IO_1, GPIO.LOW)<br /> GPIO.output(IO_2, GPIO.HIGH)<br /> GPIO.output(IO_3, GPIO.LOW)<br /> GPIO.output(IO_4, GPIO.HIGH)<br /> GPIO.output(IO_5, GPIO.HIGH)<br /> GPIO.output(IO_6, GPIO.HIGH)<br /> GPIO.output(IO_7, GPIO.HIGH)<br /> time.sleep(25) # secs in this mp3<br /> GPIO.output(CON_3, GPIO.LOW) # turn OFF the speaker<br /> <br /> print color_mp3 + " playing completed!"<br /> print<br />-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiHN4VcuestBDX1t0o4IcLCe5uLt5IB3ni11gKWf1zWV9kRDSd3jpG5EuDYhm5mtZIdy_cGUjbCG278YGn7F71X09ufPPamVtGsenjs2NxFJRd9AL4cGxBb26NuJtrt5W1rWRIuOxANSDBqqmVdW_1U-Y4AK4IDJGWQ4Fj7tn5rmk_fCXueTSoF8tsrfg=s231" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/a/AVvXsEiHN4VcuestBDX1t0o4IcLCe5uLt5IB3ni11gKWf1zWV9kRDSd3jpG5EuDYhm5mtZIdy_cGUjbCG278YGn7F71X09ufPPamVtGsenjs2NxFJRd9AL4cGxBb26NuJtrt5W1rWRIuOxANSDBqqmVdW_1U-Y4AK4IDJGWQ4Fj7tn5rmk_fCXueTSoF8tsrfg=s231" width="231" /></a></div><br /><br /></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-3008351353348910422022-06-20T16:57:00.007-05:002023-11-23T21:09:18.820-06:00Harbor Freight vs. 3M Infrared Thermometer<p>Way back in 2013 we purchased an infrared thermometer from <a href="https://www.harborfreight.com/" target="_blank">Harbor Freight</a> for less than ten bucks.</p><p><img border="0" data-original-height="586" data-original-width="359" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqU43EdytwoqAZgcYlz76KNJsjsvFcR94QyuXUbxYTbCU9DcsbnYB62-938UAxjIdeh7tOt0Cu-dWiRWOPLLxoubuZsZxHhHyBzmtoRhqvQdhGp1sprbLDikU1G7Aem80SBNXpt72nhNovz0fe86rdYMznIraLuV8u6wFrGKVlbpzwoT_BD9Mu-tZC7A/s320/yellow.JPG" width="196" /> <br /></p><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;">All in all the unit performed fine other than the plastic case getting that sticky melting feel that many low cost plastic products can develop over time.</div><p>----</p><p>Recently we got our hands on a 3M Model IR-750B "<a href="https://multimedia.3m.com/mws/media/304275O/rastreador-infrarrojos-de-calor.PDF" target="_blank">Scotchtrak Heat Tracer</a>" infrared thermometer and decided to compare the two units. Right away it's obvious that the 3M Model IR-750B has a superior feel. </p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEit9VtGyVBOWixzue0_jyZgHww-VCbbTbWvAGy_TDZ-Wdb4Kz8VsvJPqdpu2n9m_PKkrLiTfgDEHgFy5ZyiB_t_kwkId5IWV1CpkGqBFW4xZEMXPdwSBt_v9GIjw2E2p2vMlk2UKnPiINwIaq0rrLIF6WNvP-5D9cSXij8UUy_9DNN0RfS-ghSIncOjmA=s800" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="800" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEit9VtGyVBOWixzue0_jyZgHww-VCbbTbWvAGy_TDZ-Wdb4Kz8VsvJPqdpu2n9m_PKkrLiTfgDEHgFy5ZyiB_t_kwkId5IWV1CpkGqBFW4xZEMXPdwSBt_v9GIjw2E2p2vMlk2UKnPiINwIaq0rrLIF6WNvP-5D9cSXij8UUy_9DNN0RfS-ghSIncOjmA=s320" width="320" /></a></div>Plus. the 3M Model IR-750B comes in a nice carrying case. We were not able to find pricing on the 3M Model IR-750B, but something tells us the price was more the generic Harbor Freight model. Both units run on a single 9VDC battery.<p></p><p>-----</p><p>So..... How do their measurements compare?</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxH_tdUtpEYIWFe7pLzCePONjA3jeyinaxXS6jZ0zKX8PBMC8At6O-l2Yi14Qn6K6fP8Z3wgSul3oVgZWm2g1ss-rCIPClpHVgWz0anD6UxC_cy_3OHIwiUkSnbxlvq48t5X_wVVGxHP6JjlfHQkPwdYfnFmfEHpdy7K2tJ15PS9gP3s7kP_zx__24qQ/s887/1.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="747" data-original-width="887" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxH_tdUtpEYIWFe7pLzCePONjA3jeyinaxXS6jZ0zKX8PBMC8At6O-l2Yi14Qn6K6fP8Z3wgSul3oVgZWm2g1ss-rCIPClpHVgWz0anD6UxC_cy_3OHIwiUkSnbxlvq48t5X_wVVGxHP6JjlfHQkPwdYfnFmfEHpdy7K2tJ15PS9gP3s7kP_zx__24qQ/s320/1.JPG" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8xfzy061-xm1MvEFe4pNQgxQBK5MmYbBAuKWWO_EYDH4XUPcA0v0rYoNMLRfX5D4mNOCaJV30FDi5RqHlxMsNhyJ9DJpMSuujkWOoJXLXozZlTI7MjLjtGtF4dB0QSYWHXedEJyZGLe3oaBLqMCzITh0dQ6HK74IpIHR9YWmjS7WnLIwOoawPqhY9LQ/s842/2.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="738" data-original-width="842" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8xfzy061-xm1MvEFe4pNQgxQBK5MmYbBAuKWWO_EYDH4XUPcA0v0rYoNMLRfX5D4mNOCaJV30FDi5RqHlxMsNhyJ9DJpMSuujkWOoJXLXozZlTI7MjLjtGtF4dB0QSYWHXedEJyZGLe3oaBLqMCzITh0dQ6HK74IpIHR9YWmjS7WnLIwOoawPqhY9LQ/s320/2.JPG" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2SvOkZKeLn6olxqT6CeS5SmZxmO2uaXWrGLxBNmDS_GSbbbQuA4Wqce_rn1m38C17r1tWmDAmdDda0MDAsa0VzCFHzX2rk6aqCw3x9h9zXpQXLYhVZnZbKKXjeE5HmZq14V2Pm7klVBLbKZ_d41v_ClMY9E0axvL6l1tLFvvwgJ17tAuk-1B6CMGscQ/s818/3.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="744" data-original-width="818" height="291" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2SvOkZKeLn6olxqT6CeS5SmZxmO2uaXWrGLxBNmDS_GSbbbQuA4Wqce_rn1m38C17r1tWmDAmdDda0MDAsa0VzCFHzX2rk6aqCw3x9h9zXpQXLYhVZnZbKKXjeE5HmZq14V2Pm7klVBLbKZ_d41v_ClMY9E0axvL6l1tLFvvwgJ17tAuk-1B6CMGscQ/s320/3.JPG" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr4G76jzbsfvDpq3ngrXbChwzBDCV9CaaxhXBayF0-Cak26SYjtnBuB3JH8nKS-q0Ml6KBjAbEr17UvqtkURlSrsokeQme_X7l0uhVTmHGkcRgP6BZOViqFBBhqg3t_ujkKlBmbdEL5Qw9qxtm4JPL2HUBFCF49YwYqtaWAT-OyMfL5uwuVS1PaOTXGQ/s844/4.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="700" data-original-width="844" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr4G76jzbsfvDpq3ngrXbChwzBDCV9CaaxhXBayF0-Cak26SYjtnBuB3JH8nKS-q0Ml6KBjAbEr17UvqtkURlSrsokeQme_X7l0uhVTmHGkcRgP6BZOViqFBBhqg3t_ujkKlBmbdEL5Qw9qxtm4JPL2HUBFCF49YwYqtaWAT-OyMfL5uwuVS1PaOTXGQ/s320/4.JPG" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA8nMoJWGKufUtEwPMY9QDiQdVK4Az1cFpNTYunX3KTtKu95Q0RN1B9ePY21a2SjgNw17wu1Sb-v2BI_b1OP0-lxzQhg2bi4Q8S7dgxUtzn9s28Yox8MMoOdNaIzPBJBktbHB4dOjAPEaS0_bZMcgAZ6cohlzdjtfp97897HbQNxk04rP9yFoAY_K34Q/s978/5.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="707" data-original-width="978" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA8nMoJWGKufUtEwPMY9QDiQdVK4Az1cFpNTYunX3KTtKu95Q0RN1B9ePY21a2SjgNw17wu1Sb-v2BI_b1OP0-lxzQhg2bi4Q8S7dgxUtzn9s28Yox8MMoOdNaIzPBJBktbHB4dOjAPEaS0_bZMcgAZ6cohlzdjtfp97897HbQNxk04rP9yFoAY_K34Q/s320/5.JPG" width="320" /></a></div>-----<p></p><p>Pretty close! Which unit is correct? We don't have a calibrated source so we have no way of knowing. What we do know is they produce temperature readings that are closely collaborated.</p><p>-----</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiHN4VcuestBDX1t0o4IcLCe5uLt5IB3ni11gKWf1zWV9kRDSd3jpG5EuDYhm5mtZIdy_cGUjbCG278YGn7F71X09ufPPamVtGsenjs2NxFJRd9AL4cGxBb26NuJtrt5W1rWRIuOxANSDBqqmVdW_1U-Y4AK4IDJGWQ4Fj7tn5rmk_fCXueTSoF8tsrfg=s231" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/a/AVvXsEiHN4VcuestBDX1t0o4IcLCe5uLt5IB3ni11gKWf1zWV9kRDSd3jpG5EuDYhm5mtZIdy_cGUjbCG278YGn7F71X09ufPPamVtGsenjs2NxFJRd9AL4cGxBb26NuJtrt5W1rWRIuOxANSDBqqmVdW_1U-Y4AK4IDJGWQ4Fj7tn5rmk_fCXueTSoF8tsrfg" width="231" /></a></div><p></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-76104315732418990502022-03-13T10:56:00.009-05:002023-11-23T21:08:58.778-06:00@Cheerlights Control of BLINKT via Raspberry PI Zero<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjoLDz91JG5wMSIf1xPwC1aVsDUeqMkC53TsAKmKmtE0JsBvK1xgF2cKEZcv0O-qe-rWDbRvuphCs_3P_ph7DvnvX22AmfX4fB1LQVSLLEXB-7n-tuiUViZq3jHt2_cYFxV7-hh-qeT8QXzdIy88RMXRLPPwWT35TbEG6TYrLARD76ZJKF3754bN9n4MA=s571" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="381" data-original-width="571" height="214" src="https://blogger.googleusercontent.com/img/a/AVvXsEjoLDz91JG5wMSIf1xPwC1aVsDUeqMkC53TsAKmKmtE0JsBvK1xgF2cKEZcv0O-qe-rWDbRvuphCs_3P_ph7DvnvX22AmfX4fB1LQVSLLEXB-7n-tuiUViZq3jHt2_cYFxV7-hh-qeT8QXzdIy88RMXRLPPwWT35TbEG6TYrLARD76ZJKF3754bN9n4MA=s320" width="320" /></a></div>-----<p></p><p>On Twitter we kept seeing messages sent to <a href="https://twitter.com/cheerlights" target="_blank">@cheerlights</a> follow by a color. Turns out tweeting a color to <a href="https://twitter.com/cheerlights" target="_blank">@cheerlights</a> turns a whole bunch of LEDs around the world a different color. And now, thanks to this project, the LEDs in my garage. <span style="-webkit-text-size-adjust: auto;"></span><i>[UPDATE: After <a href="https://www.reddit.com/r/EnoughMuskSpam/" target="_blank">The RocketMan</a> took over Twitter the API no longer functions. To learn more about how to control any <a href="https://cheerlights.com/" target="_blank">cheerlights</a> project, including this one, go to <a href="https://cheerlights.com/" target="_blank">https://cheerlights.com/</a>]</i></p><p>---- </p><p>The concept seemed interesting and we had a Raspberry PI Zero and the <a href="https://learn.pimoroni.com/article/beginning-with-blinkt" target="_blank">Pimoroni BLINKT</a> LED module laying around already. Time to put them to use for this project. Honestly, the <a href="https://twitter.com/cheerlights" target="_blank">@cheerlights</a> API is so easy and well documented we won't cover that here. Same is true with the <a href="https://learn.pimoroni.com/article/beginning-with-blinkt" target="_blank">Pimoroni BLINKT</a> so we will just go straight to the Raspberry PI python source code.</p><p>-----</p><p>The Python scripts "listens" for if a color change tweet has been sent to <a href="https://twitter.com/cheerlights" target="_blank">@cheerlights</a>. If it "hears" one the far left LED is set to that color. All other LED colors are shifted right to show the history of the last eight colors. </p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/P6MnOoOCv_U" width="320" youtube-src-id="P6MnOoOCv_U"></iframe></div><p>-----</p><p>Here's the python source code for those that want to join in on the <a href="https://twitter.com/cheerlights" target="_blank">@cheerlights</a> fun.</p><p>#!/usr/bin/env python<br />
<br />
# Cheerlights with Pimoroni BlinkT module and RasPI Zero<br />
#<br />
# A tweet to @Cheerlights will change the LEFT most color of the BlinkT (LED#7)<br />
# Color history maintained by shifting old colors to the RIGHT (towards LED#0)<br />
<br />
# Valid color tweets to @Cheerlights are:<br />
# RED GREEN BLUE CYAN WHITE OLDLACE PURPLE MAGENTA YELLOW ORANGE PINK<br />
#<br />
# Project details at:<br />
# WhiskeyTangoHotel.Com<br />
#<br />
# MARCH 2022<br />
#<br />
<br />
import time # needed for delays<br />
import sys # for requests<br />
<br />
try:<br />
import requests # needed to poll @Cheerlights<br />
except ImportError:<br />
exit("Install needed to run. Use the command: sudo pip install requests")<br />
<br />
from blinkt import set_clear_on_exit, set_pixel, show, set_brightness,<br />
clear # <a data-saferedirecturl="https://www.google.com/url?q=https://shop.pimoroni.com/products/blinkt%23&source=gmail&ust=1647268898970000&usg=AOvVaw15Q5MLJ9ZapqQW9UqGUgdh" href="https://shop.pimoroni.com/products/blinkt#" rel="noreferrer" target="_blank">https://shop.pimoroni.com/prod<wbr></wbr>ucts/blinkt#</a><br />
<br />
LED_delay = 1<br />
brightness = 0.3 # 0.05 is lowest useable dim. 1.0 is full bright<br />
(the BLINKT is *really* bright if you want!)<br />
<br />
#Set up a matrix for r, g, b values (m stands for matrix)<br />
rm = [0,1,2,3,4,5,6,7,8]<br />
gm = [0,1,2,3,4,5,6,7,8]<br />
bm = [0,1,2,3,4,5,6,7,8]<br />
<br />
# set_pixel(pixel_no, red, green, blue, brightness)<br />
<br />
print "Testing LEDs..."<br />
print "---------------------------------------------"<br />
for i in range(3):<br />
for j in range (0,8):<br />
set_pixel(j, 30, 0, 0, brightness)<br />
print "RED"<br />
show()<br />
time.sleep(LED_delay)<br />
for j in range (0,8):<br />
set_pixel(j, 0, 30, 0, brightness)<br />
print "GREEN"<br />
show()<br />
time.sleep(LED_delay)<br />
for j in range (0,8):<br />
set_pixel(j, 0, 0, 30, brightness)<br />
print "BLUE"<br />
show()<br />
time.sleep(LED_delay)<br />
<br />
# all LEDs off<br />
for j in range (0,8):<br />
set_pixel(j, 0, 0,0)<br />
show()<br />
print "Self test complete..."<br />
<br />
for j in range (0,8): # set values that we know are 'wrong' to get us into the test loop<br />
rm[j] = 73.73<br />
gm[j] = 73.73<br />
bm[j] = 73.73<br />
print " "<br />
<br />
while True:<br />
try:<br />
r = requests.get('<a data-saferedirecturl="https://www.google.com/url?q=http://api.thingspeak.com/channels/1417/field/2/last.json&source=gmail&ust=1647268898970000&usg=AOvVaw3EWLaVJKIYHSQN4Jac3M0F" href="http://api.thingspeak.com/channels/1417/field/2/last.json" rel="noreferrer" target="_blank">http://api.thing<wbr></wbr>speak.com/channels/1417/field/<wbr></wbr>2/last.json</a>')<br />
col = r.json()['field2']<br />
r, g, b = tuple(ord(c) for c in col[1:].lower().decode('hex'))<br />
time.sleep(5) # delay until we look for a new color change<br />
<br />
<br />
if (r != rm[7]) or (g != gm[7]) or (b != bm[7]): # new color selected<br />
print "New color placed far LEFT. Shift old colors RIGHT one place"<br />
for j in range (0,7): #shift in the new values<br />
rm[j] = rm[j+1]<br />
gm[j] = gm[j+1]<br />
bm[j] = bm[j+1] <br />
set_pixel(j, rm[j], gm[j], bm[j], brightness)<br />
show()<br />
time.sleep(LED_delay) # show change as a sweep<br />
<br />
rm[7] = r<br />
gm[7] = g<br />
bm[7] = b<br />
set_pixel(7, rm[7], gm[7], bm[7], brightness)<br />
show()<br />
<br />
# All LED off on control C<br />
except KeyboardInterrupt:<br />
print("stopping ...")<br />
sys.exit(0)<br />
except:<br />
time.sleep(1)</p><p>-----</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiHN4VcuestBDX1t0o4IcLCe5uLt5IB3ni11gKWf1zWV9kRDSd3jpG5EuDYhm5mtZIdy_cGUjbCG278YGn7F71X09ufPPamVtGsenjs2NxFJRd9AL4cGxBb26NuJtrt5W1rWRIuOxANSDBqqmVdW_1U-Y4AK4IDJGWQ4Fj7tn5rmk_fCXueTSoF8tsrfg=s231" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/a/AVvXsEiHN4VcuestBDX1t0o4IcLCe5uLt5IB3ni11gKWf1zWV9kRDSd3jpG5EuDYhm5mtZIdy_cGUjbCG278YGn7F71X09ufPPamVtGsenjs2NxFJRd9AL4cGxBb26NuJtrt5W1rWRIuOxANSDBqqmVdW_1U-Y4AK4IDJGWQ4Fj7tn5rmk_fCXueTSoF8tsrfg" width="231" /></a></div><p></p><div class="a3s aiL" id=":97"><wbr></wbr></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-35886991767804512962022-02-20T11:02:00.010-06:002024-01-09T21:09:15.495-06:00Simpson 260 VOM answers, "Is the internet up?"<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEh3TDKMSYJib9IGtOcUpV1yFRdIliiKyftYh9-8RLENgKuC9uaw5bvcm2mCNvI3oyH7liYh6E-4iA07ZDSJBa_9ISYvQIq9cSlfjnyamXbngA4_Oykx8J_qLCn9vYlTcLP3wkxECcw5SPmqjWts08LDDhBPNqs01vNLUZTFyUJ4iGh1FqxB5_ajNAojjg=s801" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="649" data-original-width="801" height="324" src="https://blogger.googleusercontent.com/img/a/AVvXsEh3TDKMSYJib9IGtOcUpV1yFRdIliiKyftYh9-8RLENgKuC9uaw5bvcm2mCNvI3oyH7liYh6E-4iA07ZDSJBa_9ISYvQIq9cSlfjnyamXbngA4_Oykx8J_qLCn9vYlTcLP3wkxECcw5SPmqjWts08LDDhBPNqs01vNLUZTFyUJ4iGh1FqxB5_ajNAojjg=w400-h324" width="400" /></a></div>-----<p></p><p>It is a pretty commonly uttered question (sometimes loudly) around the home or office; "Is the internet up?" As the go to IT Support Manager around the house this can get a little tiresome. Most of the time the internet is up and it's a user or personal device problem that can be solved with a re-boot, re-load, re-etc. Rarely is the internet <i>really </i>down requiring a router and cable modem reboot or a call to the ISP. Wouldn't a simple visual check that anyone could quickly understand be helpful? </p><p>-----</p><p>I recently found my father's old <a href="http://www.simpson260.com/" target="_blank">Simpson 260</a> meter. He let me borrow it anytime I wanted with the warning of "<b>DON'T COOK IT!</b>". My memory recalls only using it for continuity and batteries which is good because I did not have a clue as to what would "cook it". I decided to put this heirloom to use as an internet monitor. This project is amazingly useful and simple to duplicate.</p><p>-----</p><p>The rig uses an <a href="https://www.amazon.com/HiLetgo-Internet-Development-Wireless-Micropython/dp/B081CSJV2V" target="_blank">ESP8266</a> to ping different servers. The ping time (in mS) is displayed on the Simpson 260 and 'percent of full scale'. In other words a ping of 73mS would be 73% of full scale on the Simpson 260. We set the source code (see below) to cycle through ten servers and show the ping result every 15 seconds.<br /></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/Wpw3AmSZErc" width="320" youtube-src-id="Wpw3AmSZErc"></iframe></div><p>-----</p><p>If the LAN is down or a ping error is detected the meter "wags" back and forth 5 times and tries another server. The message to the house is, "If the needle ain't wagging back and forth then your problem ain't with the internet connection!" <br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/0nxFzJKxfI8" width="320" youtube-src-id="0nxFzJKxfI8"></iframe></div>-----<p></p><p>Upload the <a href="https://www.arduino.cc/en/software" target="_blank">Arduino IDE</a> based source code below to the ESP8266. Connection to the Simpson 260 is easy. <br /> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhfC4ltJZ3RF09x0Dx8a944yE-EkOmyCz9-WN8Y51CYFqvaHRRNABS10VWbF8mwFoNbMewh-Zo8CKiwI8jjdtsZiB6QqqQq8UU2yOtFYpwMgdM0sodd79_SWN9uaZh7qrOjMq9qNcte5n9kRbo-o-Ic58fmNZ43_8kQxExZMb04ImUE9FXxpC7Iry75Ag=s949" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="679" data-original-width="949" height="286" src="https://blogger.googleusercontent.com/img/a/AVvXsEhfC4ltJZ3RF09x0Dx8a944yE-EkOmyCz9-WN8Y51CYFqvaHRRNABS10VWbF8mwFoNbMewh-Zo8CKiwI8jjdtsZiB6QqqQq8UU2yOtFYpwMgdM0sodd79_SWN9uaZh7qrOjMq9qNcte5n9kRbo-o-Ic58fmNZ43_8kQxExZMb04ImUE9FXxpC7Iry75Ag=w400-h286" width="400" /></a></div><p>-----</p><p>/*<br /> * A vintage Simpson 260 meter to shows network PING times<br /> * and if there is a connection to the internet.<br /> * <br /> * Deflect the Simpson meter from 0-100% of the 2.5V full scall<br /> * based on ping times of servers.<br /> * <br /> * 10mS = 10% of full scale. <br /> * 45mS = 55% of full scale.<br /> * 73mS = 73% if full scale.<br /> * XXmS = XX% of full scale, etc....<br /> * Anything over 100ms is consider terrible and just maxes to 100%<br /> * <br /> * A bad ping (site not found, network down, etc) will 'wag' the meter <br /> * back and forth from 0% to 100% five times then try next ping site.<br /> * <br /> * ESP8266 NodeMCU Board BAUD 115200<br /> * HiLetgo 1PC ESP8266 NodeMCU CP2102 ESP-12E Development Board from Amazon<br /> * <br /> * Full documetation at:<br /> * WhiskyTangoHotel.Com <br /> * <br /> * FEB2022<br /> * <br /> */<br /><br />#include <ESP8266WiFi.h><br />#include <Pinger.h><br /><br />const char* ssid = "Virus-2.4"; // These vars are your private WIFI<br />const char* password = "zenakelsocats"; // connection information<br /><br />// Define some 'ping friendly' sites. ARRAY starts a 0<br />String PingSite[] = { <br /> "whiskeytangohotel.com",<br /> "google.com",<br /> "yahoo.com",<br /> "bing.com",<br /> "abc.com",<br /> "cbs.com",<br /> "cnn.com",<br /> "apple.com",<br /> "pingler.com",<br /> "mailinator.com"<br />}; // end ping array define<br /><br />int Number_of_Ping_Sites = 10; // counted from the list above<br />int Secs_Between_Pings = 15;<br />float Min_Ping_Result = 999;<br />const int PINGOUT = 2; // Drives the S260. Blue onboard LED and ~D4<br />Pinger pinger;<br /><br />void setup() {<br /> analogWrite(PINGOUT, 0);<br /> delay(50);<br /> <br /> Serial.begin(115200);<br /> delay(100);<br /><br /> // Connect to the WiFi network<br /> Serial.println();<br /> Serial.println();<br /> Serial.print("Connecting to ");<br /> Serial.println(ssid);<br /><br /> WiFi.begin(ssid, password);<br /><br /> while (WiFi.status() != WL_CONNECTED) {<br /> delay(500);<br /> Serial.print(".");<br /> }<br /><br /> Serial.println("");<br /> Serial.println("WiFi connected"); <br /> Serial.println("IP address: ");<br /> Serial.println(WiFi.localIP());<br /><br />// For the ping dot h features https://github.com/bluemurder/esp8266-ping<br /> pinger.OnEnd([](const PingerResponse& response)<br /> {<br /> // Print time information<br /> if(response.TotalReceivedResponses > 0)<br /> {<br /> Serial.printf("Approximate round trip times in milli-seconds:\n");<br /> Serial.printf(<br /> " Minimum = %lums, Maximum = %lums, Average = %.2fms\n",<br /> response.MinResponseTime,<br /> response.MaxResponseTime,<br /> response.AvgResponseTime);<br /> Min_Ping_Result = response.MinResponseTime;<br /> }<br /> <br /> // Print host data<br /> Serial.printf("Destination host data:\n");<br /> Serial.printf(<br /> " IP address: %s\n",<br /> response.DestIPAddress.toString().c_str());<br /> if(response.DestMacAddress != nullptr)<br /> {<br /> Serial.printf(<br /> " MAC address: " MACSTR "\n",<br /> MAC2STR(response.DestMacAddress->addr));<br /> }<br /> if(response.DestHostname != "")<br /> {<br /> Serial.printf(<br /> " DNS name: %s\n",<br /> response.DestHostname.c_str());<br /> <br /> Serial.println("Minimum ping was: " + String(Min_Ping_Result) + "mS." + " Meter to " + String(int(Min_Ping_Result)) + "% of full scale.");<br /> Serial.println("Delay to next ping is " + String(Secs_Between_Pings) + " seconds...");<br /> Serial.println("---------------------");<br /> }<br /> return true; <br /> }); // end ping features<br /><br /> //Self Test the meter by moving the meter full scale<br /> // Increase meter value and on board LED brightness<br /> for(int dutyCycle = 0; dutyCycle < 200; dutyCycle++){ <br /> // changing the LED brightness with PWM;<br /> analogWrite(PINGOUT, dutyCycle);<br /> Serial.println(String(dutyCycle) + " increasing meter self test...");<br /> //analogWrite(PINGOUT, testval);<br /> delay(10);<br /> } // end meter increase<br /> <br /> // Decrease meter value and on board LED brightness<br /> for(int dutyCycle = 200; dutyCycle > 0; dutyCycle--){<br /> // changing the LED brightness with PWM<br /> analogWrite(PINGOUT, dutyCycle);<br /> Serial.println(String(dutyCycle) + " decreasing meter self test...");<br /> //analogWrite(PINGOUT, testval);<br /> delay(10);<br /> } // end meter decrease <br /> Serial.println("Self test complete!!!");<br /> Serial.println("---------------------");<br /> <br />} // end void setup<br /><br />// dutytCycle/2 = ~ the % of 2.5V scale on S260<br />// 0 dutytCycle =<br />// 50 dutytCycle = 28%<br />// 100 dutytCycle = 53%<br />// 150 dutytCycle = 77%<br />// 200 dutytCycle = 100%<br /><br />// Set S260 to +DC. The + lead to D4. Neg lead to GND<br /><br />void loop() { // loop until the Cowboys win a Super Bowl <br /><br /> for (int i = 0; i <= (Number_of_Ping_Sites - 1); i++) { // don't always use the same PingSite; cycle them.<br /> Serial.println("PingSite[" + String(i) + "]: " + PingSite[i]);<br /> <br /> if(pinger.Ping(PingSite[i]) == false) <br /> { <br /> Serial.println("Error during ping command. Walk the meter 5 times.");<br /> // Walk the meter back and forth to symbol 'ping error' or network down <br /> for (int walk = 0; walk<=4; walk++) {<br /> // Increase meter value and on board LED brightness<br /> for(int dutyCycle = 0; dutyCycle < 200; dutyCycle++){ <br /> // changing the LED brightness with PWM;<br /> analogWrite(PINGOUT, dutyCycle);<br /> Serial.println(String(dutyCycle) + " Showing FAIL increasing for: " + PingSite[i]);<br /> delay(10);<br /> } // end fail meter increase<br /> <br /> // Decrease meter value and on board LED brightness<br /> for(int dutyCycle = 200; dutyCycle > 0; dutyCycle--){<br /> // changing the LED brightness with PWM<br /> analogWrite(PINGOUT, dutyCycle);<br /> Serial.println(String(dutyCycle) + " Showing FAIL decreasing for: " + PingSite[i]);<br /> delay(10);<br /> } // end fail meter decrease<br /> } // end for fail meter back forth walk <br /> } // end if pinger.Ping <br /><br /> // Write Ping value to the meter. Low is better. <br /> // We basically make percent of full scale equal the ping in mS, ie; 45mS = 45%...<br /> // Anything over a 100mS is a crappy ping so we make 100mS (100% of scale)<br /> if (Min_Ping_Result > 100) { Min_Ping_Result = 100; }<br /> <br /> analogWrite(PINGOUT, Min_Ping_Result * 2); // move to meter to display the ping value<br /> delay(Secs_Between_Pings * 1000); // delay for next ping <br /> } // end for/next to cycle the PingSites <br />} // end loop until the Cowboys win the Super Bowl<br />-----<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjrU7iiZuGbgXp6gNFfWr2e0t1PrytlmClmt6e4BDggBSj5GyvX3HXBupIoPmQ08-ImjBangMXuvztx9lFPgbu20nuIJ10s528BfiuVjfQJixr7n4B3pNnnWjFZwNu7sDJLqTx7Wf-QPWHflHVSl_bvq6FTXJ-f4axMv33Owp1dPdhAaBfwPZfW10Hlpw=s231" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/a/AVvXsEjrU7iiZuGbgXp6gNFfWr2e0t1PrytlmClmt6e4BDggBSj5GyvX3HXBupIoPmQ08-ImjBangMXuvztx9lFPgbu20nuIJ10s528BfiuVjfQJixr7n4B3pNnnWjFZwNu7sDJLqTx7Wf-QPWHflHVSl_bvq6FTXJ-f4axMv33Owp1dPdhAaBfwPZfW10Hlpw" width="231" /></a></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-11422577702223197292022-02-07T08:29:00.005-06:002023-12-23T10:49:25.643-06:00Retirement Clock Goes Digital<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiF1Nq5L3VVlWQU2SzXcwGvIkKT0HGu3CkBV8YeMdAbuG2PDWCqyWF91y8VtFAGEKE0ur6aLqg1VBwsdCn5HVKtW158BSf_hLTExtYDiZgIsbWkb7mXaR7W9UixjidJtoicpatV2H51gVWIe5Kk9tGa3zlXuDh94krMI2oyRN6qx7-Lg558pu9tIh-Vgg=s2950" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2242" data-original-width="2950" height="243" src="https://blogger.googleusercontent.com/img/a/AVvXsEiF1Nq5L3VVlWQU2SzXcwGvIkKT0HGu3CkBV8YeMdAbuG2PDWCqyWF91y8VtFAGEKE0ur6aLqg1VBwsdCn5HVKtW158BSf_hLTExtYDiZgIsbWkb7mXaR7W9UixjidJtoicpatV2H51gVWIe5Kk9tGa3zlXuDh94krMI2oyRN6qx7-Lg558pu9tIh-Vgg=s320" width="320" /></a></div>-----<p></p><p>We overheard in a conversation recently something like: "Now that I'm retired I really only focus on what day of the week it is and the general time of day." We then discovered this awful looking <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_0Bpy-8Qg0FDds1uNsmXygSJQDU2ZKhyphenhyphenNRipWJJW2y_FEzRnLdw65DDyYRDQeGOvxVG2IxN8mLUyihb70-DitQ3zQuIZFpD2UL7cZfbhniHDvIWWKIEmHEQdTu6SLvAglj6JOB4_w_opc/s1600/dow-clock-783612.jpg" target="_blank">Day of the Week Clock</a> and the vision of a more modern version came to mind.</p><p>-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiHEFHSySliEd184q4FUAx1NSNaQ5cXg6LgSD2K50v-7A2FPey0unIFswefMo4p7Kcj1zJjSmG440IKRNJGNTBvj-Uv8180yFUu59p6lWa_J63KvJNsI9HrFRVh3R8huY8HNIRz4K4aCOZJSYZJGKffb-6evHkSkVFaHjBm41TdhDlLY8Jz9qS7g1iIvQ=s729" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="533" data-original-width="729" height="234" src="https://blogger.googleusercontent.com/img/a/AVvXsEiHEFHSySliEd184q4FUAx1NSNaQ5cXg6LgSD2K50v-7A2FPey0unIFswefMo4p7Kcj1zJjSmG440IKRNJGNTBvj-Uv8180yFUu59p6lWa_J63KvJNsI9HrFRVh3R8huY8HNIRz4K4aCOZJSYZJGKffb-6evHkSkVFaHjBm41TdhDlLY8Jz9qS7g1iIvQ=s320" width="320" /></a></div><p>The rig is based around this MakerFocus ESP32 Development Board mainly because it works with the Arduino IDE and has WiFi with a display on board. The code (source below) gets it's time/date from a NTP server and then simply figures out and displays the day of the week and what percentage of the day has past. Evidently this is all the critical information needed to guide the non-working through their day.</p><p>-----</p><p>To dress up the look a <a href="https://www.thingiverse.com/thing:5236751" target="_blank">case was 3D printed</a>. After seeing the result we needed to celebrate with a beer. As shown in the video below it was a bit early in the day for a drink, but as the ol' saying goes "It's <a href="https://untappd.com" target="_blank">71%</a> somewhere!".</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/neEw9tpWoGI" width="320" youtube-src-id="neEw9tpWoGI"></iframe></div><p>-----</p><p>Retirement Clock Source Code:</p><p>/*<br /> * HelTec Automation(TM) ESP32 Series Dev boards OLED "Retirement Clock"<br /> * Adruino IDE Board Setting: WiFi Kit32, Disabled, 240MHz, 921600, None<br /> * <br /> * "Retirement Clock" shows only Day of Week and percentage time left in the day.<br /> * <br /> * FEB 2022<br /> * Search whiskeytangohotel.com for project details.<br /> * <br />*/<br /><br />#include "Arduino.h"<br />#include "heltec.h"<br /><br />#include <TimeLib.h><br />#include <WiFi.h><br />#include <WiFiUdp.h><br /><br />const char ssid[] = "xxxxxxx"; // your network SSID (name)<br />const char pass[] = "xxxxxxx"; // your network password<br />long Sync_Delay = 60000; // 60000 is sync every ten minutes, We aren't going for precision here. LOL<br /><br />int DOWNUM = 0; // DOWNUM from NTP (expect 0 - 6)<br />String DOW = "DOW"; // DOWNUM to a Day of Week String <br />int hourNUM = 0; // hour() value from NTP<br />float minuteNUM = 0; // minute() value from NPT<br /><br />// NTP Servers:<br />static const char ntpServerName[] = "pool.ntp.org";<br />const int timeZone = 0; // leave as 0 for UTC. We do the offset math in void setup<br /><br />WiFiUDP Udp;<br />unsigned int localPort = 8888; // local port to listen for UDP packets<br /><br />time_t getNtpTime();<br />void digitalClockDisplay();<br />void printDigits(int digits);<br />void sendNTPpacket(IPAddress &address);<br /><br />void setup() {<br /> //NTP setup<br /> Serial.begin(115200);<br /> while (!Serial) ; // Needed for Leonardo only<br /> delay(250);<br /> Serial.println("TimeNTP");<br /> Serial.print("Connecting to... ");<br /> Serial.println(ssid);<br /> WiFi.disconnect();<br /> WiFi.mode(WIFI_MODE_STA);<br /> WiFi.begin(ssid, pass);<br /><br /> while (WiFi.status() != WL_CONNECTED) {<br /> delay(500);<br /> Serial.print(".");<br /> }<br /><br /> Serial.print("IP number assigned by DHCP is: ");<br /> Serial.println(WiFi.localIP());<br /> Serial.println("Starting UDP");<br /> Udp.begin(localPort);<br /> Serial.print("Local port: ");<br />// Serial.println(Udp.localPort());<br /> Serial.println("waiting for sync... ");<br /> setSyncProvider(getNtpTime);<br /> setSyncInterval(Sync_Delay); // defines how often to check NTP time <br /><br /> // Hetec setup<br /> Heltec.begin(true /*DisplayEnable Enable*/, false /*LoRa Disable*/, true /*Serial Enable*/);<br /> Heltec.display->flipScreenVertically();<br /> Heltec.display->setFont(ArialMT_Plain_24);<br />} // end setup link<br /><br />time_t prevDisplay = 0; // when the digital clock was last displayed timer<br /><br />void loop() { // main program loop<br /> if (timeStatus() != timeNotSet) {<br /> if (now() != prevDisplay) { //update the display only if time has changed<br /> prevDisplay = now();<br /> }<br /> }<br /><br /> // Parse time info and send info to serial monitor (for debug)<br /> Serial.print(hour());<br /> printDigits(minute());<br /> printDigits(second());<br /> Serial.print(" ");<br /> Serial.print(day());<br /> Serial.print(".");<br /> Serial.print(month());<br /> Serial.print(".");<br /> Serial.print(year());<br /> Serial.print(" : ");<br /><br /> if (int(year()) < 2022) { <br /> Serial.print(String(int(year())) + " is the NTP server year. That aint right, so try again!!!");<br /> Serial.println(); <br /> setup();<br /> } // the NTP server return something 'wierd' (probably 1970) so try again <br /><br /> //Covert Time in percent of day completed. Midnight Local = 0%, Noon Local = 50% <br /> minuteNUM = minute();<br /> hourNUM = int(hour()); <br /> // manually adjust hourNUM and minuteNUM for debug<br /> // hourNUM = 5; // valid values are INTERGERS 0 thru 24<br /> // minuteNUM = 49; // valid values are INTEGERS 0 thru 60 <br /><br /> minuteNUM = minuteNUM / 60; // covert minutes to 'fraction' <br /> hourNUM = hourNUM - 6; // hourNUM is in UTC. Adjust to local. -6 = CST, -5 = CDT, 0 = UTC<br /> DOWNUM = int(weekday());<br /> <br /> // Calculate percentage of the day pasted into 'progress'<br /> int progress = round( ( ((hourNUM + minuteNUM)) / 24 ) * 100 );<br /> if (progress < 0) { // it's past UTC midnight and the timezone offset created a negative %<br /> progress = 100 + progress; <br /> DOWNUM = DOWNUM - 1;<br /> } //end progress < 0<br /><br /> // Convert DOWNUM into printable String. Sunday is 1<br /> if (DOWNUM == 1) { DOW = "SUN"; }<br /> if (DOWNUM == 2) { DOW = "MON"; }<br /> if (DOWNUM == 3) { DOW = "TUE"; }<br /> if (DOWNUM == 4) { DOW = "WED"; }<br /> if (DOWNUM == 5) { DOW = "THU"; }<br /> if (DOWNUM == 6) { DOW = "FRI"; }<br /> if (DOWNUM == 7) { DOW = "SAT"; }<br /><br /> Serial.print(String(int(weekday())) + " is " + DOW);<br /> Serial.println(); <br /> Serial.print(String(hourNUM) + " + " + String(minuteNUM) + " = " + String(progress) + "%");<br /> Serial.println();<br /> <br /> // clear the display<br /> Heltec.display->clear();<br /><br /> // Draw the Precent of Day pasted onto progress bar<br /> Heltec.display->drawProgressBar(0, 0, 127, 20, progress);<br /><br /> // Label the Day Of Week and percentage as String<br /> Heltec.display->setTextAlignment(TEXT_ALIGN_CENTER);<br /> Heltec.display->drawString(60, 31, DOW + " " + String(progress) + "%");<br /> // Write buffer to Heltec display<br /> Heltec.display->display();<br /> <br /> delay(5000); // wait some. we are in no hurry to update the screen<br />} // end void loop main program<br /><br /><br />void printDigits(int digits)<br />{<br /> // utility for digital clock display: prints preceding colon and leading 0<br /> Serial.print(":");<br /> if (digits < 10)<br /> Serial.print('0');<br /> Serial.print(digits);<br />}<br /><br />/*-------- NTP code ----------*/<br /><br />const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message<br />byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets<br /><br />time_t getNtpTime()<br />{<br /> IPAddress ntpServerIP; // NTP server's ip address<br /><br /> while (Udp.parsePacket() > 0) ; // discard any previously received packets<br /> Serial.println("Transmit NTP Request");<br /> // get a random server from the pool<br /> WiFi.hostByName(ntpServerName, ntpServerIP);<br /> Serial.print(ntpServerName);<br /> Serial.print(": ");<br /> Serial.println(ntpServerIP);<br /> sendNTPpacket(ntpServerIP);<br /> uint32_t beginWait = millis();<br /> while (millis() - beginWait < 1500) {<br /> int size = Udp.parsePacket();<br /> if (size >= NTP_PACKET_SIZE) {<br /> Serial.println("Receive NTP Response");<br /> Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer<br /> unsigned long secsSince1900;<br /> // convert four bytes starting at location 40 to a long integer<br /> secsSince1900 = (unsigned long)packetBuffer[40] << 24;<br /> secsSince1900 |= (unsigned long)packetBuffer[41] << 16;<br /> secsSince1900 |= (unsigned long)packetBuffer[42] << 8;<br /> secsSince1900 |= (unsigned long)packetBuffer[43];<br /> return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;<br /> }<br /> }<br /> Serial.println("No NTP Response :-(");<br /> return 0; // return 0 if unable to get the time<br />}<br /><br />// send an NTP request to the time server at the given address<br />void sendNTPpacket(IPAddress &address)<br />{<br /> // set all bytes in the buffer to 0<br /> memset(packetBuffer, 0, NTP_PACKET_SIZE);<br /> // Initialize values needed to form NTP request<br /> // (see URL above for details on the packets)<br /> packetBuffer[0] = 0b11100011; // LI, Version, Mode<br /> packetBuffer[1] = 0; // Stratum, or type of clock<br /> packetBuffer[2] = 6; // Polling Interval<br /> packetBuffer[3] = 0xEC; // Peer Clock Precision<br /> // 8 bytes of zero for Root Delay & Root Dispersion<br /> packetBuffer[12] = 49;<br /> packetBuffer[13] = 0x4E;<br /> packetBuffer[14] = 49;<br /> packetBuffer[15] = 52;<br /> // all NTP fields have been given values, now<br /> // you can send a packet requesting a timestamp:<br /> Udp.beginPacket(address, 123); //NTP requests are to port 123<br /> Udp.write(packetBuffer, NTP_PACKET_SIZE);<br /> Udp.endPacket();<br />}</p><p>-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhODUZQejCnQvEEKmBLe7ivGrjR-KKPVArSJ04eDtv8h45LUUnAiX1MFCRlBq_vwxDKl3G1N4Wz2ptHTrJUL-q5lNubvqkjHgLrzq679_NDmMxS9_1vcCWSrGWYrtsSZbvqHGvUz7vjgERuCWyNyw6hxKDikXTIJudSTbE3QO7vY1S0Ln-PE3wyNKZLGA=s231" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/a/AVvXsEhODUZQejCnQvEEKmBLe7ivGrjR-KKPVArSJ04eDtv8h45LUUnAiX1MFCRlBq_vwxDKl3G1N4Wz2ptHTrJUL-q5lNubvqkjHgLrzq679_NDmMxS9_1vcCWSrGWYrtsSZbvqHGvUz7vjgERuCWyNyw6hxKDikXTIJudSTbE3QO7vY1S0Ln-PE3wyNKZLGA" width="231" /></a></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-22592099490470661272022-01-21T13:28:00.003-06:002023-11-23T21:06:54.023-06:00Wireless Charger Checker<p style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEil3AGK6XLrhz8-pA2EdLlt_A7yRa5_YG6NoajVpuR51xdInFqlY9uFsMo5ljVo6C7G7Mm_5CDr8fQmTDdxvlr50qvExZw2PEGnZbVO2oSDRtJUOQzuuLSQhOdoX-dSf8cXRWn0csxgZVK-qkadudhsCES1I4zt_Nua1SODHj7QiEn_OI4sY30xYWaIhg=s709" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="503" data-original-width="709" height="284" src="https://blogger.googleusercontent.com/img/a/AVvXsEil3AGK6XLrhz8-pA2EdLlt_A7yRa5_YG6NoajVpuR51xdInFqlY9uFsMo5ljVo6C7G7Mm_5CDr8fQmTDdxvlr50qvExZw2PEGnZbVO2oSDRtJUOQzuuLSQhOdoX-dSf8cXRWn0csxgZVK-qkadudhsCES1I4zt_Nua1SODHj7QiEn_OI4sY30xYWaIhg=w400-h284" width="400" /></a></p><p></p><p>-----</p><p>Charging your phone, watch, earbuds, etc. from a wireless charger sometimes doesn't work. Most of the time it is due to poor alignment to the charge point. Of course, it could be that the wireless charger is broken or simply unplugged.</p><p>This quick DIY tool helps verify that the charger is plugged in as well as determine the wireless charger's "sweet spot".</p><p>----- <br /></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/wTXbuiiSzIc" width="320" youtube-src-id="wTXbuiiSzIc"></iframe></div>----- <br /><p></p><p>The build is about as cheap and simple is it can be. If you have trouble building the rig from the image below you may be following the wrong project site. ;)<br /></p><p>-----</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgCoiH2NXZQAhhZk84bkQljSRuyip6WbB6wtvs_ZMfty5yHFmk4hcvEr5H1WbuoIBHB2zvL0Kf4KVA8DMNEZG0HLcFfAYs1bj4GnQnL_6XnF5TqPgjB8OWlFgAymR2Fm2r9CjdyhHqGij7MbF6lef7oM7ya1HGipH6vhd6xjvSVvMfbaw2b3gBr90_shw=s742" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="646" data-original-width="742" height="279" src="https://blogger.googleusercontent.com/img/a/AVvXsEgCoiH2NXZQAhhZk84bkQljSRuyip6WbB6wtvs_ZMfty5yHFmk4hcvEr5H1WbuoIBHB2zvL0Kf4KVA8DMNEZG0HLcFfAYs1bj4GnQnL_6XnF5TqPgjB8OWlFgAymR2Fm2r9CjdyhHqGij7MbF6lef7oM7ya1HGipH6vhd6xjvSVvMfbaw2b3gBr90_shw=s320" width="320" /></a></div>-----<br /> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjcZt-OKw9hucMnHld8lkUNdS8bTWGySh70PRGDagjF_kkliFudoR4YoIyW9lFlhqeh66RyxHrUj1DhWKIzVo6SBxpPRAHB37zizFzoMtH_aC_ynnJMq-F8QSj5VLOLet037aYHS0F2b4yApZdnIfQ9l74L44zNh9Ymhj8DK2mHfyx8xQfL2W_BgR6-Uw=s231" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/a/AVvXsEjcZt-OKw9hucMnHld8lkUNdS8bTWGySh70PRGDagjF_kkliFudoR4YoIyW9lFlhqeh66RyxHrUj1DhWKIzVo6SBxpPRAHB37zizFzoMtH_aC_ynnJMq-F8QSj5VLOLet037aYHS0F2b4yApZdnIfQ9l74L44zNh9Ymhj8DK2mHfyx8xQfL2W_BgR6-Uw" width="231" /></a></div><br /><br /><p></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-85071111631458744382021-10-02T09:16:00.007-05:002023-11-23T21:06:21.751-06:00Elenco Resistor Substitution Kit <p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKbDb9ZxpQTwNKHea_scqRQAOy4CPpCceVws_qDsRz8GGbk5v5PAYGO8CDCGB6ufc6Fdad3Vrw9pmyVnRQezhRKPLNZJZRmnOG_WbyMsc7ntHoH1U4cLdgymBwYluQS_mb7rIq7BkdaVtG/s1600/res.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="963" data-original-width="1600" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKbDb9ZxpQTwNKHea_scqRQAOy4CPpCceVws_qDsRz8GGbk5v5PAYGO8CDCGB6ufc6Fdad3Vrw9pmyVnRQezhRKPLNZJZRmnOG_WbyMsc7ntHoH1U4cLdgymBwYluQS_mb7rIq7BkdaVtG/w401-h242/res.jpg" width="401" /></a></div>-----<p></p><p>We built the <a href="http://www.whiskeytangohotel.com/2021/09/elenco-capacitor-substitution-kit.html" target="_blank">Elenco Capacitor Substitution Kit</a> and because it went together so well decided to build it's partner the <a href="https://www.amazon.com/Elenco-Resistor-Substitution-Box-RS-400/dp/B00R6SOXLG" target="_blank">Elenco Resistor Substitution Kit</a>. Not much else to say; like the Capacitor Substitution Kit the directions are easy to follow for this very basic kit. We did make the same modification and replace the provided alligator clip connection with banana jacks. The measured values look fine:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRU5FfdF0Y87sRa0NNX1EywGp9Q7rNyUPts6abgnJeMbjn2mo4I0K9GNjtpHsD0OjHr-g9sDMktwGONyZ3w2iA2QhBT_gpmigZ5WcIhsFsyVn_qVheVR262tWNJ2fqv25SdliS2XOyezGC/s608/res-modified.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="336" data-original-width="608" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRU5FfdF0Y87sRa0NNX1EywGp9Q7rNyUPts6abgnJeMbjn2mo4I0K9GNjtpHsD0OjHr-g9sDMktwGONyZ3w2iA2QhBT_gpmigZ5WcIhsFsyVn_qVheVR262tWNJ2fqv25SdliS2XOyezGC/w320-h176/res-modified.jpg" width="320" /></a></div><p>-----</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvAn3xCRCpA2WtPNaYhSFXIboguleL_sYT0ngidRKvJTc5luSQVSaRsEVwrbgJ6Nb9tPJmPaCpehlrZngFVtvNMuiW4wUR7-t2A8DbDPlX9n4YmQTwEc1mSRMT6ntOKM1waEC7i5ZHQTyi/s1280/res.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1208" data-original-width="1280" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvAn3xCRCpA2WtPNaYhSFXIboguleL_sYT0ngidRKvJTc5luSQVSaRsEVwrbgJ6Nb9tPJmPaCpehlrZngFVtvNMuiW4wUR7-t2A8DbDPlX9n4YmQTwEc1mSRMT6ntOKM1waEC7i5ZHQTyi/w334-h315/res.jpg" width="334" /></a></div>-----<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirK6GiKfOVNDDxa6QVKp3gvS6CSn46V3B8MKxpr4xhM1R-Bj-rKwfCyBWjYPfIieO7KPvVVt3Zofs8md6AdBK66QTAG3kgWMlYU-09yxD4zxpp_yFSi0G693EUJjtjK25W26HNnuY0LXAg/s231/res-modified.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirK6GiKfOVNDDxa6QVKp3gvS6CSn46V3B8MKxpr4xhM1R-Bj-rKwfCyBWjYPfIieO7KPvVVt3Zofs8md6AdBK66QTAG3kgWMlYU-09yxD4zxpp_yFSi0G693EUJjtjK25W26HNnuY0LXAg/s0/res-modified.jpg" width="231" /></a></div><br /> <br /><p></p><p><br /></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-48198150195854193102021-09-05T14:39:00.003-05:002023-11-23T21:06:08.472-06:00Elenco Capacitor Substitution Kit<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN0jV43X4N1bpVnOtbvD5y2A86PYceAaNaDyMnyLG_E_Wg_shEUBTj8FZODsqiX4XokNjng3L-mbRipIfxfDHC4ZMHXc77MX8lQTdKftP2mPp1A4c9yMfri9UXZ5mFP_sBV5eEW9IV-btI/s1802/IMG_6255.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1063" data-original-width="1802" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN0jV43X4N1bpVnOtbvD5y2A86PYceAaNaDyMnyLG_E_Wg_shEUBTj8FZODsqiX4XokNjng3L-mbRipIfxfDHC4ZMHXc77MX8lQTdKftP2mPp1A4c9yMfri9UXZ5mFP_sBV5eEW9IV-btI/w400-h236/IMG_6255.jpg" width="400" /></a></div>-----<p></p><p>Not often (okay, almost never) a <a href="https://www.amazon.com/gp/product/B00R6SOZ00" target="_blank">capacitance substitution box</a> would come in handy on the bench. Finally, the Amazon AI wizard suggested that at $14.99 we couldn't live life any longer without one. </p><p>From the pic above you can see that the included wire and alligator clip connector were replaced with banana plug jacks. It gives the rig and the bench a cleaner look.</p><p>-----</p><p>The directions (which we folded up and placed inside the box for
future generations) were straight forward and the values are accurate
enough per a NIST traceable capacitance meter. </p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5ddGAjhcJsqgAqy9pp6g_WDx7iLOY4YUjRqm5UHHFtDfi4rrbIhsHz8Jcm9qgBfHlofuyO7O1JP0fnKtJebKGoxLwVWIikzEOae-EBEGiHxpiHzq8HAvAsS_9lISF3DhPGqtJAC3JsnNZ/s1586/Final_Test.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="877" data-original-width="1586" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5ddGAjhcJsqgAqy9pp6g_WDx7iLOY4YUjRqm5UHHFtDfi4rrbIhsHz8Jcm9qgBfHlofuyO7O1JP0fnKtJebKGoxLwVWIikzEOae-EBEGiHxpiHzq8HAvAsS_9lISF3DhPGqtJAC3JsnNZ/w400-h221/Final_Test.jpg" width="400" /></a></div><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWXQiaISxFjepka_-hIJm1OXM4pJ5lgk15K-jzekdhLU6kAxAjy_20VNFp0feH_Gcg8GaX4thOPfqRTXCvmC6tT0PvOtIg1_tzihT8rxiEQ7GduswaOnYj8nC9I9hCJHPglwp_17NAv7wp/s2016/IMG_6254.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1512" data-original-width="2016" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWXQiaISxFjepka_-hIJm1OXM4pJ5lgk15K-jzekdhLU6kAxAjy_20VNFp0feH_Gcg8GaX4thOPfqRTXCvmC6tT0PvOtIg1_tzihT8rxiEQ7GduswaOnYj8nC9I9hCJHPglwp_17NAv7wp/w400-h300/IMG_6254.jpg" width="400" /></a></div><p>-----</p><p>The same company also makes a <a href="https://www.amazon.com/Elenco-Resistor-Substitution-Box-RS-400/dp/B00R6SOXLG" target="_blank">resistance substitution box</a> which we also don't need, but will probably build up anyway. Both are a nice, cheap, welcome convenience. </p><p>-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEnzTMX6XESMQkLZM3mXzKCETdjawmFhgfBs7gpJS5UW5D6wUCArF8SednR_ahZt5K6Nbjqc8sHF8KLyyoyq_H3e-OxLLkha3g5ahX5GGk0bV0bB70nAX5QCKC5G9SpNh2vXQTvX_D7YVt/s231/Capture.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEnzTMX6XESMQkLZM3mXzKCETdjawmFhgfBs7gpJS5UW5D6wUCArF8SednR_ahZt5K6Nbjqc8sHF8KLyyoyq_H3e-OxLLkha3g5ahX5GGk0bV0bB70nAX5QCKC5G9SpNh2vXQTvX_D7YVt/s0/Capture.JPG" width="231" /></a></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-26971768474883265082021-05-30T20:58:00.003-05:002023-11-23T21:12:55.731-06:00Remote CW Straight Key [FlexRadio and RemoteHams.Com]<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQx83vaIggcH19-aQnKkMpAh3Em1vhHrQiA-c_41aO6sBjFVtZox50rRyau8CZTtkaBl1H30iyR7cxE1fRK6dx9Cxk-006p6i9ML9dj5nRnpiXrY2uvWc5gaoNeup3t8adMorF1re0EpHo/s941/imgonline-com-ua-Negative-CApanDSA2Szhnh.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="447" data-original-width="941" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQx83vaIggcH19-aQnKkMpAh3Em1vhHrQiA-c_41aO6sBjFVtZox50rRyau8CZTtkaBl1H30iyR7cxE1fRK6dx9Cxk-006p6i9ML9dj5nRnpiXrY2uvWc5gaoNeup3t8adMorF1re0EpHo/w400-h190/imgonline-com-ua-Negative-CApanDSA2Szhnh.jpg" width="400" /></a></div>Note: As presented this project requires a <a href="http://www.arrl.org/licensing-education-training" target="_blank">FCC Amateur Radio license</a>. It's not hard to get and it is a fun and rewarding hobby. Also, learning <a href="https://en.wikipedia.org/wiki/Morse_code" target="_blank">Morse code</a> is no longer a requirement. <br /><p></p><p>-----</p><p>As a remote ham radio operator that enjoys using a manual <a href="http://www.arrl.org/cw-mode" target="_blank">CW</a> (<a href="https://en.wikipedia.org/wiki/Morse_code" target="_blank">Morse code</a>) straight key we were presented with two problems:</p><ul style="text-align: left;"><li><a href="http://RemoteHams.Com" target="_blank">RemoteHams.Com</a> remote manual keying <br /></li><li><a href="https://www.flexradio.com/" target="_blank">FlexRadio</a> remote manual keying</li></ul><p>Since both require slightly different hardware wiring to the PC running the remote rig, we set out to make something that would be a universal connection regardless of which platform we are using. </p><p>-----</p><p>The hardware connection is simple and shown below. It does require a USB/RS-232 adapter and using the RS-232 terminal block
break out module shown makes things easier. There are many example of these two items on Amazon.Com, etc. <br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVT4vKSuREyrUgTbCrf959CQcNLSn1kWyIO8y5xgaVg9Im1mgyBUpxOUDQq494WW2u51U2kNyqg3FzbCMNE18rglSOYF3TScxf39ud5l7R6gogrk11pFsmX_O9DOJSR2jOYk-jJ8Phfhv3/s1166/imgonline-com-ua-Negative-VfDy5d0u9s0d.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="666" data-original-width="1166" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVT4vKSuREyrUgTbCrf959CQcNLSn1kWyIO8y5xgaVg9Im1mgyBUpxOUDQq494WW2u51U2kNyqg3FzbCMNE18rglSOYF3TScxf39ud5l7R6gogrk11pFsmX_O9DOJSR2jOYk-jJ8Phfhv3/w400-h229/imgonline-com-ua-Negative-VfDy5d0u9s0d.jpg" width="400" /></a></div><p>For both applications software is needed as well.</p><p>----- <br /></p><p>For our RemoteHams.Com solution go <a href="http://www.whiskeytangohotel.com/2019/04/cw-key-via-usb-port-for-remotehamcom.html" target="_blank">here</a>.</p><p>-----</p><p>For the <a href="https://www.flexradio.com/" target="_blank">FlexRadio</a> solution you will need to install the excellent and easy to use <a href="https://groups.io/g/RemoteKeyerInterface" target="_blank">Remote Keyer Interface</a> software. Follow the <a href="https://groups.io/g/RemoteKeyerInterface" target="_blank">RKI</a> link for the software and you will also find the very helpful RKI message board that I personally proved is helpful and tolerant of 'stupid' questions. Seriously, the software has great documentation and even though I asked a "RTFM" question I got helpful direction from the forum. After you install and run the RKI software you will see this screen: </p><p></p><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhglI4m5AXvQeYC8MTU-8wt2oSuGZaUi6cLW_NJibPKQyyF1hKysoUIG_zyezTj9IsiO82O51E-4leIlEdFG9es6Z6YYyka1_0AnftRsNQD6fTSSO5xAMKXqOOGS6B0qhBbnw8WZT1qmuE2/s769/imgonline-com-ua-Negative-CApanDSA2Szhnh.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="769" data-original-width="141" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhglI4m5AXvQeYC8MTU-8wt2oSuGZaUi6cLW_NJibPKQyyF1hKysoUIG_zyezTj9IsiO82O51E-4leIlEdFG9es6Z6YYyka1_0AnftRsNQD6fTSSO5xAMKXqOOGS6B0qhBbnw8WZT1qmuE2/w74-h400/imgonline-com-ua-Negative-CApanDSA2Szhnh.jpg" width="74" /></a></div><p>Make the remote connection to your FlexRadio via your SmartLink login and select the correct <a href="https://www.howtogeek.com/167094/how-to-use-the-windows-device-manager-for-troubleshooting/" target="_blank">COM Port</a> for your (now) USB straight key. Verify the other options are selected per above screen shot and you should be good to go.</p><p>BTW, <a href="https://groups.io/g/RemoteKeyerInterface" target="_blank">Remote Keyer Interface</a> software has several other cool features in addition to this simple application.</p><p>-----</p><p>Summary: My remote CW manual straight keying problems are solved!</p><p>----- <br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzd8Gdb8-OPmcRzwZyQ0j-IEow1VkUd9O7IfgyiyN5p52KKOytABe3HO2Qam4l8xb54tgGiuq52B4e8fnG9wZQh_PZRn-Xp22Kg3barlo6STVXiRyQ2tQ6zM3ztOk7S-e1-xhxOWDZmPpy/s231/imgonline-com-ua-Negative-CApanDSA2Szhnh.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzd8Gdb8-OPmcRzwZyQ0j-IEow1VkUd9O7IfgyiyN5p52KKOytABe3HO2Qam4l8xb54tgGiuq52B4e8fnG9wZQh_PZRn-Xp22Kg3barlo6STVXiRyQ2tQ6zM3ztOk7S-e1-xhxOWDZmPpy/s0/imgonline-com-ua-Negative-CApanDSA2Szhnh.jpg" /></a></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-5168474954721098902021-05-26T14:58:00.006-05:002021-05-26T15:05:22.893-05:00The Tale of Three USB Chargers<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh89vH6tBFB-2nvHgDVabDuQyCGx-Ud2BMYi2uwTTqx4ByQaFZwUP7hc5OLvzWqSkPvtZk98WkgNZG-9ii7PzO9ECWI0kwkk6ChZ5vXiu1iu3R1PF9onaXJ-5NbuEYSrsHOUww0-qlGIekn/s1600/IMG_5591-724099.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="845" data-original-width="1600" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh89vH6tBFB-2nvHgDVabDuQyCGx-Ud2BMYi2uwTTqx4ByQaFZwUP7hc5OLvzWqSkPvtZk98WkgNZG-9ii7PzO9ECWI0kwkk6ChZ5vXiu1iu3R1PF9onaXJ-5NbuEYSrsHOUww0-qlGIekn/w400-h211/IMG_5591-724099.jpg" width="400" /></a></div>-----<p></p><p>Everyone seems to have a box full of <a href="https://en.wikipedia.org/wiki/Battery_charger#USB-based_charger" target="_blank">USB chargers</a>. Well, we do anyway and decided to pick two random "no name" chargers and pit them up against an official Apple USB charger.</p><p>The test setup was the same for each USB charger. We swept a load that increases from 100mA until the USB charger went into protection (no voltage output). We then checked EMI/RF Noise and 'vampire drain'.</p><p><a href="https://en.wikipedia.org/wiki/Electromagnetic_interference" target="_blank">EMI/RF</a> Noise is a big concern. <a href="https://en.wikipedia.org/wiki/Electromagnetic_interference" target="_blank">EMI/RF</a> can have a negative effect on WiFi, Bluetooth, ham radio, and pretty much any radio signal in the area. Measuring with a Spectrum Analyzer the Apple was by far the most RF quite. The White "no name" was extremely EMI/RF noisy with the Black "no name" being pretty bad as well. </p><p>"<a href="https://en.wikipedia.org/wiki/Standby_power" target="_blank">Vampire drain</a>" or standby power is how much energy the charger uses when just plugged into the wall doing nothing. The Apple won in this category as well. <br /></p><p></p><p></p><p>My opinion, get the Apple or other well made USB charger and avoid the "no
names", The Apple uses less standby power and should not have a negative
effect on your or your neighbors wireless equipment. The Apple power output meets spec as well and is more linear until protection kicks in. The Apple is just better and some "no names" are are just <a href="https://www.komando.com/gadgets/these-phone-chargers-are-causing-burns-and-fires/584270/" target="_blank">unsafe</a>. </p><p>-----</p><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsXAMzDZWcQtJ1RuAG8suAX6YxnKfTczkDrk5RNoV7VvwoKQ4dF4j2Ur_yB9BVW-4LwBDJHrVKUBRWDLKVPZKYBdbvU5bP0Qb3gJV01b0FSj3Qx1issaiHdOAfngm_1_qhsoCMtjHG00r3/s795/white.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="367" data-original-width="795" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsXAMzDZWcQtJ1RuAG8suAX6YxnKfTczkDrk5RNoV7VvwoKQ4dF4j2Ur_yB9BVW-4LwBDJHrVKUBRWDLKVPZKYBdbvU5bP0Qb3gJV01b0FSj3Qx1issaiHdOAfngm_1_qhsoCMtjHG00r3/w400-h185/white.JPG" width="400" /></a></div><p></p><p>-----<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmaopZzfidSXpF8MYTo0YA6xxm8-ZleoMhxb9UMebK8ibzDDsIhu_-pFleJ9kKImI-8GlJOjnx0OR10a-C_CiGbgtnC1hX7TDePpe8WQ4DgQdo2vVV99kUqIv_KCrExUL6_5zAXahsGCws/s804/black.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="369" data-original-width="804" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmaopZzfidSXpF8MYTo0YA6xxm8-ZleoMhxb9UMebK8ibzDDsIhu_-pFleJ9kKImI-8GlJOjnx0OR10a-C_CiGbgtnC1hX7TDePpe8WQ4DgQdo2vVV99kUqIv_KCrExUL6_5zAXahsGCws/w400-h184/black.JPG" width="400" /></a></div><p></p><p></p><p>-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgruAxN-54HFM59Nyu4KSpUTnVvb8sheHq7fk1O_rs_pcouZabdOCYfQlFtxFnFyb0DWTMzMpx_LbEwt3qzgIFHB8MCnvg_lZ1tgu016e3qjgKF3ESKYxWgSxb84ImgnTHsagSx6p0j4iEs/s800/apple.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="362" data-original-width="800" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgruAxN-54HFM59Nyu4KSpUTnVvb8sheHq7fk1O_rs_pcouZabdOCYfQlFtxFnFyb0DWTMzMpx_LbEwt3qzgIFHB8MCnvg_lZ1tgu016e3qjgKF3ESKYxWgSxb84ImgnTHsagSx6p0j4iEs/w400-h181/apple.JPG" width="400" /></a></div><p>-----</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZw5ncCRIcPIwcvtP78PE_8VoCUjsts5f9bKymddOOWI7O_3HPmkI2trcDT6N7g-XhhrgKTlWExm8fx3QRJ201G6i4zfDEdriGt1A_PUFFZdEgD8NB7FX7Pw-X-1HKyH3TCgnN1XxRJI4p/s231/IMG_5591-724099.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZw5ncCRIcPIwcvtP78PE_8VoCUjsts5f9bKymddOOWI7O_3HPmkI2trcDT6N7g-XhhrgKTlWExm8fx3QRJ201G6i4zfDEdriGt1A_PUFFZdEgD8NB7FX7Pw-X-1HKyH3TCgnN1XxRJI4p/s0/IMG_5591-724099.jpg" /></a></div>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-89594393899303768872021-05-20T20:22:00.007-05:002023-11-23T21:13:07.594-06:00Morse Code QSO via Vintage Phone<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgON7LmJnMdsj9t6eLXqI1z31HD_fq2iTltzk9XRzXsJCmE7ZmJ6_kvbc7-GKDWaPHEedLFO84-RONkU60wZONW_5vDu9TLe8GAkkd0p4FSAIuKxdt6zfFf9KTwddh_2IAbtiY6_Jc2Lmt9/s750/p3.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="426" data-original-width="750" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgON7LmJnMdsj9t6eLXqI1z31HD_fq2iTltzk9XRzXsJCmE7ZmJ6_kvbc7-GKDWaPHEedLFO84-RONkU60wZONW_5vDu9TLe8GAkkd0p4FSAIuKxdt6zfFf9KTwddh_2IAbtiY6_Jc2Lmt9/w400-h228/p3.jpg" width="400" /></a></div>-----<p></p><p>As a preteen many many years ago the thought never occurred that the same phone used to plan childhood mischief would some day be used for a <a href="http://www.arrl.org/cw-mode" target="_blank">CW</a> (<a href="https://en.wikipedia.org/wiki/Morse_code" target="_blank">Morse code</a>) <a href="http://www.arrl.org/find-an-amateur-radio-license-class" target="_blank">ham radio</a> QSO. Ain't life funny...</p><p>-----</p><p>We found the old Western Electric phone in the attic and <a href="https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.beatriceco.com%2Fbti%2Fporticus%2Fbell%2Ftelephones-olderthan500.html&psig=AOvVaw2rH114bfMBN4K85A0EaWDP&ust=1621646200679000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCJC26__M2fACFQAAAAAdAAAAABAD" target="_blank">wired</a> the switch hook as a straight key.</p><p> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmW3V_b4njim_fcmeL7jyjeoKpS8Ach3EqFCJzyzSsYgcuChSTkYeVjXr4sDBvH42dJY9ASV7NYEFmVD5n6efvmowNrij43yeZ7WDKFrvZTJwhgyQq7SBwq_pSdM8NyzGlJX2MShrjiFRO/s1600/p2.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1385" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmW3V_b4njim_fcmeL7jyjeoKpS8Ach3EqFCJzyzSsYgcuChSTkYeVjXr4sDBvH42dJY9ASV7NYEFmVD5n6efvmowNrij43yeZ7WDKFrvZTJwhgyQq7SBwq_pSdM8NyzGlJX2MShrjiFRO/w346-h400/p2.jpg" width="346" /></a></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD1g5XZQG8gvQmpbLJQrBNcsTIa9EBaV7n5Zy9yP9go2-Dk9bi13MHF7NiNUzq0nIdGiKxGT99x3Lec2R_o5_SGClyFgwT2_41y5Iyku-45JOjQCH8ddJ6det_vmHEb_APcK71ONSvaqr_/s1600/p1.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1319" data-original-width="1600" height="330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD1g5XZQG8gvQmpbLJQrBNcsTIa9EBaV7n5Zy9yP9go2-Dk9bi13MHF7NiNUzq0nIdGiKxGT99x3Lec2R_o5_SGClyFgwT2_41y5Iyku-45JOjQCH8ddJ6det_vmHEb_APcK71ONSvaqr_/w400-h330/p1.jpg" width="400" /></a></div><br /><p></p><p> -----</p><p>Then we went to 80m where we heard ham radio operator K5JM and decided to "ring" him up. The result; success!!!<br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/p3_-WlB7q5s" width="320" youtube-src-id="p3_-WlB7q5s"></iframe></div>-----<p></p><p>73!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwmGTc67_yi1ZQqHZl1ULsURTt5Eb-of21kydZXmASh6ufP9YJ7NOChb3DPDSvFH6mUnlknWPm2CDufeHoqKBGuPUdFI42vB789gEoFE6GDexSE1J7fd3-f-nrMXQ-c7gVoTfJ0vIuQeBO/s231/p3.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="32" data-original-width="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwmGTc67_yi1ZQqHZl1ULsURTt5Eb-of21kydZXmASh6ufP9YJ7NOChb3DPDSvFH6mUnlknWPm2CDufeHoqKBGuPUdFI42vB789gEoFE6GDexSE1J7fd3-f-nrMXQ-c7gVoTfJ0vIuQeBO/s0/p3.jpg" /></a></div><br /><br /><p></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-10816533563054890882021-05-14T08:24:00.004-05:002023-11-23T21:13:18.259-06:00NanoVNA on QPRGuys Tuner on 10-80m HWEF<p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/EK55yQvevos" width="320" youtube-src-id="EK55yQvevos"></iframe></div><br /> -----<p></p><p>Adjusting the tuning knobs on the <a href="https://qrpguys.com/" target="_blank">QRPGuy</a><a href="https://qrpguys.com/">s</a> tuner and showing their effect with a <a href="https://nanovna.com/" target="_blank">NanoVNA</a>. Antenna is <a href="https://myantennas.com/wp/product/efhw-8010/" target="_blank">10-80m endfed</a>. </p><p>-----</p><p style="text-align: center;"><img border="0" data-original-height="32" data-original-width="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOpRun3GzoFdsd3i3AZ7cEghBO4oTBwrQeYGLuB34nr0XA3147_McI59BfLkbS5W8X29btChOR3_Aj9Z54SWt0wma6AWMzUDMJVdVSb5t0QA5D7mscMm7-DFtl8FPqIVtP1ZL_SySmddh4/s1600/Green45-32x32Line.jpg" /></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-43660951163458381182021-05-11T15:16:00.005-05:002023-11-23T21:13:31.604-06:002m / 70cm Ham Radio Traffic Logger<div class="separator"><p style="margin-left: 1em; margin-right: 1em;"></p></div><p></p><p></p><p><img alt="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYmnOfpJVA2y6GyGkoIOYluMaY2jMoXwGHuCfwkxN8XPYeJUn95zCR6ENM9gJrmd-2vhqYp_0OzWCLDiUItELwP690bjO5wu2y8NSGTZy4fF-TfU84jffUY3ztjd0bSz5hzo35BTHrxpsR/s1600/BT_Logger_Schmatic-793823.JPG" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYmnOfpJVA2y6GyGkoIOYluMaY2jMoXwGHuCfwkxN8XPYeJUn95zCR6ENM9gJrmd-2vhqYp_0OzWCLDiUItELwP690bjO5wu2y8NSGTZy4fF-TfU84jffUY3ztjd0bSz5hzo35BTHrxpsR/w400-h213/BT_Logger_Schmatic-793823.JPG" width="400" /> </p><p></p><p>Is the frequency in use (or <a href="https://www.kb6nu.com/cw-geeks-guide-to-having-fun-with-morse-code-q-signals/" target="_blank">QRL?</a> in Morse Code)? <br /></p><p>-----</p><p>We had a curiosity about how often some of the local ham radio repeaters and the <a href="https://newhams.info/2017/03/08/national-simplex-calling-frequency/" target="_blank">2m calling frequency</a> was being used and decided to put together a rig that could answer the question with real data. <a href="http://www.arrl.org/find-an-amateur-radio-license-class" target="_blank">Ham radio</a> has a lot to do with experimentation and tinkering so we set out on a mission to answer the question with "stuff" we had laying around the shack. </p><p>-----</p><p>Pretty much any newcomer to ham radio has invested $35'ish on a <a href="https://lucky225.medium.com/did-the-fcc-just-make-baofengs-illegal-1fd4ba048194" target="_blank">Baofeng</a> hand held. The little unit is quickly out grown, but it has come in useful time and time again. This project was just another example of it's <a href="http://www.whiskeytangohotel.com/2019/02/ham-radio-home-brew-fox-transmitter.html" target="_blank">unintended usefulness</a>. Also, like most hobbyist there's never a shortage of WiFi friendly <a href="https://www.amazon.com/s?k=esp8266" target="_blank">ESP8266</a>s laying around. Combining the two for an RF activity logger became the objective.</p><p>-----</p><p>And..... it turned out to be pretty easy and didn't even require opening up the Baofeng. Anytime the Baofeng hears a signal the LCD display light is activated. For reasons unknown this presents a voltage spike on the speaker jack. We suspected this could be the case from the loud "pop" that can be heard when using earphones.</p><p>-----</p><p>Here is a look at the signal generated on the speaker jack when the display light gets activated:</p><p><img alt="" height="309" src="data:image/png;base64,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" width="400" /></p><p>Weird, huh? Oh well, we can use that to make the project dead simple. Just tune the Baofeng to the frequency of interest and let the rig run and log any traffic that hit the antenna.<br /></p><p>-----</p><p>The schematic at the top of the page shows how we feed the speaker signal into the analog input (A0) of the ESP8266. To tame the 5 volt signal going into the ESP8266 two diodes are placed back to back. That's it. The ESP8266 is programmed to update a Google Drive Sheet via an IFTTT Webhook anytime a voltage is detected. The activity log looks like this and the source code is below that. If you duplicate the project, let us know.</p><p>-----<br /></p><p style="text-align: center;"><img alt="" src="data:image/png;base64,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" /></p><p>-----<br /></p><p>/*<br /> * Baofeng Traffic Logger<br /> * MAY2021<br /> * WhiskeyTangoHotel.Com<br /> * <br /> * Logs to Google Sheet is traffic is dectected on BF HT Radio !!! <br /> * by monitoring a voltage on the speaker output. On traffic the !!!<br /> * BF display lights and creates a voltage on the speaker jack !!!<br /> * Since no transit, does not require a license, but if you don't !!!<br /> * have a ham license, get one. It's a fun hobby!!! !!! <br /> * See: http://www.arrl.org/getting-licensed !!!<br /> * <br /> * uC setting for Ardunio IDE (ESP8266 with WiFI)<br /> * NodeMCU 1.0 (ESP-12E Module), 80MHz, 921600, 4M (3M SPIFFS)<br /> * <br />*/<br /><br />// For the Wireless<br />#include <ESP8266WiFi.h><br /><br />// WiFi Connection Information<br />const char* ssid = "yourSSID"; // PRIVATE: Enter your personal setup information.<br />const char* password = "yourpassword"; // PRIVATE: Enter your personal setup information.<br /><br />// IFTTT Information for WebHook widget<br />String MAKER_SECRET_KEY = "yourIFTTTkey"; // PRIVATE: Enter your personal setup information. Your IFTTT Webhook key here<br />String TRIGGER_NAME_google_drive = "yourIFTTTWebHookTriggerName"; // this is the Maker IFTTT trigger name for google drive spreadsheet logging<br />String url_google_drive; // url that gets built for the IFTTT Webhook logging to google drive spreadsheet<br />String Status ="Program_Started....."; // Status payload for Google Sheet. We log all starts and reboots<br />const char* host = "maker.ifttt.com";<br /><br />// Define ESP8266 pins<br />const int led = 2; // Blue on board LED is on PIN-D4 (GPIO2) for this NoderMCU 1.0 ESP8266. Blink it between reads<br />const int analogInPin = A0; // ESP8266 Analog Pin ADC0 = A0<br /><br />int sigValue = 0; // value to determine if a signal is detected<br /><br />// Program control variables<br />int logging = 1; // If 1 then send SMS. Any other value (0) turns it off. For debug, typically would be set = 1<br /><br />void setup(void){ // This setup code is run once.<br /> pinMode(led, OUTPUT); // set up the onboard Blue LED pin as an output. <br /> Serial.begin(115200); // turn on the serial monitor for debug<br /><br /> // wait until serial port opens for native USB devices<br /> while (! Serial) {<br /> delay(10);<br /> }<br /> <br /> // Is the WiFi working?<br /> WiFi.begin(ssid, password);<br /> Serial.println("");<br /> // Wait for connection<br /> while (WiFi.status() != WL_CONNECTED) {<br /> Serial.print("Trying to connect to ");<br /> Serial.print(ssid);<br /> Serial.print(" on ");<br /> Serial.print(WiFi.localIP());<br /> Serial.println(" ");<br /> for (int x = 0; x < 20; x++) { // <br /> digitalWrite(led, !digitalRead(led)); // toggle state of the on board blue LED. Shows program is trying to WiFi connect<br /> //Serial.println("Server Start blink loop....");<br /> delay(50); <br /> } // endfor WiFi blink connect<br /> }<br /> Serial.print("Connected to ");<br /> Serial.println(ssid);<br /> Serial.println(WiFi.localIP());<br /><br /> for (int x = 0; x < 10; x++) { // 5 slow LED blinks to slow WIFI Connected. <br /> digitalWrite(led, !digitalRead(led)); // toggle state of the on board blue LED.<br /> Serial.println("WIFI is Connected....");<br /> delay(500); } // endif for WIFI Connected blink <br /><br /> // Use WiFiClient class to create TCP connections for WiFi logging<br /> WiFiClient client;<br /> const int httpPort = 80;<br /> if (!client.connect(host, httpPort)) {<br /> Serial.println("connection failed"); // Boo!!!<br /> return; <br /> }<br /><br /> // Trigger the IFTTT Webhook Channel to update a Google sheet at program start.<br /> // This can help log power outs, etc. For first run we defined String Status for identify a startup condition.<br /> // Create the request for IFTTT google drive<br /> url_google_drive = "https://maker.ifttt.com/trigger/" + TRIGGER_NAME_google_drive + "/with/key/" + MAKER_SECRET_KEY + "?value1=" + String(Status);<br /> Serial.println(" "); <br /> Serial.println("Status: Google Sheet update done with trigger:");<br /> Serial.println (url_google_drive);<br /> Serial.println(" "); <br /> <br /> // This sends the request to the IFTTT server<br /> client.print(String("POST ") + url_google_drive + " HTTP/1.1\r\n" +<br /> "Host: " + host + "\r\n" + <br /> "Connection: close\r\n\r\n"); <br /> delay(500); // Delay for web traffic; maybe not required. <br /><br /> // Read all the lines of the reply from server and print them to Serial<br /> while(client.available()){<br /> String line = client.readStringUntil('\r'); }<br /><br />}<br /><br /><br />void loop(void){ // Loop until the Dallas Cowboys win a Super Bowl<br /> <br /> sigValue = analogRead(analogInPin);<br /> <br /> // For Degug print SigVal readings in the Serial Monitor<br /> //Serial.println(sigValue);<br /><br /> // The blue onboard LED will SLOW blink between to show prog is 'running'.<br /> // FAST blink when sig is dectected.<br /> digitalWrite(led, !digitalRead(led)); // toggle state of the on board blue LED.<br /> <br /> if (sigValue > 500) { // Threshold may need adjusting. Voltage on speaker jack detected. We have a signal<br /> Serial.println("!!!_Signal_Detected_!!!"); <br /> Serial.println(" ");<br /> <br /> if (logging == 1) { // is Google Sheet logging turned on? <br /> Serial.println("***** Logging is ON *****");<br /> String Status = "!!!_Signal_Detected_!!!";<br /> // Set up IFTTT Webhook Channel to update the Google Sheet. <br /> // Use WiFiClient class to create TCP connections for IFTTT<br /> WiFiClient client;<br /> const int httpPort = 80;<br /> if (!client.connect(host, httpPort)) {<br /> Serial.println("connection failed");<br /> return; <br /> }<br /> <br /> // Create the request for IFTTT google drive<br /> url_google_drive = "https://maker.ifttt.com/trigger/" + TRIGGER_NAME_google_drive + "/with/key/" + MAKER_SECRET_KEY + "?value1=" + String(Status);<br /> <br /> // This sends the request to the IFTTT server<br /> client.print(String("POST ") + url_google_drive + " HTTP/1.1\r\n" +<br /> "Host: " + host + "\r\n" + <br /> "Connection: close\r\n\r\n"); <br /> delay(500); // Delay for web traffic; maybe not required. <br /> <br /> // Read all the lines of the reply from server and print them to Serial<br /> while(client.available()){<br /> String line = client.readStringUntil('\r'); }<br /> <br /> Serial.println("Status: Google Sheet update done with trigger:");<br /> Serial.println(url_google_drive);<br /> Serial.println(" ");<br /> <br /> // Fast blink the blue onboard LED to show sig was dectected and delay for flood control <br /> for (int x = 0; x < 600; x++) { // x = 20 for ~ 1 sec, x = 100 for ~5 sec.....<br /> digitalWrite(led, !digitalRead(led)); // toggle state of the on board blue LED<br /> delay(50); <br /> } // endfor delay/blink<br /> <br /> Serial.println("-------------------------------------");<br /> Serial.println("Waiting for signal... ");<br /> <br /> } else {<br /> <br /> Serial.println("Logging is OFF.");<br /> Serial.println(" ");<br /> } // endif/else logging <br /><br /><br /> <br /> } <br /> delay(250); // Delay for onboard blue LED Blink shows program running<br /> <br />} // void loop until Cowboys win Super Bowl</p><p>-----</p><p style="text-align: center;"><img border="0" data-original-height="32" data-original-width="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOpRun3GzoFdsd3i3AZ7cEghBO4oTBwrQeYGLuB34nr0XA3147_McI59BfLkbS5W8X29btChOR3_Aj9Z54SWt0wma6AWMzUDMJVdVSb5t0QA5D7mscMm7-DFtl8FPqIVtP1ZL_SySmddh4/s1600/Green45-32x32Line.jpg" /></p><p></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.comtag:blogger.com,1999:blog-6678228486064631133.post-44516627491540249352021-01-20T08:51:00.015-06:002021-01-29T10:59:02.032-06:00Flex Radio Turned Boat Anchor<div class="separator" style="text-align: center;"><p><img border="0" data-original-height="333" data-original-width="1461" height="91" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZAYrYfNik3kZNTanUt7bxeduaZ5QUI8LbcLkWh0qfqt8oX1ids4ngyom_01Iv_JHRx4ERCrjTCEEpPclBDyGohQ82IugubnqcpPayugTfllKoACmH3G8DUawmvTwpyMGB4qWPh85uoztn/w400-h91/Capture.JPG" width="400" /></p><p><i><b>Have you ever wanted the nostalgic sound of a vintage ham radio rig only to be stuck with an expensive modern transceiver? </b></i><br /></p></div><p>-----</p><p></p><p style="text-align: left;">Note: As presented this project requires a <a href="http://www.arrl.org/licensing-education-training" target="_blank">FCC Amateur Radio license</a>. Amateur Radio is about experimentation. Even still you must be versed in the <a href="http://www.arrl.org/band-plan" target="_blank">band plan</a>, stay in accordance to FCC
Amateur Radio rules in FCC Section 97, and probably a few other things. That said, let's continue....<br />
----- <br /></p><p style="text-align: left;">The <a href="https://www.flexradio.com/products/flex-6400-signature-series-sdr-transceiver/" target="_blank">Flex Radio 6400</a> is an amazing state of the art ham radio transceiver with so many modern bells and whistles than no normal human could ever get around to using them all. But, sometimes you long to send out that relaxing and warm sound that could only be achieved from a vintage "<a href="https://boatanchornet.com/" target="_blank">boat anchor</a>" radio. A signature trademark of these rigs is their inability to hold steady on a frequency. This results in frequency <a href="https://en.wikipedia.org/wiki/Frequency_drift" target="_blank">drift</a>. This 'feature' is lost in modern rigs like the Flex Radio. So what's a modern ham to do when that vintage sound is desired?</p><p style="text-align: left;">-----</p><p style="text-align: left;">The Flex Radio is a <a href="https://en.wikipedia.org/wiki/Software-defined_radio" target="_blank">SDR</a>; think powerful computer turned radio. Flex allows <a href="https://www.flexradio.com/api/works-with-flex/" target="_blank">third party applications</a> to interface with the radio to make it even more powerful. One such program is <a href="https://www.mkcmsoftware.com/Flex/Index">FRStack</a> . One of FRStack's many many features makes it easy to use API calls to control and configure the Flex Radio. We wrote a simple Python script to have the Flex Radio simulate a drifting vintage ham radio during transmit. We really don't recommend using this application; it's just stupid. Our goal was to experiment with the APIs when the idea hit us. </p><p style="text-align: left;">-----</p><p style="text-align: left;"> Here is a demo of the Flex Radio transmitting CW with the DriftyFlex script:<br /></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/3LvwzLSGyhU" width="320" youtube-src-id="3LvwzLSGyhU"></iframe></div><p style="text-align: left;">-----</p><p style="text-align: left;">Here is the short DriftyFlex Python script:</p><p style="text-align: left;"># DriftyFlex.py JAN2021<br /># Python script to make the Flex Radio drift <br /># like that vintage rig you always wanted.<br />#<br /># WhiskeyTangoHotel.Com<br /><br /># Simple novelty example of controlling <br /># a Flex Radio via FRStack<br /><br /># FRStack is an amazing program with 100s of features that<br /># are a million times more useful than this stupid example.<br /># See: https://www.mkcmsoftware.com/Flex/Index<br /><br />import urllib.request<br />import time<br />import random<br /><br /># Define initial XIT offset XIT (0 is suggested)<br />XIT = 0<br /><br /># Define amount of XIT SHIFT (or drift) per loop<br />SHIFT = 5 # in Hz<br /><br /># Define MAX_XIT (or drift) so things don't get too out of control<br />MAX_XIT = 300 # in Hz<br /><br /># Define how often to simulate a new drift<br />DELAY = .1 # in seconds<br /><br /># turn on XIT mode<br />urllib.request.urlopen('http://localhost:13522/api/ActiveSlice/XIT?param=1')<br /><br />print ( 'Drifty Flex endlesssssss loop.' )<br />while True: <br /> DRIFT = (random.randint(-SHIFT, SHIFT)) <br /><br /> NEW_XIT = XIT + DRIFT<br /><br /> if abs(NEW_XIT) > MAX_XIT: # Maintain drift constraints <br /> NEW_XIT = XIT - DRIFT<br /> <br /> url = 'http://localhost:13522/api/ActiveSlice/XITFREQ?param=' + str(NEW_XIT)<br /> urllib.request.urlopen( url )<br /><br /> print ( 'Current drift is: ', NEW_XIT, ' Hz.' )<br /> XIT = NEW_XIT<br /> <br /> time.sleep(DELAY)<br /> # end while loop </p><p style="text-align: left;">-----</p><div class="separator" style="clear: both; text-align: center;"><img border="0" data-original-height="32" data-original-width="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFY6n3i47FmcUjbD7Ngfv85rCUxR_stdT4X5n8nRh5kFWgE3aPJnQyZHsm9dKyWw-PyDHiRl2kmn-3Sobn74IIRvBgpSMAbee4Hof7SWTsiq-mQb_YqBQE8T7aX9zL7xZDDvj7mfQOs8re/s0/imageonline-co-invertedimage.jpg" /></div><p style="text-align: left;"><br /></p>WhiskeyTangoHotel.Comhttp://www.blogger.com/profile/10155180153128862834noreply@blogger.com