<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.element14.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Forum - Recent Threads</title><link>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum</link><description /><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><lastBuildDate>Fri, 17 Jul 2026 17:31:46 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum" /><item><title>OpenDFM: A utility for getting the logs</title><link>https://community.element14.com/thread/57105?ContentTypeID=0</link><pubDate>Thu, 16 Jul 2026 03:50:18 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:a532ec93-accb-4bea-82dd-678a5634e5c4</guid><dc:creator>SensoredHacker0</dc:creator><slash:comments>2</slash:comments><comments>https://community.element14.com/thread/57105?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57105/opendfm-a-utility-for-getting-the-logs/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Whose going to carry the boats?? &lt;br /&gt;Who is going to carry the logs?&lt;br /&gt;&lt;br /&gt;I work with IDEC PLCs. They have some software which was probably really nice in 1982.&amp;nbsp;&lt;br /&gt;yesterday, I was so infuriated when a log download process kept failing, I went off and made my own utility to get logs.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The general gist is that when the OEM supported software looses connection, you loose the entire set of data you had been downloading.&amp;nbsp;&lt;br /&gt;many of our systems are thousands of miles away, on questionably reliable networks. While you might see 20Kpbs down, locally, remote connections even for small files can take hours at 2-4KBps. then to loose it. .. OMG. or the syntax is convoluted AF, or theres no direct way to automate the process via the OEM supported software.&lt;br /&gt;&lt;br /&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/7367.Confussion.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Well last night, I had enough, and delved into the internal operation of remote SD Card reading, via Maintenance Protocol.&lt;/strong&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="mcetoc_1jtk56ie60"&gt;&lt;span&gt;How OpenDFM Works&lt;/span&gt;&lt;/h3&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;OpenDFM is a multithreaded graphical client for accessing the SD-card filesystem exposed by IDEC PLCs through the maintenance protocol over TCP.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Each PLC is represented by an independent tab and session object. A session stores the controller&amp;rsquo;s IP address, TCP port, PLC device identifier, current remote working directory, local destination path, cached directory-entry metadata, active transfer state, and synchronization primitives used to prevent overlapping protocol transactions. &lt;br /&gt;Ethernet maintenance communication normally uses TCP port 2101.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;At the transport layer, OpenDFM creates a TCP socket to the PLC and exchanges IDEC maintenance-protocol frames. A conventional request contains:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;&lt;code dir="ltr"&gt;&lt;span&gt;ENQ&lt;/span&gt;&lt;/code&gt;&lt;span&gt; control byte &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;0x05&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;two-byte device identifier, commonly &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;FF&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;continuation flag&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;command and subcommand&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;command-specific payload&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;XOR-based block-check character&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;carriage-return terminator &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;0x0D&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;The PLC normally responds with an &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;ACK&lt;/span&gt;&lt;/code&gt;&lt;span&gt; frame beginning with &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;0x06&lt;/span&gt;&lt;/code&gt;&lt;span&gt;, followed by the responding device number, completion status, returned data, BCC, and terminator. Negative protocol responses are decoded separately from TCP errors, socket timeouts, truncated frames, and malformed payloads.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;SD-card access uses the PLC&amp;rsquo;s extended &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;FR&lt;/span&gt;&lt;/code&gt;&lt;span&gt; filesystem command family. Directory enumeration is stateful. OpenDFM first submits a remote path, such as:&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;code dir="ltr"&gt;&lt;span&gt;/FCDATA01/DATALOG/1-secLog&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;The path-open request includes the path length and a NUL-terminated path name. The PLC returns the number of directory entries available in the opened directory context. OpenDFM then issues successive entry-read requests, using the observed &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;FR20&lt;/span&gt;&lt;/code&gt;&lt;span&gt; sequence, until every directory record has been retrieved. The final request uses the terminating form of the command so the PLC can release the active enumeration context.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Each returned directory record is parsed into structured metadata. Depending on the record format, this includes:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;&lt;span&gt;file-versus-directory type&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;filename length&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;filename bytes&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;file size&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;FAT-style modification date&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;FAT-style modification time&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;additional flags or reserved fields&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;The date and time fields are decoded from their packed filesystem representation. File sizes are converted from the protocol&amp;rsquo;s hexadecimal ASCII representation into native integers. Filenames are decoded without treating path separators as local filesystem separators until the remote entry has been validated.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;The GUI does not directly display raw protocol responses. Parsed entries are converted into application-level directory-entry objects and inserted into a tree or list model. Directory entries can therefore be sorted, selected, recursively traversed, and associated with transfer actions without repeatedly reparsing the original response bytes.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;File retrieval is also stateful and block-oriented. OpenDFM opens the selected remote file, determines or receives its expected length, and repeatedly requests the next block. Returned blocks contain protocol framing plus a binary or encoded data payload. The application removes framing, validates the response, extracts the payload, and appends it to a local output stream.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;The local file is normally written incrementally rather than buffering the complete remote file in memory. This allows large logs to be downloaded with a bounded memory footprint. The transfer loop tracks:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;&lt;span&gt;expected remote file length&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;bytes requested&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;bytes received&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;bytes committed to disk&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;current remote offset&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;retry state&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;elapsed transfer time&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;effective transfer rate&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;A transfer is considered complete only when the protocol reports end-of-file or the accumulated byte count matches the size reported during directory enumeration. A short response, zero-length block before the expected end, invalid BCC, unexpected command status, or socket disconnect is treated as a transfer failure rather than silently producing a truncated file.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Folder downloads are implemented as client-side recursive traversal. The PLC provides only the contents of one opened directory at a time. OpenDFM therefore performs a depth-first or breadth-first walk:&lt;/span&gt;&lt;/p&gt;
&lt;ol start="1" data-spread="false"&gt;
&lt;li&gt;&lt;span&gt;Enumerate the selected remote directory.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Create the matching local directory.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Download each regular file.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Queue or recursively enter each sub-directory.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Repeat until no unvisited directories remain.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;The remote path is normalized independently from the local path. This prevents a PLC filename containing parent-directory components, absolute-path syntax, or unexpected separators from escaping the selected local download directory.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Because the PLC&amp;rsquo;s filesystem commands maintain implicit remote state, command ordering is significant. A directory-open operation establishes the context used by subsequent directory-entry reads. Likewise, a file-open command establishes the context used by following block-read commands. If two operations against the same PLC were interleaved, one command sequence could replace the context required by the other.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;OpenDFM therefore serializes filesystem transactions per PLC session. A tab may have only one active directory enumeration, file transfer, or recursive operation at a time. This restriction is not primarily due to Ethernet bandwidth; it is required to preserve the PLC&amp;rsquo;s stateful command sequence.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Concurrency is applied between PLC sessions rather than within one PLC session. Each tab has its own socket activity, protocol state, command lock, transfer worker, and progress reporting path. As a result, PLC A may download a log while PLC B enumerates a directory, provided the two operations use separate sessions.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Blocking socket and disk operations are executed in worker threads so they do not run inside the GUI event loop. The workers publish status updates through a thread-safe queue or framework signal mechanism. The main interface thread consumes those updates and modifies widgets, progress bars, transfer labels, and tab state. GUI objects are not directly manipulated from network workers.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;A typical operation therefore crosses several layers:&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;code dir="ltr"&gt;&lt;span&gt;GUI action&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;-&amp;gt;&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;PLC session controller&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt;&amp;nbsp;&lt;code dir="ltr"&gt;&lt;span&gt;filesystem operation&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;code&gt;-&amp;gt;&amp;nbsp;&lt;/code&gt;&lt;code dir="ltr"&gt;&lt;span&gt;maintenance-protocol command builder&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt; &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;TCP transport&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt; &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;PLC response parser&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt; &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;directory-entry or file-block decoder&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt; &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;local filesystem writer&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt; &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;thread-safe progress update&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt; &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;GUI model refresh&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Error handling is divided by layer. Connection failures identify an unreachable PLC. Protocol failures identify a syntactically valid exchange rejected by the controller. Filesystem failures identify invalid paths, unavailable SD cards, changed directory contents, or interrupted remote file state. Local I/O failures identify permission errors, full disks, invalid filenames, or failed writes.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;OpenDFM can also verify that the SD card is mounted before performing filesystem operations by reading the PLC&amp;rsquo;s SD-card status devices. On FC6A controllers, special relay &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;M8070&lt;/span&gt;&lt;/code&gt;&lt;span&gt; indicates SD-card mount status, while special registers such as &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;D8250&lt;/span&gt;&lt;/code&gt;&lt;span&gt; and &lt;/span&gt;&lt;code dir="ltr"&gt;&lt;span&gt;D8251&lt;/span&gt;&lt;/code&gt;&lt;span&gt; expose total and free SD-card capacity. These checks are separate from directory enumeration but provide an early indication that a browsing or download request is likely to succeed.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In effect, OpenDFM translates a stateful, request-response filesystem interface into a conventional graphical file browser while preserving the strict transaction ordering, response validation, and per-controller isolation required by the PLCs.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/Screenshot-at-2026_2D00_07_2D00_15-19_2D00_47_2D00_57.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a id="" href="https://github.com/FOSSBOSS/OpenDFM" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;https://github.com/FOSSBOSS/OpenDFM&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Are there bugs? HELL YEAH!&lt;br /&gt;Am I going to fix it? hell ye?&lt;br /&gt;&lt;br /&gt;Did I really write this whole thing in one night? LOL NO.&amp;nbsp;&lt;br /&gt;Vid:&lt;br /&gt;[View:https://www.youtube.com/watch?v=CEVq5vb5xj4:640:360]&lt;br /&gt;&lt;br /&gt;Next up:&lt;br /&gt;Decoding the SV1 security protocol into practical utilities.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>RE: OpenDFM: A utility for getting the logs</title><link>https://community.element14.com/thread/236411?ContentTypeID=1</link><pubDate>Fri, 17 Jul 2026 17:31:46 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:14173f7f-7715-4b43-ac62-872c8c410fdf</guid><dc:creator>colporteur</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236411?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57105/opendfm-a-utility-for-getting-the-logs/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&amp;quot;Our need will be our creator&amp;quot; Plato&lt;/p&gt;
&lt;p&gt;It looks like you dug the burr out of the saddle blanket on this one. Hopefully the ride is smooth from here on out.&lt;/p&gt;
&lt;p&gt;I can recall a few &amp;quot;Augh fk-it moments&amp;quot; and just committed to fixing it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: OpenDFM: A utility for getting the logs</title><link>https://community.element14.com/thread/236403?ContentTypeID=1</link><pubDate>Thu, 16 Jul 2026 03:45:40 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0fd24b30-8c8e-48c2-85cc-af84026b2146</guid><dc:creator>kmikemoo</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236403?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57105/opendfm-a-utility-for-getting-the-logs/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I can&amp;#39;t play with it, but I like the concept and execution.&amp;nbsp;&lt;span class="emoticon" data-url="https://community.element14.com/cfs-file/__key/system/emoji/1f44d.svg" title="Thumbsup"&gt;&amp;#x1f44d;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Green Brain - Part III - Water Cannon Chaos</title><link>https://community.element14.com/thread/236214?ContentTypeID=1</link><pubDate>Tue, 23 Jun 2026 19:53:22 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:09a6b462-3705-4ea0-a223-3dc7be69d85a</guid><dc:creator>DAB</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236214?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57045/green-brain---part-iii---water-cannon-chaos/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Nice update on a fun project.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Green Brain - Part III - Water Cannon Chaos</title><link>https://community.element14.com/thread/57045?ContentTypeID=0</link><pubDate>Sat, 20 Jun 2026 14:39:25 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:dc56b522-7378-4dcb-946f-c067cc5d45ec</guid><dc:creator>saramic</dc:creator><slash:comments>4</slash:comments><comments>https://community.element14.com/thread/57045?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57045/green-brain---part-iii---water-cannon-chaos/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I promised a water cannon&amp;nbsp;[emoticon:430192c8113e40579ec1750203f80fde][emoticon:021df5b9678b462da4ec897ab36c19a0]&amp;nbsp;for my plants, so I had to deliver, if only for a forum post.&lt;/p&gt;
&lt;h1 id="recap"&gt;Recap&lt;/h1&gt;
&lt;p&gt;Green Brain&amp;nbsp;[emoticon:e8b48dd11aa142a1bf769add09114643]&amp;nbsp;is the idea of tracking plant nodes via an industrial&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;CAN bus&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to ultimately see which plant needs more water cannon&amp;nbsp;[emoticon:021df5b9678b462da4ec897ab36c19a0].&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/56921/green-brain---part-i---can-bus-introduction" data-e14adj="t"&gt;Green Brain - Part I - CAN bus introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57001/green-brain---part-ii---dev-setup" data-e14adj="t"&gt;Green Brain - Part II - Dev setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-idea-and-the-gear"&gt;the idea and the gear&lt;/h2&gt;
&lt;p&gt;I had the gear for a water cannon. My wife wanted an indoor plant watering system for Christmas so I got her one. But what present is complete without some extra DIY in case I could build one myself. As such I had a few small pumps around. I also had a servo driven X-Y pan and tilt module. How hard can it be to hook that up and make a water cannon.&lt;/p&gt;
&lt;p&gt;As an aside, I am also super grateful for a bunch of gear that Element 14 sent to me as a selected challenger.&lt;/p&gt;
&lt;p&gt;&lt;img style="cursor:zoom-in;display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260620_5F00_on_5F00_the_5F00_line_5F00_challengers_5F00_kit.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The pressure is on to use as much of this gear as I can.&lt;/p&gt;
&lt;h2 id="water-and-electronics"&gt;Water and electronics&lt;/h2&gt;
&lt;p&gt;Well there was a lot of learning to be had:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;no matter how well you think you seal things - water will still leak. Although I didn&amp;rsquo;t go all out with silicon, I thought that tight fitting vinyl tubing, electrical tape and relatively low water pressure would be OK &amp;mdash; it was not&lt;/li&gt;
&lt;li&gt;Water brings in fluid dynamics and things like head, flow, nozzle shapes and the like. Clearly my pump could not initially pump up 300mm of head so I moved the motor closer to the nozzle. There would also be time required to refill the tubing up to the nozzle, as once the pump stops the tube empties. Gardening nozzles from a local hardware are only so good at firing a stream of water&lt;/li&gt;
&lt;li&gt;Even small hoses can be stiff enough to move the servos&lt;/li&gt;
&lt;li&gt;Pan and Tilt movement requires some planning in how everything interacts. My platform got tangled in the hose, and the wiring also got stuck every so often for the servos as everything moved around&lt;/li&gt;
&lt;li&gt;Water is heavy and the motion of water in a hose can change the weight balance of everything and move things around&lt;/li&gt;
&lt;li&gt;With all this chaos, I was not bringing the UNO Q anywhere near this water cannon&lt;/li&gt;
&lt;li&gt;Noise, pump motors can produce noise, and that noise can be picked up by the servos and move them haywire around the place&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It was this last point that really killed this feature. I had removed the servo library entirely, moved the pump power onto a completely separate circuit isolated by a relay &amp;mdash; and still the servos would pan to the right and tilt to the top. Stripping down to a pure diagnostic sketch (no servo code at all) revealed the culprit: the servo signal pins were floating high-impedance inputs, acting as antennas and picking up the pump motor&amp;rsquo;s EMI directly? maybe? &lt;strong&gt;&lt;span style="color:#333399;font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;&amp;macr;_(ツ)_/&amp;macr;&lt;/span&gt;&lt;/strong&gt;. Even with no code driving them, the servo controllers saw enough noise to chase a position. I ran out of steam getting this to behave reliably with the full mechanical assembly.&lt;/p&gt;
&lt;p style="display:flex;width:100%;"&gt;&lt;img style="cursor:zoom-in;max-height:360px;max-width:49%;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260620_5F00_pan_5F00_and_5F00_tilt_5F00_cannon.gif" /&gt; &lt;img style="cursor:zoom-in;max-height:360px;max-width:49%;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260620_5F00_water_5F00_cannon_5F00_shoot_5F00_right_5F00_and_5F00_up.gif" /&gt;&lt;/p&gt;
&lt;p&gt;[View:/cfs-file/__key/communityserver-discussions-components-files/453/20260620_5F00_palying_5F00_around_5F00_with_5F00_firing_5F00_the_5F00_cannon.mp4:640:360]&lt;/p&gt;
&lt;p&gt;I was hoping to re-use the water cannon as a dog deterrent from scratching a door. I think neither the dogs nor the plants will be seeing any water cannon any time soon.&lt;/p&gt;
&lt;p&gt;&lt;img style="cursor:zoom-in;display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260620_5F00_water_5F00_cannon.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The only clever things I did was write to EEProm to see if a reboot was happening when the pump kicked in and use the Omega temperature probe to hold the tube that fed water to the pump.&lt;/p&gt;
&lt;h2 id="next"&gt;Next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I have some MAX6675 which would be cool to connect to the K-Type Thermocouples&lt;/li&gt;
&lt;li&gt;there is the Omega Temperature probe&lt;/li&gt;
&lt;li&gt;and I am hoping to at least visualise a little bit of this on NI LabView&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;oh and there is like 24 hours left&amp;nbsp;[emoticon:112d628d71ee42569896013ddf370112]&lt;/p&gt;
&lt;h2 id="source"&gt;Source&lt;/h2&gt;
&lt;p&gt;&lt;a id="" href="https://github.com/saramic/green-brain" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;https://github.com/saramic/green-brain&lt;/a&gt;&lt;/p&gt;</description></item><item><title>SolarSense - Part 8 - Interfacing Humidity and Temperature</title><link>https://community.element14.com/thread/57046?ContentTypeID=0</link><pubDate>Sun, 21 Jun 2026 05:43:13 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:4db1258e-89ee-4430-b12d-99fa48525283</guid><dc:creator>arvindsa</dc:creator><slash:comments>2</slash:comments><comments>https://community.element14.com/thread/57046?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57046/solarsense---part-8---interfacing-humidity-and-temperature/rss?ContentTypeId=0</wfw:commentRss><description>&lt;h2 id="mcetoc_1jqbvjvms0"&gt;Recap:&lt;/h2&gt;
&lt;p&gt;I&amp;#39;m building a smart solar monitoring system that uses three panels with a clean reference to eliminate weather effects and directly measure dust-induced losses in real time. One panel stays pristine as a baseline, and comparing the two under identical sky conditions gives a performance ratio that reveals soiling immediately. The goal is to use environmental sensors and edge AI to predict exactly when cleaning is needed, before efficiency drops enough to impact revenue. This beats fixed-schedule cleaning or waiting for output to degrade.Also this is complementary to my Master&amp;#39;s thesis of a minute Shape memory Alloy based solar panel cleaning robot&lt;/p&gt;
&lt;p&gt;Previous posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57013/solarsense---part-1---introduction-the-poc-built-and-the-plan" data-e14adj="t"&gt;SolarSense - Part 1 - Introduction, The POC Built and The Plan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57018/solarsense---part-2---can-arduino-can" data-e14adj="t"&gt;SolarSense - Part 2 - Can Arduino CAN?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57020/solarsense---part-3---pcb-schematics-walkthrough" data-e14adj="t"&gt;SolarSense - Part 3 - PCB Schematics Walkthrough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57025/solarsense---part-4---can-protocol-deep-dive-and-implementation" data-e14adj="t"&gt;SolarSense - Part 4 - CAN Protocol Deep Dive and Implementation&lt;/a&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57025/solarsense---part-4---can-protocol-deep-dive-and-implementation" data-e14adj="t"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57030/solarsense---part-5---making-an-live-dashboard-using-lab-view" data-e14adj="t"&gt;SolarSense - Part 5 - Making an Live Dashboard using Lab View&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57039/solarsense---part-6---reading-the-heat-at-k-type-thermocouple-using-max31855" data-e14adj="t"&gt;SolarSense - Part 6 - Reading the Heat at K Type Thermocouple using MAX31855.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;S&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57041/solarsense---part-7---reading-the-sky---uv-sensor-interface-on-stm32" data-e14adj="t"&gt;olarSense - Part 7 - Reading the Sky - UV Sensor Interface on STM32&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Time is short, So i will jump straight into the points and avoid good formatting of this post. I have SEN66, BMP280 in my board and yet why am i using another sensor for Relative Humidity and Temperature?&amp;nbsp;&amp;nbsp;I needed something that could live away from the PCB, immune to internal heats etc,&amp;nbsp; a probe on a cable, pointed at the actual outdoor air, unaffected by what is happening inside the enclosure. The Omega HX94C is exactly that. It is an industrial-grade transmitter, NEMA 4 rated, with two completely independent 4-20 mA current loops: one for relative humidity (0&amp;ndash;100 %RH at 4&amp;ndash;20 mA) and one for temperature (0&amp;ndash;100 &amp;deg;C at 4-20 mA). You run a pair of wires out to it, excite the loop from your rail voltage, and measure the current. The Current based measurement means, length of wire will not matter, as opposed to voltage based measurement where the voltage will drop along the wire.&lt;/p&gt;
&lt;p&gt;&lt;img style="display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260621_5F00_094222_2800_1_2900_.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260621_5F00_103531_2800_1_2900_.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;I am using a&amp;nbsp;TPS61040DBVT boost converter to get a 12V, HX94C requires excitation voltage of 6-36V for its working. Next is choosing the shunt resistor to measure the full range of 4-20mA. At 150Ohm ressitor&lt;/p&gt;
&lt;p&gt;At&amp;nbsp; 4 mA: V = 0.004 &amp;times; 150 = 0.60 V&lt;br /&gt;At 20 mA: V = 0.020 &amp;times; 150 = 3.00 V&lt;/p&gt;
&lt;p&gt;This is within the range of STM32&amp;#39;s ADC&lt;/p&gt;
&lt;h2 id="mcetoc_1jrkanufe0"&gt;The Firmware&lt;/h2&gt;
&lt;p&gt;Just like my previous post of the UV sensor, I am simply reading the ADC values for both using&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:b5062445-537b-4569-88d7-3fdd4acf230e:type=c_cpp&amp;text=static%20HAL_StatusTypeDef%20adc_read_mv%28HX94C_t%20%2Adev%2C%20uint32_t%20channel%2C%20uint32_t%20%2Amv%29%0A%7B%0A%20%20%20%20ADC_ChannelConfTypeDef%20c%20%3D%20%7B0%7D%3B%0A%20%20%20%20c.Channel%20%20%20%20%20%20%3D%20channel%3B%0A%20%20%20%20c.Rank%20%20%20%20%20%20%20%20%20%3D%20ADC_REGULAR_RANK_1%3B%0A%20%20%20%20c.SamplingTime%20%3D%20ADC_SAMPLETIME_640CYCLES_5%3B%20%20%2F%2A%20high%20source%20impedance%20%2A%2F%0A%20%20%20%20c.SingleDiff%20%20%20%3D%20ADC_SINGLE_ENDED%3B%0A%20%20%20%20c.OffsetNumber%20%3D%20ADC_OFFSET_NONE%3B%0A%0A%20%20%20%20HAL_StatusTypeDef%20st%20%3D%20HAL_ERROR%3B%0A%20%20%20%20if%20%28HAL_ADC_ConfigChannel%28dev-%3Ehadc%2C%20%26c%29%20%3D%3D%20HAL_OK%20%26%26%0A%20%20%20%20%20%20%20%20HAL_ADC_Start%28dev-%3Ehadc%29%20%3D%3D%20HAL_OK%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20%28HAL_ADC_PollForConversion%28dev-%3Ehadc%2C%20ADC_TIMEOUT_MS%29%20%3D%3D%20HAL_OK%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20raw%20%3D%20HAL_ADC_GetValue%28dev-%3Ehadc%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2Amv%20%3D%20%28raw%20%2A%20HX94C_VDDA_MV%29%20%2F%20ADC_FULL_SCALE%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20st%20%3D%20HAL_OK%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20HAL_ADC_Stop%28dev-%3Ehadc%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20st%3B%0A%7D]\&lt;/p&gt;
&lt;p&gt;Once I have the millivolt reading from the shunt, the math is straightforward:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:1037263f-8d25-4200-be6e-f8a4c296006e:type=c_cpp&amp;text=%2F%2A%20I%28%C2%B5A%29%20%3D%20V%28mV%29%20%2F%20Rsense%28%CE%A9%29%20%C3%97%201000%20%2A%2F%0Aint32_t%20i_rh%20%3D%20%28int32_t%29%28rh_mv%20%2A%201000U%20%2F%20HX94C_RSENSE_OHMS%29%3B%0Aint32_t%20i_t%20%20%3D%20%28int32_t%29%28t_mv%20%20%2A%201000U%20%2F%20HX94C_RSENSE_OHMS%29%3B]&lt;/p&gt;
&lt;h2 id="mcetoc_1jrkb1iau1"&gt;The results&lt;/h2&gt;
&lt;p&gt;&lt;img style="display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:900px;" alt=" " src="https://community.element14.com/resized-image/__size/1800x720/__key/communityserver-discussions-components-files/453/Screenshot_5F00_2026_2D00_06_2D00_21_5F00_10_2D00_16_2D00_56.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The HX94C contributes six tokens: hx_ok (both loops healthy), hx_rh (tenths of a %RH), hx_t (centi-&amp;deg;C), hx_rhi / hx_ti (the two loop currents in tenths of a mA, kept for diagnostics) and hx_flt (the fault bitmask). Decoding the HX94C fields across those samples:&amp;nbsp;&lt;/p&gt;
&lt;figure class="table-figure"&gt;
&lt;table border="1"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;hb&lt;/th&gt;
&lt;th&gt;RH loop&lt;/th&gt;
&lt;th&gt;RH&lt;/th&gt;
&lt;th&gt;Temp loop&lt;/th&gt;
&lt;th&gt;Temp&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;15.5 mA&lt;/td&gt;
&lt;td&gt;71.7 %&lt;/td&gt;
&lt;td&gt;8.3 mA&lt;/td&gt;
&lt;td&gt;26.8 &amp;deg;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;15.7 mA&lt;/td&gt;
&lt;td&gt;72.8 %&lt;/td&gt;
&lt;td&gt;8.4 mA&lt;/td&gt;
&lt;td&gt;27.8 &amp;deg;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;15.0 mA&lt;/td&gt;
&lt;td&gt;68.7 %&lt;/td&gt;
&lt;td&gt;8.7 mA&lt;/td&gt;
&lt;td&gt;29.2 &amp;deg;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;15.5 mA&lt;/td&gt;
&lt;td&gt;72.1 %&lt;/td&gt;
&lt;td&gt;8.3 mA&lt;/td&gt;
&lt;td&gt;27.0 &amp;deg;C&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/figure&gt;
&lt;p&gt;BTW, hb is heartbeat that comes every 5second&lt;/p&gt;
&lt;h2 id="mcetoc_1jrkb6bqd2"&gt;Final Notes&lt;/h2&gt;
&lt;p&gt;It&amp;#39;s time to submit project, and Will invest time in writing the final post. Feel free to ask questions if i missed anything.&lt;/p&gt;</description></item><item><title>RE: SolarSense - Part 8 - Interfacing Humidity and Temperature</title><link>https://community.element14.com/thread/236207?ContentTypeID=1</link><pubDate>Tue, 23 Jun 2026 14:53:18 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:2ba0cc08-7cc5-48cc-b4a6-8842299dac95</guid><dc:creator>arvindsa</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236207?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57046/solarsense---part-8---interfacing-humidity-and-temperature/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Oh yes, and also its more immune to noise and induction. I&amp;#39;ve have to Appreciate whomsoever chose the sponsored kit. Everything except the ArduinoQ was strictly industrial class. Robust.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: SolarSense - Part 8 - Interfacing Humidity and Temperature</title><link>https://community.element14.com/thread/236206?ContentTypeID=1</link><pubDate>Tue, 23 Jun 2026 12:36:30 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0cc49baf-8d30-4a8f-8376-5b4845b53e7a</guid><dc:creator>saramic</dc:creator><slash:comments>1</slash:comments><comments>https://community.element14.com/thread/236206?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57046/solarsense---part-8---interfacing-humidity-and-temperature/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;nice - I didn&amp;#39;t know about the current measurement and the fact that it is there to allow for longer wires - good learning&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Green Brain - Part IV - Nodes Well That Ends Well</title><link>https://community.element14.com/thread/236191?ContentTypeID=1</link><pubDate>Mon, 22 Jun 2026 05:18:58 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:79ab602f-61b5-4845-bcbb-d7d3f3707b84</guid><dc:creator>arvindsa</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236191?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57049/green-brain---part-iv---nodes-well-that-ends-well/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Love the title&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Green Brain - Part IV - Nodes Well That Ends Well</title><link>https://community.element14.com/thread/57049?ContentTypeID=0</link><pubDate>Sun, 21 Jun 2026 14:40:22 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:64f9f1cb-e7c4-41e0-b008-e1c8cebb8110</guid><dc:creator>saramic</dc:creator><slash:comments>1</slash:comments><comments>https://community.element14.com/thread/57049?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57049/green-brain---part-iv---nodes-well-that-ends-well/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I had built up some proto board nodes for the distributed greenhouse control platform &amp;mdash; it was time to wire them all up together and get them talking. It did not go smoothly&amp;nbsp;[emoticon:98f842990f454422aa6a04953955f9d9].&lt;/p&gt;
&lt;h1 id="recap"&gt;Recap&lt;/h1&gt;
&lt;p&gt;Green Brain&amp;nbsp;[emoticon:e8b48dd11aa142a1bf769add09114643] is the idea of tracking plant  nodes via an industrial&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;CAN bus&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to ultimately see which plant needs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;del&gt;more water cannon&amp;nbsp;[emoticon:021df5b9678b462da4ec897ab36c19a0].&lt;/del&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;well watering.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/56921/green-brain---part-i---can-bus-introduction" data-e14adj="t"&gt;Green Brain - Part I - CAN bus introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57001/green-brain---part-ii---dev-setup" data-e14adj="t"&gt;Green Brain - Part II - Dev setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Green Brain - Part III - Water Cannon Chaos&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="three-nodes-one-bus"&gt;Three nodes, one bus&lt;/h2&gt;
&lt;p&gt;So far I had tested two nodes talking to each other on a work bench. Adding a bunch of twisted pair wiring and a third node to form a proper little network seemed straightforward &amp;mdash; it was far from it.&lt;/p&gt;
&lt;p&gt;The symptoms were baffling. The first two nodes would work, then one of them would drop off and I would have only one node, and sometimes no nodes would appear at all after some time. This went on in circles for a while, not to mention some circuit board issues early on that prevented two boards working altogether.&lt;/p&gt;
&lt;p&gt;&lt;img style="cursor:zoom-in;display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:640px;" src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260621_5F00_all_5F00_nodes_5F00_in_5F00_greenhouse_5F00_and_5F00_a_5F00_plang.jpg" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;All the nodes set up in a greenhouse. You can see they are all connected with twisted pair. Clearly plywood is not the best for a humid greenhouse but I have a future use for the stands&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="problem-1--bad-wiring-and-cold-solder-joints"&gt;Problem 1 &amp;mdash; bad wiring and cold solder joints&lt;/h2&gt;
&lt;p&gt;The first and most humbling issue: bad physical connections.&lt;/p&gt;
&lt;p&gt;Node 1 would print this at startup and hang:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:8df65e7d-b02b-465e-a450-f9bf4d8e919b:type=text&amp;text=ERR%3A%20setBitrate%20failed%20%E2%80%94%20check%20SPI%20wiring]&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I had checked the wiring visually &amp;mdash; it looked fine. But to get a more precise diagnosis I added a register read&amp;nbsp;&lt;/span&gt;&lt;em&gt;before&lt;/em&gt;&lt;span&gt;&amp;nbsp;calling&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;setBitrate&lt;/code&gt;&lt;span&gt;, directly checking the&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;CANSTAT&lt;/code&gt;&lt;span&gt;&amp;nbsp;register on the MCP2515 chip over SPI:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:b044f4fe-7e9d-412d-8f8c-d829a1d69479:type=c_cpp&amp;text=Serial.print%28F%28%22CANSTAT%20after%20reset%3D0x%22%29%29%3B%20Serial.println%28readCanstat%28%29%2C%20HEX%29%3B%0A%2F%2F%20expect%200x80%20%28config%20mode%29%20%E2%80%94%200x00%2F0xFF%20means%20SPI%20not%20working%0Aif%20%28mcp2515.setBitrate%28CAN_500KBPS%2C%20CAN_CLOCK%29%20%21%3D%20MCP2515%3A%3AERROR_OK%29%20%7B%0A%20%20%20%20Serial.println%28F%28%22ERR%3A%20setBitrate%20failed%20%E2%80%94%20check%20SPI%20wiring%22%29%29%3B%0A%20%20%20%20while%20%28true%29%3B%0A%7D%0A]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Where&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;readCanstat()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;does a raw SPI read of register&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;0x0E&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:3bd20c51-cc0d-4108-b291-07c759d16dad:type=c_cpp&amp;text=uint8_t%20readCanstat%28%29%20%7B%0A%20%20%20%20SPI.beginTransaction%28SPISettings%2810000000%2C%20MSBFIRST%2C%20SPI_MODE0%29%29%3B%0A%20%20%20%20digitalWrite%28MCP_CS_PIN%2C%20LOW%29%3B%0A%20%20%20%20SPI.transfer%280x03%29%3B%20%2F%2F%20READ%20instruction%0A%20%20%20%20SPI.transfer%280x0E%29%3B%20%2F%2F%20CANSTAT%20register%20address%0A%20%20%20%20uint8_t%20val%20%3D%20SPI.transfer%280x00%29%3B%0A%20%20%20%20digitalWrite%28MCP_CS_PIN%2C%20HIGH%29%3B%0A%20%20%20%20SPI.endTransaction%28%29%3B%0A%20%20%20%20return%20val%3B%0A%7D%0A]&lt;/p&gt;
&lt;p&gt;What came back:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:160e84d8-f961-4232-afe9-2629ea755ada:type=text&amp;text=CANSTAT%20after%20reset%3D0x0]&lt;/p&gt;
&lt;p&gt;The three possible values tell you exactly what is broken:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CANSTAT&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;0x80&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chip alive, in config mode &amp;mdash; SPI working&amp;nbsp;[emoticon:599cc6d89e2145289084ee73d7cb364b]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;0xFF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MISO floating high &amp;mdash; chip not connected or MISO wire missing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;0x00&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MISO pulled low &amp;mdash; CS not going low, or SCK missing, or a short to GND&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Getting&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;0x00&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;meant the chip was never being selected. After going back with a multimeter and checking continuity on every pin, I found a bad joint on the CS (D10) header pin &amp;mdash; it looked soldered but wasn&amp;rsquo;t making contact. A quick reflow fixed that joint, but&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;0x00&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;persisted. I tried loopback mode (which needs no CAN bus wiring at all &amp;mdash; the chip loops internally) and still got the same result. That ruled out everything external. The MCP2515 chip itself, or its crystal, was dead. As I didn&amp;rsquo;t have a spare module to swap out, I swapped with another node, to confirm the module was working, which it was - so there is an issue in some of my wiring on that node - will fix that before I start watering any plants with this system, for sure .&lt;/p&gt;
&lt;p&gt;The lesson:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;when SPI doesn&amp;rsquo;t work, measure before you guess, and work inward&lt;/strong&gt;. The&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;CANSTAT&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;read costs two lines of code and points at which layer is broken &amp;mdash; wiring, connection, or chip &amp;mdash; without having to guess.&lt;/p&gt;
&lt;p&gt;&lt;img style="cursor:zoom-in;display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:640px;" src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260621_5F00_node_5F00_in_5F00_greenhouse.jpg" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The node is a simple build centered around an Arduino Nano and connected to a number of sensors and the CAN transceiver. I have a &amp;ldquo;USB C&amp;rdquo; charger/power driver &amp;mdash; unfortunately I went cheap from China and they are not true USB C but just a cheap power cable with a USB C connector - you get what you pay for&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="problem-2--duplicate-node-ids"&gt;Problem 2 &amp;mdash; duplicate node IDs&lt;/h2&gt;
&lt;p&gt;Setting node 1 aside with its wiring still unresolved, I focused on getting nodes 2 and 3 reliably onto the bus. But the dashboard still only showed one node.&lt;/p&gt;
&lt;p&gt;The cause was embarrassingly simple. The&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;NODE_ID&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in the firmware is a compile-time&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;#define&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:53e955c6-2b95-4202-9be1-a7659ef659c5:type=c_cpp&amp;text=%23define%20NODE_ID%20%20%20%202%20%2F%2F%201%20%2F%2F%203%20%2F%2F%20change%20for%20appropriate%20node%20ID]&lt;/p&gt;
&lt;p&gt;I had been flashing both nodes from the same file without updating the constant each time. Both nodes were broadcasting as node 2 on CAN ID&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;0x102&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;CAN bus arbitration is based on the message ID. When two nodes try to transmit the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;same CAN ID at the same time&lt;/strong&gt;, both think they are winning arbitration (the ID bits are identical so neither detects a collision in the arbitration phase) &amp;mdash; but their payload bytes differ. The result is a corrupted frame, which every node on the bus detects as an error. Error counters start climbing on all nodes, and the bus degrades.&lt;/p&gt;
&lt;p&gt;The fix is obvious in hindsight: flash each node with the correct ID.&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:6beab4ab-ecc4-42e5-9be2-f03780f52870:type=text&amp;text=Node%201%20%E2%86%92%20NODE_ID%201%20%E2%86%92%20CAN%20ID%200x101%0ANode%202%20%E2%86%92%20NODE_ID%202%20%E2%86%92%20CAN%20ID%200x102%0ANode%203%20%E2%86%92%20NODE_ID%203%20%E2%86%92%20CAN%20ID%200x103]&lt;/p&gt;
&lt;h2 id="problem-3--all-nodes-transmitting-simultaneously"&gt;Problem 3 &amp;mdash; all nodes transmitting simultaneously&lt;/h2&gt;
&lt;p&gt;With unique IDs, both nodes came up and were visible on the dashboard. But after a minute or two, node 3 would drop off. Then reappear. Then drop off again.&lt;/p&gt;
&lt;p&gt;CAN bus handles collisions via&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;arbitration&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; when two nodes try to transmit at the same moment, the node with the lower ID wins and the other backs off and retries. This is elegant and normally fine. The problem is that my original code used a flat&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;delay(2000)&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in every node&amp;rsquo;s loop:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:104c152d-9cbd-419f-9acd-046bac48dd8e:type=c_cpp&amp;text=void%20loop%28%29%20%7B%0A%20%20%20%20delay%282000%29%3B%0A%20%20%20%20%2F%2F%20...%20read%20sensor%2C%20transmit%0A%7D]&lt;/p&gt;
&lt;p&gt;If both nodes power up at roughly the same time (same power rail), they stay locked in sync and collide on every single cycle. CAN arbitration resolves each collision, but node 3 (higher CAN ID =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;0x103&lt;/code&gt;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;always loses&lt;/em&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; it backs off every single time. Under repeated arbitration losses the MCP2515 starts accumulating transmit errors in its internal&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;TEC (Transmit Error Counter)&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TEC &amp;gt; 96: warning threshold&lt;/li&gt;
&lt;li&gt;TEC &amp;gt; 127: error-passive (node still transmits but with passive error flags)&lt;/li&gt;
&lt;li&gt;TEC = 255:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;bus-off&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; node stops transmitting entirely&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The fix: stagger the transmission timing per node so they are naturally out of phase with each other:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:9b1bdbea-70e6-43e3-90ce-47ee760ed5c0:type=c_cpp&amp;text=void%20loop%28%29%20%7B%0A%20%20%20%20%2F%2F%20Stagger%20per%20node%20so%20they%20don%27t%20all%20transmit%20simultaneously.%0A%20%20%20%20%2F%2F%20Base%202s%20interval%20%2B%20NODE_ID%20%2A%20300ms%20offset%20keeps%20nodes%20out%20of%20phase.%0A%20%20%20%20delay%282000%20%2B%20NODE_ID%20%2A%20300%29%3B%0A%20%20%20%20%2F%2F%20...%0A%7D]&lt;/p&gt;
&lt;p&gt;Node 2 now transmits every 2.6 s, node 3 every 2.9 s &amp;mdash; and when node 1 is eventually fixed, it will slot in at 2.3 s. They drift in and out of alignment over time but never stay locked together.&lt;/p&gt;
&lt;h2 id="problem-4--no-recovery-when-a-node-goes-bus-off"&gt;Problem 4 &amp;mdash; no recovery when a node goes bus-off&lt;/h2&gt;
&lt;p&gt;Even with staggered timing, occasional collisions can still accumulate errors, especially at 500 kbps with the MCP2515&amp;rsquo;s tight 8-time-quanta bit timing at 8 MHz. Once a node hits bus-off it stops transmitting and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;the original code had no recovery logic&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; the node would stay silent forever until manually reset.&lt;/p&gt;
&lt;p&gt;The fix: read the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;EFLG&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Error Flag) register after any failed send and reset the chip if the bus-off bit is set:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:da5cb5d5-b46a-4faf-a3de-a2c02379dc7b:type=c_cpp&amp;text=MCP2515%3A%3AERROR%20sendErr%20%3D%20mcp2515.sendMessage%28%26tx%29%3B%0Aif%20%28sendErr%20%21%3D%20MCP2515%3A%3AERROR_OK%29%20%7B%0A%20%20%20%20Serial.print%28F%28%22ERR%3A%20send%20failed%20code%3D%22%29%29%3B%20Serial.println%28sendErr%29%3B%0A%20%20%20%20%2F%2F%20EFLG%20bit%205%20%3D%20TXBO%20%28bus-off%29.%20Reset%20and%20re-enter%20normal%20mode.%0A%20%20%20%20SPI.beginTransaction%28SPISettings%2810000000%2C%20MSBFIRST%2C%20SPI_MODE0%29%29%3B%0A%20%20%20%20digitalWrite%28MCP_CS_PIN%2C%20LOW%29%3B%0A%20%20%20%20SPI.transfer%280x03%29%3B%20SPI.transfer%280x2D%29%3B%20%2F%2F%20READ%20EFLG%0A%20%20%20%20uint8_t%20eflg%20%3D%20SPI.transfer%280x00%29%3B%0A%20%20%20%20digitalWrite%28MCP_CS_PIN%2C%20HIGH%29%3B%0A%20%20%20%20SPI.endTransaction%28%29%3B%0A%20%20%20%20if%20%28eflg%20%26%200x20%29%20%7B%0A%20%20%20%20%20%20%20%20Serial.println%28F%28%22EFLG%3A%20bus-off%20%E2%80%94%20resetting%20MCP2515%22%29%29%3B%0A%20%20%20%20%20%20%20%20mcp2515.reset%28%29%3B%0A%20%20%20%20%20%20%20%20delay%28100%29%3B%20%20%2F%2F%20give%20oscillator%20time%20to%20stabilise%0A%20%20%20%20%20%20%20%20mcp2515.setBitrate%28CAN_500KBPS%2C%20CAN_CLOCK%29%3B%0A%20%20%20%20%20%20%20%20delay%2810%29%3B%0A%20%20%20%20%20%20%20%20mcp2515.setNormalMode%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%3B%0A%7D]&lt;/p&gt;
&lt;p&gt;Note the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;delay(100)&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;after reset &amp;mdash; the original code had only 10 ms here, which is sometimes not enough for the MCP2515&amp;rsquo;s oscillator to stabilise before you start writing configuration registers.&lt;/p&gt;
&lt;h2 id="seeing-errors-before-they-become-a-problem"&gt;Seeing errors before they become a problem&lt;/h2&gt;
&lt;p&gt;To understand what is happening on the bus in real time, I added a helper that reads and prints&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;EFLG&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;TEC&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;after every successful transmission, but only if something is non-zero (so normal output stays clean):&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:88f644e1-db30-4ca4-9e99-da988f86a0eb:type=c_cpp&amp;text=%2F%2F%20EFLG%200x2D%3A%20bit5%3DTXBO%28bus-off%29%20bit4%3DTXEP%28err-passive%29%20bit2%3DTXWAR%28warning%29%0A%2F%2F%20TEC%20%200x1C%3A%20transmit%20error%20counter%20%20REC%200x1D%3A%20receive%20error%20counter%0Avoid%20printErrors%28%29%20%7B%0A%20%20%20%20uint8_t%20eflg%20%3D%20readReg%280x2D%29%3B%0A%20%20%20%20uint8_t%20tec%20%20%3D%20readReg%280x1C%29%3B%0A%20%20%20%20if%20%28eflg%20%3D%3D%200%20%26%26%20tec%20%3D%3D%200%29%20return%3B%0A%20%20%20%20Serial.print%28F%28%22%20EFLG%3D0x%22%29%29%3B%20Serial.print%28eflg%2C%20HEX%29%3B%0A%20%20%20%20Serial.print%28F%28%22%20TEC%3D%22%29%29%3B%20Serial.print%28tec%29%3B%0A%20%20%20%20if%20%28eflg%20%26%200x20%29%20Serial.print%28F%28%22%20%5BBUS-OFF%5D%22%29%29%3B%0A%20%20%20%20else%20if%20%28eflg%20%26%200x10%29%20Serial.print%28F%28%22%20%5BERR-PASSIVE%5D%22%29%29%3B%0A%20%20%20%20else%20if%20%28eflg%20%26%200x01%29%20Serial.print%28F%28%22%20%5BWARNING%5D%22%29%29%3B%0A%20%20%20%20Serial.println%28%29%3B%0A%7D]&lt;/p&gt;
&lt;p&gt;With this in place you can watch TEC climbing before the node goes quiet &amp;mdash; it gives you a warning rather than a silent disappearance.&lt;/p&gt;
&lt;h2 id="what-i-learned"&gt;What I learned&lt;/h2&gt;
&lt;p&gt;Getting even two CAN nodes reliably talking to a master required solving four separate problems: a cold solder joint that looked fine visually, duplicate node IDs from a careless flash, synchronised timing that caused constant arbitration collisions, and no recovery from the bus-off state those collisions eventually caused. None of them were obvious until I had the right instrumentation in place. Node 1 remains a work in progress.&lt;/p&gt;
&lt;p&gt;The core lesson is that&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;CAN bus is robust but unforgiving about setup&lt;/strong&gt;: it handles arbitration and error detection in hardware, but the hardware needs clean wiring, unique IDs, and a firmware that knows how to recover from error states.&lt;/p&gt;
&lt;p&gt;&lt;img style="cursor:zoom-in;display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:640px;" src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260621_5F00_node_5F00_not_5F00_helping_5F00_plant_5F00_much.jpg" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;Another thing I learned from my last Design Challenge is not to leave the build till too late. I had a fair bit of time to get these stands and circuit boards done. I was hoping to get more sensors on there, including the K-type thermocouples but some late shipment and a busy few weeks means all I got is a DHT11 temperature and humidity sensor.&lt;/p&gt;
&lt;h2 id="next"&gt;Next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix node 1&amp;rsquo;s wiring&lt;/li&gt;
&lt;li&gt;maybe take some time out to actually grow some plants&amp;nbsp;[emoticon:752f32bcc91d4a448db162742a877a4a]&lt;/li&gt;
&lt;li&gt;Hook it up to LabView&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="source"&gt;Source&lt;/h2&gt;
&lt;p&gt;&lt;a id="" href="https://github.com/saramic/green-brain" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;https://github.com/saramic/green-brain&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Misaz’s Forum #2: Breadboarding Industrial Temp + Humidity Sensor</title><link>https://community.element14.com/thread/57052?ContentTypeID=0</link><pubDate>Sun, 21 Jun 2026 22:14:41 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d9e05f0b-b0b0-4c05-9f97-635d9be52a3f</guid><dc:creator>misaz</dc:creator><slash:comments>1</slash:comments><comments>https://community.element14.com/thread/57052?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57052/misaz-s-forum-2-breadboarding-industrial-temp-humidity-sensor/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;Hi. I welcome you to my second forum post as part of my participation in &lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/" data-e14adj="t"&gt;On The Line Design Challenge&lt;/a&gt;. In this post, I will describe how I prepared Omega HX94 humidity + temperature sensor to enable experimenting with it on breadboard.&lt;/span&gt;&lt;/p&gt;
&lt;h1 id="mcetoc_1jrm3tska0"&gt;&lt;span&gt;Preparing Cable&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;First step is preparing cable for connecting sensor. It could be definitely done in hacky way, but I tried less hacky way and actually used connector which was bundled in package and mounted it to ethernet cable. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Process is explained in printed manual which come with the sensor:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/06_2D00_manual_2D00_mnt.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;First step is separating connector by unscrewing tiny screw on side:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/07_2D00_conn_2D00_disasm.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Then you can solder, wires to four contacts inside connector.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/08_2D00_conn_2D00_sold.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As you can see, I did not forget about heatshrink, however since contact are large, I need to heat them a lot and heartstring sooner then I needed.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Next step is pulling other part of connector from other side of cable:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/09_2D00_conn_2D00_asm.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Then you can push parts together and fit back small screw.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Another end I made breadboard friendly:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/10_2D00_con_2D00_breadboard.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Across whole process, it is good idea to check for open connections and short circuits, but I was lucky this time. This is a result. Now my sensor is breadboarded:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/11_2D00_conn_2D00_final.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It is sensor with analog output, so next time, I will try it with power supply and multimeter. These two are enough to obtain reading from it.&lt;/p&gt;</description></item><item><title>RE: Misaz’s Forum #2: Breadboarding Industrial Temp + Humidity Sensor</title><link>https://community.element14.com/thread/236190?ContentTypeID=1</link><pubDate>Sun, 21 Jun 2026 22:51:51 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:1576b7cf-8afd-45e4-b1a8-aa8789bcd231</guid><dc:creator>shabaz</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236190?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57052/misaz-s-forum-2-breadboarding-industrial-temp-humidity-sensor/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Always a problem insulating the conductors in small connectors!&lt;/p&gt;
&lt;p&gt;One way is to replace the heatshrink with rubber tubing (there is a 3-prong tool that expands the rubber sleeve) and put it on each conductor&amp;#39;s insulator, then solder as normal, then slide it over (can lubricate to do that if needed).&lt;/p&gt;
&lt;p&gt;The more unorthodox method I like is to instead use little pieces of polyamide tape, and tweezers to wrap it around each conductor individually, after soldering. Takes up very little space, so the connector shells go on easily afterwards.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Misaz’s Forum #5: Experimenting with Thermocouple</title><link>https://community.element14.com/thread/57055?ContentTypeID=0</link><pubDate>Sun, 21 Jun 2026 22:33:34 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:36dcf1eb-2dea-4d7d-84c0-e19f1ca6cd39</guid><dc:creator>misaz</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/57055?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57055/misaz-s-forum-5-experimenting-with-thermocouple/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;Hi. I welcome you to next part of my series about my experiments with industrial sensors. In this part I will look at thermocouple. As part of kit, I&amp;rsquo;ve got kit of five K-Type thermocouple. Compared to previously described sensor, thermocouple is complete opposite. It do not produce current output, instead it produces voltage output, and instead of getting decent industrial reliable output, it actually generates only few millivolts. While previous sensor was providing absolute value, thermocouples provide relative output to some reference called cold junction. It is temperature on connector where different metal touch each other. Sensor provides temperature difference between probe and this connector. To get absolute measurement, we need to measure one of these temperatures by different sensor. But Let&amp;rsquo;s begin simply. Let&amp;rsquo;s start with multimeter again.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As a first experiment I connected multimeter in mili-voltmeter mode directly to sensor:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/19_2D00_ktype_2D00_cold.jpeg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;And when I heated a probe a little I&amp;rsquo;ve got slightly higher voltage:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20_2D00_ktype_2D00_hot.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Note that measurements are not in V. They are in mV. So, it is 0,00023V actually. Very low voltage!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I tried Fluke online calculator at: &lt;a href="https://www.fluke.com/en-us/learn/tools-calculators/thermocouple-voltage-to-temperature-calculator" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;www.fluke.com/.../thermocouple-voltage-to-temperature-calculator&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/21_2D00_ktype_2D00_calc.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As you can see, such small voltage difference correspond to 5,810 &amp;deg;C temperature difference between cold junction and thermocouple. It corresponds to difference between room temperature about 29&amp;deg;C these days and my finger temperature around 36&amp;deg;C.&lt;/span&gt;&lt;/p&gt;
&lt;h1 id="mcetoc_1jrm4utgh0"&gt;&lt;span&gt;Let&amp;rsquo;s try digitally&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;For using thermocouples in real, we need to deal with two problems. Very low voltage and need for second sensor. Back in 2022, there were &lt;a href="https://community.element14.com/challenges-projects/design-challenges/experimenting-with-thermistors/" data-e14adj="t"&gt;Experimenting with Thermistors&lt;/a&gt; competition which I joined. Thermistors are one of the possible solutions for second sensor need. Additionally, as part of Experimenting with Thermistor I created board with 24-bit ADC with PGA which can nicely measure both thermistor and thermocouple. It is built around MAX11410 ADC chip. I reused it for this project. The idea was to reuse current part for thermistor and reference:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/22_2D00_ktype_2D00_dig_2D00_sch1.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Chip has build int constant current generator, which can generate current like 50uA and pass it from port like AIN4 here. This current flow down through thermistor and 22k precise (0,1% tolerance resistor) which generates reference (REF1). This can nicely measure thermistor relatively to known reference without any precise voltage reference (50uA current is also imprecise).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For thermocouple I had plan to use another two channels of my board like Maxim showcase in ADC chip datasheet (however I used AIN7 and 8 since 4, 5, 6 are already occupied):&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/23_2D00_ktype_2D00_dig_2D00_sch2.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For this measurement, I actually need precise voltage reference. My idea was to use builtin reference, measure precise resistor using it, estimate it&amp;rsquo;s error and compensate thermocouple voltage measurement with this knowledge.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I connected everything:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/24_2D00_ktype_2D00_dig_2D00_real.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Note that thermistor end (two thin black wires ending on yellow connector) touches cold junction of thermocouple.&lt;/span&gt;&lt;/p&gt;
&lt;h1 id="mcetoc_1jrm4utgh1"&gt;&lt;span&gt;Failed&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;However, my experiment failed. I migrated my MAX11410 library to Arduino Uno Q, adjusted code to do measurements as needed, but if for some reason returned full scale voltage in nearly all cases. As part of troubleshooting, I tried run the same experiment which I run back in Experimenting with Thermistors era, on same board, with same code, with disconnected other new parts and it still produce bad numbers.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I am not sure what happened to my ADC board, but I am, no longer do even basic voltage measurements with it. After few hours of troubleshooting, I gave up.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;And since time is running out. This is end of my experimenting here. In next part, I will summarize all my efforts.&lt;br /&gt; &lt;/span&gt;&lt;/p&gt;</description></item><item><title>Misaz’s Forum #4: Digital measurement of Analog output</title><link>https://community.element14.com/thread/57054?ContentTypeID=0</link><pubDate>Sun, 21 Jun 2026 22:30:50 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:2e4495e9-2578-4b78-ad2b-38a8d034acfc</guid><dc:creator>misaz</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/57054?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57054/misaz-s-forum-4-digital-measurement-of-analog-output/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;Hello Element14 community.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In this forum I will show another play with Omega&amp;rsquo;s HX94C industrial humidity and temperature sensor with analog output. Today, I will convert analog current output to digital form using Arduino Uno Q.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;How to do that is briefly explained in printed manual which come with sensor:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/7571.15_2D00_manual_2D00_adc.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The missing part is &amp;ldquo;TEMP METER OR RECORDER&amp;rdquo;. Diagram highlights that it needs some resistor to measure. This is exactly what we need for converting current output to voltage measurable by ADC. Question is what value? The answer is ohm law. We need to map 20mA to 3.3V measured by Arduino UNO Q. Formula is: R = U / I. U is voltage we want to get (3.3V) at maximum current (0.020 A). 3.3 / 0.020 = 165 which means that we need about 165 ohm resistor. I do not have 165 ohm resistor, however I have lot of 330 ohm, so I will use two of them in parallel which result in exactly 165 ohm resistance. Connection is as follows:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/1033.16_2D00_exp2_2D00_sch.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In real life:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/7462.17_2D00_exp2_2D00_real.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Now let&amp;rsquo;s write sketch. Arduino Uno Q support more or less same sketches as older Arduino Unos. Difference is only in using Monitor instead of Serial because it needs utilize interconnection between chips. You can create new app in App Lab by clicking or in terminal:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:3a82ab50-294c-43d3-8b84-b4860dea5e08:type=text&amp;text=arduino-app-cli%20app%20new%20analog_humi_temp%0Acd%20%2Fhome%2Farduino%2FArduinoApps%2Fanalog_humi_temp]&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Then you can edit sources using your favourite editor. Sketch is in sketch/sketch.ino:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:17fa2e56-b2e4-4d84-8870-4e02377b6b28:type=text&amp;text=vim%20sketch%2Fsketch.ino]&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Sketch source code:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:75f881fe-da61-431b-9451-a65a01fd3680:type=c_cpp&amp;text=void%20setup%28%29%20%7B%0A%20%20Monitor.begin%289600%29%3B%0A%7D%0A%0Avoid%20loop%28%29%20%7B%0A%20%20int%20adcTemp%20%3D%20analogRead%28A0%29%3B%0A%20%20float%20voltageTemp%20%3D%203.3%20%2A%20adcTemp%20%2F%201024.0%3B%0A%20%20float%20currentTemp%20%3D%201000%20%2A%20voltageTemp%20%2F%20165.0%3B%0A%20%20float%20temperature%20%3D%20%28currentTemp%20-%204%29%20%2A%20100%20%2F%2016%3B%0A%0A%20%20int%20adcHumi%20%3D%20analogRead%28A1%29%3B%0A%20%20float%20voltageHumi%20%3D%203.3%20%2A%20adcHumi%20%2F%201024.0%3B%0A%20%20float%20currentHumi%20%3D%201000%20%2A%20voltageHumi%20%2F%20165.0%3B%0A%20%20float%20humidity%20%3D%20%28currentHumi%20-%204%29%20%2F%200.16%3B%0A%0A%20%20Monitor.print%28%22Temperature%3A%20%22%29%3B%0A%20%20Monitor.print%28temperature%29%3B%0A%20%20Monitor.print%28%22%5CtHumidity%3A%20%22%29%3B%0A%20%20Monitor.println%28humidity%29%3B%0A%7D%0A]&lt;/p&gt;
&lt;p&gt;&lt;span&gt;And then you can run it by clicking Run in App lab, or in command line:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:c2f4a963-a54d-4fa0-a550-df6e67a3168d:type=text&amp;text=arduino-app-cli%20app%20start%20.]&lt;/p&gt;
&lt;p&gt;&lt;span&gt;And logs you can observe using following command:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:c46dc82e-f4d1-4ffb-9300-836fe452aed9:type=text&amp;text=arduino-app-cli%20monitor]&lt;/p&gt;
&lt;p&gt;&lt;span&gt;It should look as follows:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/5327.18_2D00_exp2_2D00_results.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s it. Outputs from industrial analog sensor are now in hands of modern fully digital Arduino Uno Q. In next part I will look to other sensor kit: Omega&amp;rsquo;s K-Type Thermocouple.&lt;/p&gt;</description></item><item><title>Misaz’s Forum #3: Analog measurements without any digital part</title><link>https://community.element14.com/thread/57053?ContentTypeID=0</link><pubDate>Sun, 21 Jun 2026 22:16:19 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:237238d3-dba0-42dc-94d2-0adabcae29b8</guid><dc:creator>misaz</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/57053?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57053/misaz-s-forum-3-analog-measurements-without-any-digital-part/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;Hi. I welcome you to my third forum post as part of my participation in &lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/" data-e14adj="t"&gt;On The Line Design Challenge&lt;/a&gt;. In this post, I will show how to measure temperature and humidity using it with using just sensor, power supply, and two multimeters (one for temperature, second for humidity).&lt;/span&gt;&lt;/p&gt;
&lt;h1 id="mcetoc_1jrm41k6n0"&gt;&lt;span&gt;Current Outputs&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;The variant of sensor which we received as part of competition has current output. It works as current limiter. Sensor has no ground connection. It connects just to high voltage of power supply which need to be higher then 6V and maximum is listed as 30V. The sensor consume energy from this source and limit&amp;rsquo;s own power consumption based on measured properties. Output is in the range 4 &amp;ndash; 20mA, so sensor always consume at least 4mA which it uses for its own operation. Remaining current is &amp;ldquo;wasted&amp;rdquo; for indicating measured value.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Let&amp;rsquo;s measure some currents which corresponds to humidity and temperature measured by the sensor. Schematics of connection is following. As I mentioned, power pins of sensor (1 and 2) goes to positive voltage of power supply, output of sensors (3 and 4) are connected via amperemeters to negative pin of power supply.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/12_2D00_exp_2D00_sch.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In reality when powered:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/13_2D00_exp_2D00_real.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 id="mcetoc_1jrm41k6n1"&gt;&lt;span&gt;Converting Milliamperes to Temperature and Humidity&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;Formulas for converting measured current (mA) to real values are mentioned in printed manual which come with sensor:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/14_2D00_manual_2D00_formulas.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I measured 7.77 mA on temperature output channel, and 13.020 mA on humidity channel. Let&amp;rsquo;s pass it to formulas:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;deg;C = (7,77 &amp;ndash; 4) * (100 / 16) = 23.5625 &amp;deg;C&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;%RH = (13,020 &amp;ndash; 4) / 0,16 = 56.375 %&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Misaz’s Forum #1: Kit Unboxing</title><link>https://community.element14.com/thread/57051?ContentTypeID=0</link><pubDate>Sun, 21 Jun 2026 22:12:40 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:626afe3d-b740-4b86-af26-adc439ad218f</guid><dc:creator>misaz</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/57051?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57051/misaz-s-forum-1-kit-unboxing/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;Hello Element14 community. Welcome you to my first forum post about kit which I received as part &lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/" data-e14adj="t"&gt;On The Line Design Challenge&lt;/a&gt;. I started experimenting pretty late this time and writing I started even later, so this time, I post everything on last day :)&lt;/span&gt;&lt;/p&gt;
&lt;h1 id="mcetoc_1jrm3qkj60"&gt;&lt;span&gt;Motivation&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;My motivation was mainly to play with industrial sensors. Most probably everybody can measure temperature with DHT22 nowadays, but over the time I learnt that in electronics, things are not black and white, but rather different technologies have some pros and cons. So as part of challenge, I want to discover offered high quality industrial humidity sensor with analog output, thermocouples and CAN bus.&lt;/span&gt;&lt;/p&gt;
&lt;h1 id="mcetoc_1jrm3qkj61"&gt;&lt;span&gt;Unboxing&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;Kit come at time. Contained everything I expected + Element14 swag (stickers, letter). The most expensive and interesting part is this analog temperature + humidity sensor from Omega. It comes in large box which contained mounting accessors, cable connector, wall mount accessories and PRINTED MANUAL. Really cool.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/01_2D00_humi_2D00_temp_2D00_sens.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Second most interesting part of kit for me is pack of 5 K-type thermocouples:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/02_2D00_thermocouples.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Another part is CAN PHY Shield. It is powered by chip from Maxim Integrated, so it is shield and evaluation kit in one:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/03_2D00_can_2D00_shield.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Finally there is some compute. It is not that interesting to me, because I already have and play with the same one. You can read my initial impressions from my first Uno Q &lt;a href="https://community.element14.com/challenges-projects/design-challenges/light-up-your-life/f/forum/56589/finisher-prize-for-light-up-your-life-design-challenge" data-e14adj="t"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/04_2D00_uno_2D00_q.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Finally, Molex pre-crimped cables as a goodie in the kit:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/05_2D00_molex_2D00_cabs.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In next forum post, I will prepare temperature and humidity sensor for operation.&lt;/p&gt;</description></item><item><title>Green Brain - Part V - LabView visualisation</title><link>https://community.element14.com/thread/57050?ContentTypeID=0</link><pubDate>Sun, 21 Jun 2026 16:50:40 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0f9b736b-4e38-4a8b-874b-a304c0f4ab46</guid><dc:creator>saramic</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/57050?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57050/green-brain---part-v---labview-visualisation/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;had never heard of NI LabVIEW before this challenge but after watching some overviews and tutorials it is clearly an industry standard, so I thought I would give it a go.&lt;/p&gt;
&lt;h1 id="recap"&gt;Recap&lt;/h1&gt;
&lt;p&gt;Green Brain&amp;nbsp;[emoticon:e8b48dd11aa142a1bf769add09114643] is the idea of tracking plant  nodes via an industrial&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;CAN bus&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/56921/green-brain---part-i---can-bus-introduction" data-e14adj="t"&gt;Green Brain - Part I - CAN bus introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57001/green-brain---part-ii---dev-setup" data-e14adj="t"&gt;Green Brain - Part II - Dev setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Green Brain - Part III - Water Cannon Chaos&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57049/green-brain---part-iv---nodes-well-that-ends-well" data-e14adj="t"&gt;Green Brain - Part IV - Nodes Well That Ends Well&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="connecting-to-labview"&gt;Connecting to LabVIEW&lt;/h2&gt;
&lt;p&gt;The UNO Q already runs a Python Flask REST API that serves the live sensor readings as JSON at&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;pollyanna.local:8080/.../nodes&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:49933340-0406-4123-9f21-eba3968f720b:type=json&amp;text=%5B%7B%22node%22%3A2%2C%22temp%22%3A24.5%2C%22hum%22%3A61.0%2C%22seq%22%3A42%2C%22ok%22%3Atrue%2C%22age%22%3A3%7D%2C%0A%20%7B%22node%22%3A3%2C%22temp%22%3A23.1%2C%22hum%22%3A58.0%2C%22seq%22%3A38%2C%22ok%22%3Atrue%2C%22age%22%3A1%7D%5D]&lt;/p&gt;
&lt;p&gt;That means LabVIEW just needs to poll an HTTP endpoint &amp;mdash; no new code on the hardware side at all.&lt;/p&gt;
&lt;h2 id="what-i-tried--http-get-with-json-parsing"&gt;What I tried &amp;mdash; HTTP GET with JSON parsing&lt;/h2&gt;
&lt;p&gt;LabVIEW has a built-in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;HTTP Client GET&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;VI under&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Data Communication &amp;rarr; Protocols &amp;rarr; HTTP Client&lt;/code&gt;. Getting the raw JSON string back from the API worked fine.&lt;/p&gt;
&lt;p&gt;The stumbling block was parsing it. LabVIEW&amp;rsquo;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Unflatten From JSON&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;needs a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;input &amp;mdash; an array-of-clusters constant whose structure exactly matches the JSON. You build it outside-in: place an&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Array Constant&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;shell first, then drop a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Cluster Constant&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;inside it, then add typed constants for each field with labels matching the JSON keys exactly.&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:360px;max-width:640px;" src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260621_5F00_lab_5F00_view_5F00_temp_5F00_and_5F00_humidity.png" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;I got as far as the HTTP response but hit a type mismatch error:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:7e181e74-5819-4cbc-a050-43136d3e3ae3:type=text&amp;text=LabVIEW%3A%20%28Hex%200xFFFA4723%29%20Type%20mismatch%20between%20JSON%20and%20LabVIEW.]&lt;/p&gt;
&lt;p&gt;The debug approach suggested on the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="https://forums.ni.com/t5/G-Web-Development-Software/json-parsing-array-of-cluster/td-p/4188063" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;NI forums&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is to wire the cluster-array constant to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Flatten To JSON&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;first and compare its output to the real API response &amp;mdash; whatever differs is the mismatch. I ran out of time to track mine down fully, but it is close.&lt;/p&gt;
&lt;h2 id="other-ways-to-connect-sensors-to-labview"&gt;Other ways to connect sensors to LabVIEW&lt;/h2&gt;
&lt;p&gt;For reference, here is how the options compare &amp;mdash; from simplest to most capable:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;How&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VISA Serial&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Arduino &amp;rarr; USB &amp;rarr; LabVIEW VISA Read VI&lt;/td&gt;
&lt;td&gt;Quick bench work, no network needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TCP stream&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UNO Q opens a socket, streams CSV&lt;/td&gt;
&lt;td&gt;Low latency, one-to-one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP REST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LabVIEW polls a URL (what I used)&lt;/td&gt;
&lt;td&gt;Already have a server running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MQTT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UNO Q publishes, LabVIEW subscribes&lt;/td&gt;
&lt;td&gt;Multiple consumers, buffered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NI DAQmx&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NI hardware plugs straight in&lt;/td&gt;
&lt;td&gt;Precision timing, industrial use&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For temperature monitoring the timing requirements are relaxed, so all of these work in practice. HTTP polling was the natural fit here since the REST API already existed.&lt;/p&gt;
&lt;h2 id="next"&gt;Next&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/b/projects/posts/green-brain---distributed-greenhouse-control-platform" data-e14adj="t"&gt;Green Brain - distributed greenhouse control platform&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="source"&gt;Source&lt;/h2&gt;
&lt;p&gt;&lt;a id="" href="https://github.com/saramic/green-brain" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;https://github.com/saramic/green-brain&lt;/a&gt;&lt;/p&gt;</description></item><item><title>RE: Green Brain - Part III - Water Cannon Chaos</title><link>https://community.element14.com/thread/236183?ContentTypeID=1</link><pubDate>Sun, 21 Jun 2026 08:49:21 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:af42be4f-46d5-447e-94a7-aae5becdf735</guid><dc:creator>saramic</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236183?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57045/green-brain---part-iii---water-cannon-chaos/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;one of my sons actually - he only took part when I was a total failure and water and mess was involved &lt;span class="emoticon" data-url="https://community.element14.com/cfs-file/__key/system/emoji/1f642.svg" title="Slight smile"&gt;&amp;#x1f642;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Green Brain - Part III - Water Cannon Chaos</title><link>https://community.element14.com/thread/236182?ContentTypeID=1</link><pubDate>Sun, 21 Jun 2026 06:17:52 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:71aa7ab2-2960-4f97-85fa-b5d5d4d4c9ca</guid><dc:creator>colporteur</dc:creator><slash:comments>1</slash:comments><comments>https://community.element14.com/thread/236182?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57045/green-brain---part-iii---water-cannon-chaos/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I&amp;#39;m curious. I&amp;#39;ve seen many videos on this site where pets make cameo appearances.&lt;/p&gt;
&lt;p&gt;If the figure hiding behind the pump assembly is a spouse, how did you convince them to participate? What function did they serve in the testing?&lt;/p&gt;
&lt;p&gt;The only input I get from my significant other is, &amp;quot;when are you going to clean up this room?&amp;quot; the few times she visits my workshop.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Green Brain - Part III - Water Cannon Chaos</title><link>https://community.element14.com/thread/236181?ContentTypeID=1</link><pubDate>Sun, 21 Jun 2026 03:25:47 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:e2d736fd-6b69-4c26-afec-7a9c4141aa89</guid><dc:creator>kmikemoo</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236181?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57045/green-brain---part-iii---water-cannon-chaos/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;a href="https://community.element14.com/members/saramic"&gt;saramic&lt;/a&gt;&amp;nbsp; While this didn&amp;#39;t quite turn out like you had wanted, it&amp;#39;s still a fun feature.&amp;nbsp; I think the water cannon as a dog deterent is a wonderful idea.&amp;nbsp; Maybe I could get my granddog to stop peeing right at the end of the steps - where we also have to walk.&amp;nbsp;&lt;span class="emoticon" data-url="https://community.element14.com/cfs-file/__key/system/emoji/1f606.svg" title="Laughing"&gt;&amp;#x1f606;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: SolarSense - Part 7 - Reading the Sky - UV Sensor Interface on STM32</title><link>https://community.element14.com/thread/236176?ContentTypeID=1</link><pubDate>Sat, 20 Jun 2026 19:15:53 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:05a630fa-bcfe-4a1a-af6b-95ba2aa458f2</guid><dc:creator>DAB</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236176?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57041/solarsense---part-7---reading-the-sky---uv-sensor-interface-on-stm32/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Nice project.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>SolarSense - Part 7 - Reading the Sky - UV Sensor Interface on STM32</title><link>https://community.element14.com/thread/57041?ContentTypeID=0</link><pubDate>Fri, 19 Jun 2026 09:24:06 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d7862279-2d00-4935-8d36-ebb0de51f5c7</guid><dc:creator>arvindsa</dc:creator><slash:comments>5</slash:comments><comments>https://community.element14.com/thread/57041?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57041/solarsense---part-7---reading-the-sky---uv-sensor-interface-on-stm32/rss?ContentTypeId=0</wfw:commentRss><description>&lt;h2 id="mcetoc_1jqbvjvms0"&gt;Recap:&lt;/h2&gt;
&lt;p&gt;I&amp;#39;m building a smart solar monitoring system that uses three panels with a clean reference to eliminate weather effects and directly measure dust-induced losses in real time. One panel stays pristine as a baseline, and comparing the two under identical sky conditions gives a performance ratio that reveals soiling immediately. The goal is to use environmental sensors and edge AI to predict exactly when cleaning is needed, before efficiency drops enough to impact revenue. This beats fixed-schedule cleaning or waiting for output to degrade.Also this is complementary to my Master&amp;#39;s thesis of a minute Shape memory Alloy based solar panel cleaning robot&lt;/p&gt;
&lt;p&gt;Previous posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57013/solarsense---part-1---introduction-the-poc-built-and-the-plan" data-e14adj="t"&gt;SolarSense - Part 1 - Introduction, The POC Built and The Plan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57018/solarsense---part-2---can-arduino-can" data-e14adj="t"&gt;SolarSense - Part 2 - Can Arduino CAN?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57020/solarsense---part-3---pcb-schematics-walkthrough" data-e14adj="t"&gt;SolarSense - Part 3 - PCB Schematics Walkthrough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57025/solarsense---part-4---can-protocol-deep-dive-and-implementation" data-e14adj="t"&gt;SolarSense - Part 4 - CAN Protocol Deep Dive and Implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57030/solarsense---part-5---making-an-live-dashboard-using-lab-view" data-e14adj="t"&gt;SolarSense - Part 5 - Making an Live Dashboard using Lab View&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57039/solarsense---part-6---reading-the-heat-at-k-type-thermocouple-using-max31855" data-e14adj="t"&gt;SolarSense - Part 6 - Reading the Heat at K Type Thermocouple using MAX31855.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcetoc_1jrfhuult0"&gt;Why UV?&lt;/h2&gt;
&lt;p&gt;The obvious answer you might think is &amp;quot;because UV degrades solar panels like so many other things.&amp;quot; And yes, that is absolutely true. UV radiation is the primary driver of photovoltaic cell degradation over years of operation. The casing yellows, the anti-reflection coating breaks down, Tracking cumulative UV dose over time gives a solid predictor for long-term efficiency loss that has nothing to do with dust.&lt;br /&gt;&lt;br /&gt;But for this project, That would not be the answer, UV degradation is established fact and there is no point in doing any research on it. But what is interesting is that&amp;nbsp; Solar irradiance (energy per unit area) and UV index do not move in together. Clouds scatter and absorb visible light far more aggressively than they block UV &amp;mdash; there are days where the sky looks completely overcast and the UV index is still punishing. The panels see almost no visible light but a significant UV dose. If my model only tracks panel output and misses UV, it cannot distinguish &amp;quot;sky is genuinely dark&amp;quot; from &amp;quot;sky is bright but the panel surface is blocked.&amp;quot; UV gives the model context about what the actual sky condition is, independent of what the panels are producing.&lt;br /&gt;&lt;br /&gt;The key insight: UV index is a proxy for the radiative environment that survives cloud cover in a way that visible irradiance does not. That independence is exactly what makes it useful as a model input. Now, I have to emphasize that the UV is not an authoritative indicator for passing clouds etc but it will be helpful.&lt;/p&gt;
&lt;h2 id="mcetoc_1jrfhuult1"&gt;What the GUVA Sensor Actually Does&lt;/h2&gt;
&lt;p&gt;The GUVA-S12SD is a GaN-based Schottky-type photodiode that is sensitive from roughly 240 nm to 370 nm. That range covers UV-B (280&amp;ndash;315 nm) and most of UV-A, but the response peaks around 360 nm and falls to near zero before 400 nm &amp;mdash; so visible light is well and truly rejected. The sensor is genuinely seeing UV, not just acting as a general light sensor with a blue filter.&lt;/p&gt;
&lt;p&gt;&lt;img style="display:block;margin-left:auto;margin-right:auto;max-height:450px;max-width:800px;" alt=" " src="https://community.element14.com/resized-image/__size/1600x900/__key/communityserver-discussions-components-files/453/20260619_5F00_123156_2800_1_2900_.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;What the chip itself produces is a current proportional to incident UV intensity. The datasheet specifies a responsivity of 0.14 A/W at 300 nm and a photocurrent of 26 nA per UV index unit under sunlight conditions. On the Adafruit breakout module, this current feeds into an op-amp circuit that amplifies it to a usable voltage level. &lt;a href="https://www.adafruit.com/product/1918" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Adafruit&amp;rsquo;s documentation &lt;/a&gt;states the conversion as:&amp;nbsp;&lt;code&gt;V_out = 4.3 &amp;times; I_photodiode_in_&amp;micro;A&lt;/code&gt;&lt;/p&gt;
&lt;table class="table table-striped table-bordered" border="1"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Approximate V_out&lt;/th&gt;
&lt;th&gt;UV Index&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dark / indoors&lt;/td&gt;
&lt;td&gt;0.05 &amp;ndash; 0.15 V&lt;/td&gt;
&lt;td&gt;0 &amp;ndash; 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overcast outdoor&lt;/td&gt;
&lt;td&gt;0.15 &amp;ndash; 0.40 V&lt;/td&gt;
&lt;td&gt;1 &amp;ndash; 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hazy sun&lt;/td&gt;
&lt;td&gt;0.40 &amp;ndash; 0.80 V&lt;/td&gt;
&lt;td&gt;4 &amp;ndash; 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clear noon Kerala summer&lt;/td&gt;
&lt;td&gt;0.90 &amp;ndash; 1.40 V&lt;/td&gt;
&lt;td&gt;9 &amp;ndash; 14&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class="has-line-data" data-line-start="48" data-line-end="49"&gt;My 0.3 V reading at test time is UV Index 3&amp;nbsp; exactly right for indoors near a window. The formula to compute UV index from the output voltage is simply dividing by 0.1 V, or in firmware:&lt;/p&gt;
&lt;p class="has-line-data" data-line-start="48" data-line-end="49"&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:36933d69-e330-4234-84b7-22fd761d9347:type=c_cpp&amp;text=%2F%2A%20UV%20index%20in%20tenths%20from%20GUVA%20output%20voltage.%0A%20%20%20Per%20Adafruit%3A%20UV%20index%20%3D%20V_out%20%2F%200.1%20V%20%20%E2%86%92%20%20tenths%20%3D%20uv_mv%20%2F%2010%20%2A%2F%0Auint32_t%20uv_idx10%20%3D%20uv_mv%20%2F%2010U%3B]&lt;/p&gt;
&lt;h2 id="mcetoc_1jrfi88bn2" class="code-line has-line-data" data-line-start="77" data-line-end="78"&gt;The Code&lt;/h2&gt;
&lt;p class="has-line-data" data-line-start="79" data-line-end="80"&gt;There are two pieces of setup required before any ADC conversion can be usable on the STM32L4. The first is the calibration call unlike older STM32 families, the L4&amp;rsquo;s ADC has an internal calibration routine that must be run once at startup before the first conversion. It writes offset correction values to the ADC&amp;rsquo;s internal registers and takes only a few microseconds. Without it, readings come out inaccurate. This goes right after &lt;code&gt;MX_ADC1_Init()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="has-line-data language-c" data-line-start="82" data-line-end="84"&gt;HAL_ADCEx_Calibration_Start(&amp;amp;hadc1, ADC_SINGLE_ENDED);&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p class="has-line-data" data-line-start="85" data-line-end="86"&gt;After that, reading the UV channel each telemetry tick is straightforward. The ADC is in scan mode with four ranks, which means all four channels are sequenced on every trigger &amp;mdash; you cannot read just rank 1 in isolation. You have to drain all four values or the next conversion starts out of step.&lt;/p&gt;
&lt;p class="has-line-data" data-line-start="85" data-line-end="86"&gt;The Conversion Rank in CubeMX&lt;/p&gt;
&lt;p class="has-line-data" data-line-start="85" data-line-end="86"&gt;&lt;img style="display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/Screenshot_5F00_2026_2D00_06_2D00_19_5F00_14_2D00_40_2D00_44.png" /&gt;&lt;/p&gt;
&lt;p class="has-line-data" data-line-start="85" data-line-end="86"&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:49af6926-81c8-4294-9c67-ffbd2cd1ad25:type=c_cpp&amp;text=%2F%2A%20UV%20sensor%20%28GUVA%20analog%29%20on%20ADC1%20rank%201%20%28ADC_CHANNEL_5%20%2F%20PA0%29.%0A%20%20%20Scan%20group%20has%204%20ranks%3B%20all%20must%20be%20drained%20on%20every%20conversion.%20%2A%2F%0Aif%20%28o%20%3C%20%28int%29sizeof%28tlm%29%20-%2016%29%0A%7B%0A%20%20%20%20uint32_t%20uv_raw%20%3D%200%3B%0A%20%20%20%20if%20%28HAL_ADC_Start%28%26hadc1%29%20%3D%3D%20HAL_OK%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20%28HAL_ADC_PollForConversion%28%26hadc1%2C%2010%29%20%3D%3D%20HAL_OK%29%0A%20%20%20%20%20%20%20%20%20%20%20%20uv_raw%20%3D%20HAL_ADC_GetValue%28%26hadc1%29%3B%0A%20%20%20%20%20%20%20%20%2F%2A%20Drain%20ranks%202-4%20%28HX94C%20RH%2C%20HX94C%20TEMP%2C%20RAIN%20AO%29%20%2A%2F%0A%20%20%20%20%20%20%20%20for%20%28int%20r%20%3D%201%3B%20r%20%3C%204%3B%20r%2B%2B%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28HAL_ADC_PollForConversion%28%26hadc1%2C%2010%29%20%3D%3D%20HAL_OK%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28void%29HAL_ADC_GetValue%28%26hadc1%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20HAL_ADC_Stop%28%26hadc1%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20uint32_t%20uv_mv%20%3D%20uv_raw%20%2A%203300U%20%2F%204095U%3B%0A%20%20%20%20o%20%2B%3D%20snprintf%28tlm%20%2B%20o%2C%20sizeof%28tlm%29%20-%20o%2C%20%22%20uv_mv%3D%25lu%22%2C%20%28unsigned%20long%29uv_mv%29%3B%0A%7D]&lt;/p&gt;
&lt;h2 id="mcetoc_1jrfijuok5" class="has-line-data" data-line-start="85" data-line-end="86"&gt;The Readings&lt;/h2&gt;
&lt;p&gt;Just Like in the measurement of the temperature at the thermocouple, I do not have a calibrated UV source or measurement system. So I am going to just see if the multi-meter reading of signal output is same as what STM32 picks up.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style="display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/20260619_5F00_122852_2800_1_2900_.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="display:block;margin-left:auto;margin-right:auto;max-height:360px;max-width:800px;" alt=" " src="https://community.element14.com/resized-image/__size/1600x720/__key/communityserver-discussions-components-files/453/Screenshot_5F00_2026_2D00_06_2D00_19_5F00_12_2D00_29_2D00_11.jpg" /&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jrfigf2i4" class="code-line has-line-data" data-line-start="154" data-line-end="155"&gt;Final Notes&lt;/h2&gt;
&lt;p class="has-line-data" data-line-start="156" data-line-end="157"&gt;One line of calibration code. That is the whole lesson here. &lt;code&gt;HAL_ADCEx_Calibration_Start&lt;/code&gt; on the STM32L4 is not optional.&lt;/p&gt;
&lt;p class="has-line-data" data-line-start="158" data-line-end="159"&gt;The UV sensor is live and reading sensibly. Next I want to run it through a full day outdoors and plot the curve rising from low values before sunrise, peaking around local solar noon, dropping back. If the curve shape looks right and correlates with what I would expect for the season and latitude, I will be satisfied that the sensor is working correctly.&lt;/p&gt;
&lt;p class="has-line-data" data-line-start="160" data-line-end="161"&gt;After that, the environmental sensors&amp;nbsp; BMP280 and the HX94C are next in the queue. The ADC scan group already has the HX94C analog channels wired up, it is just waiting for code similar to what I did here. The sensing stack is getting close to complete. I am yet to solder the BMP280. I am hesitant because deep down in my heart, It feels like pressure is not going to be an useful parameter.&lt;/p&gt;
&lt;pre&gt;&lt;code class="has-line-data language-c" data-line-start="82" data-line-end="84"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Making a CAN Network</title><link>https://community.element14.com/thread/57042?ContentTypeID=0</link><pubDate>Fri, 19 Jun 2026 12:47:28 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:8ffed8e4-2aba-4a7d-b09b-a62af89a2785</guid><dc:creator>taifur</dc:creator><slash:comments>4</slash:comments><comments>https://community.element14.com/thread/57042?ContentTypeID=0</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57042/making-a-can-network/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p class="isSelectedEnd"&gt;&lt;span&gt;Controller Area Network (CAN) is a robust, reliable, and real-time communication protocol widely used in industrial automation and embedded systems. CAN enables multiple&amp;nbsp;nodes to communicate over a single two-wire bus without requiring any central host. A CAN node can be any independent sensor or actuator unit. CAN networks are extensively used in process automation, industrial machinery, and robotic systems. It has very high noise immunity and requires only two wires for communication.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;My project involves a CAN network where there will be an ESP32-based CAN node and a CAN gateway based on Arduino UNO Q and&amp;nbsp;MAX33041E CAN transceiver shield from Analog Devices.&amp;nbsp;The ESP32-based node collects sensor data and transmits it over the CAN bus to&amp;nbsp;the central CAN gateway.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;The ESP32 has a built-in CAN bus-compatible controller as TWAI which stands for Two-Wire Automotive Interface, it doesn&amp;rsquo;t have a built-in CAN transceiver, so we must use an external one to connect to a CAN network. So, in my project, I am using the MCP2551&amp;nbsp;CAN transceiver&amp;nbsp;module to make a CAN node using an ESP32 microcontroller.&amp;nbsp;The MCP2551&amp;nbsp; transceiver converts the CAN controller&amp;#39;s digital TX/RX signals into the differential CANH/CANL bus signals.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;I connected the&amp;nbsp;VCC pin of the MCP2551 module to the VIN&amp;nbsp;of&amp;nbsp;the ESP32. Then, connect the GND pin to the ground. Next, connect the TX to GPIO5 and the RX to GPIO4 on the ESP32.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;&lt;img style="max-height:522px;max-width:696px;" alt=" " height="522" src="https://community.element14.com/resized-image/__size/1392x1044/__key/communityserver-discussions-components-files/453/IMG_5F00_3931.JPG" width="696" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;The next step is to connect the CAN Bus High and CAN Bus Low signals to the bus. I connected the CANH and CANL signals directly to the screw terminal on the&amp;nbsp;&lt;a id="e14-product-link-635ca" class="e14-embedded e14_shopping-cart-far e14-link" href="https://referral.element14.com/OrderCodeView?fsku=3807530&amp;amp;nsku=73AJ8377&amp;amp;COM=e14c-e14-on-the-line&amp;amp;CMP=e14c-e14-on-the-line&amp;amp;osetc=e14c-e14-on-the-line" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="link" data-at-label="PRODUCT_POPUP_OPEN" data-farnell="3807530" data-newark="73AJ8377" data-comoverride="e14-on-the-line" data-cmpoverride="e14-on-the-line" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" target="_blank" data-e14adj="t"&gt;MAX33041 Shield Evaluation Kit&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;&lt;img style="max-height:522px;max-width:696px;" alt=" " height="522" src="https://community.element14.com/resized-image/__size/1392x1044/__key/communityserver-discussions-components-files/453/IMG_5F00_3936.JPG" width="696" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;For programming the ESP32 module for CAN communication, I installed the following library:&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;&lt;img style="max-height:360px;max-width:640px;" alt=" " src="https://community.element14.com/resized-image/__size/1280x720/__key/communityserver-discussions-components-files/453/mcp2515.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;For sending the test message on the CAN bus, I used the following test code.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="isSelectedEnd"&gt;&lt;span&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:d50e57cc-bf25-450f-af81-d19139d8bb8d:type=text&amp;text=%23include%20%3CCAN.h%3E%0D%0A%0D%0A%23define%20TX_GPIO_NUM%20%20%205%0D%0A%23define%20RX_GPIO_NUM%20%20%204%0D%0A%0D%0Avoid%20setup%28%29%20%7B%0D%0A%20%20Serial.begin%20%28115200%29%3B%0D%0A%20%20while%20%28%21Serial%29%3B%0D%0A%20%20delay%20%281000%29%3B%0D%0A%0D%0A%20%20Serial.println%20%28%22CAN%20Sender%22%29%3B%0D%0A%0D%0A%20%20%2F%2F%20Set%20the%20pins%0D%0A%20%20CAN.setPins%20%28RX_GPIO_NUM%2C%20TX_GPIO_NUM%29%3B%0D%0A%0D%0A%20%20%2F%2F%20start%20the%20CAN%20bus%20at%20500%20kbps%0D%0A%20%20if%20%28%21CAN.begin%28500E3%29%29%20%7B%0D%0A%20%20%20%20Serial.println%28%22Starting%20CAN%20failed%21%22%29%3B%0D%0A%20%20%20%20while%20%281%29%3B%0D%0A%20%20%7D%0D%0A%7D%0D%0A%0D%0Avoid%20loop%28%29%20%7B%0D%0A%20%20%2F%2F%20send%20packet%3A%20id%20is%2011%20bits%2C%20packet%20can%20contain%20up%20to%208%20bytes%20of%20data%0D%0A%20%20Serial.print%28%22Sending%20packet%20...%20%22%29%3B%0D%0A%0D%0A%20%20CAN.beginPacket%280x12%29%3B%0D%0A%20%20CAN.write%28%27h%27%29%3B%0D%0A%20%20CAN.write%28%27e%27%29%3B%0D%0A%20%20CAN.write%28%27l%27%29%3B%0D%0A%20%20CAN.write%28%27l%27%29%3B%0D%0A%20%20CAN.write%28%27o%27%29%3B%0D%0A%20%20CAN.endPacket%28%29%3B%0D%0A%0D%0A%20%20Serial.println%28%22done%22%29%3B%0D%0A%0D%0A%20%20delay%281000%29%3B%0D%0A%0D%0A%20%20%2F%2F%20send%20extended%20packet%3A%20id%20is%2029%20bits%2C%20packet%20can%20contain%20up%20to%208%20bytes%20of%20data%0D%0A%20%20Serial.print%28%22Sending%20extended%20packet%20...%20%22%29%3B%0D%0A%0D%0A%20%20CAN.beginExtendedPacket%280xabcdef%29%3B%0D%0A%20%20CAN.write%28%27w%27%29%3B%0D%0A%20%20CAN.write%28%27o%27%29%3B%0D%0A%20%20CAN.write%28%27r%27%29%3B%0D%0A%20%20CAN.write%28%27l%27%29%3B%0D%0A%20%20CAN.write%28%27d%27%29%3B%0D%0A%20%20CAN.endPacket%28%29%3B%0D%0A%0D%0A%20%20Serial.println%28%22done%22%29%3B%0D%0A%0D%0A%20%20delay%281000%29%3B%0D%0A%7D]&lt;/span&gt;&lt;/p&gt;</description></item><item><title>RE: Making a CAN Network</title><link>https://community.element14.com/thread/236175?ContentTypeID=1</link><pubDate>Sat, 20 Jun 2026 19:15:05 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:3464b6b9-0924-4bc9-9741-52f274ee862d</guid><dc:creator>DAB</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236175?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57042/making-a-can-network/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Very nice.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Friendly Reminder - On The Line Build Period Ends This Sunday</title><link>https://community.element14.com/thread/236172?ContentTypeID=1</link><pubDate>Sat, 20 Jun 2026 08:22:43 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0ca338b5-2538-4347-b2a6-397b69788ef7</guid><dc:creator>arvindsa</dc:creator><slash:comments>0</slash:comments><comments>https://community.element14.com/thread/236172?ContentTypeID=1</comments><wfw:commentRss>https://community.element14.com/challenges-projects/design-challenges/on-the-line/f/forum/57043/friendly-reminder---on-the-line-build-period-ends-this-sunday/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Aye Aye, All engines, Ahead Full.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>