<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://tidtad8.github.io/blog</id>
    <title>En Jie Blog</title>
    <updated>2025-04-08T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://tidtad8.github.io/blog"/>
    <subtitle>En Jie Blog</subtitle>
    <icon>https://tidtad8.github.io/img/robot-favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[Reviewing my Experience with CREST CPSA]]></title>
        <id>https://tidtad8.github.io/blog/cpsa-review</id>
        <link href="https://tidtad8.github.io/blog/cpsa-review"/>
        <updated>2025-04-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[I recently completed the CREST Practitioner Security Analyst (CPSA) certification, here are some of my thoughts and reflections on the experience.]]></summary>
        <content type="html"><![CDATA[<p>I recently completed the CREST Practitioner Security Analyst (CPSA) certification, here are some of my thoughts and reflections on the experience.</p>
<p>CPSA is an entry level certification for cyber security analysts, focusing on practical skills in vulnerability assessment and basic penetration testing. The exam consists of 120 multiple choice questions with a 2 hour time limit. The questions range across multiple topics, with heavy focus on the fundamental concepts of security analysis rather than deep knowledge and practical experience.</p>
<p>I referred to the <a href="https://www.crest-approved.org/skills-certifications-careers/crest-practitioner-security-analyst/" target="_blank" rel="noopener noreferrer" class="">official syllabus</a> as a checklist while studying, ensuring I covered all the necessary topics. I made my notes based on that, and also tweaked it further after looking for additional resources online to get an idea as to what kind of questions to expect. For fact recall type questions, I made flashcards to help with memorization and also practiced with free online quizzes that I could find. For the scenario based questions, it is important to understand the underlying concepts and technologies so it can be applied to different situations.</p>
<p>The exam itself was fairly straightforward, with a mix of theoretical questions and scenario based problem solving. The questions were generally clear and unambiguous, though some required careful reading to avoid misinterpretation. The exam enviroment allows flagging questions for review, which I used to mark difficult questions and return to them later if time permitted, which helped with time management.</p>
<p>Overall, I found the CPSA certification to be a valuable learning experience as it highlighted the gaps in my fundamental knowledge that I need to work on. While the exam was not overly technical, it did require a solid understanding of the core concepts and some memorization work, serving as a good refresher for the basics.</p>]]></content>
        <category label="Certification" term="Certification"/>
        <category label="Ethical Hacking" term="Ethical Hacking"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[OSCP Learning Points]]></title>
        <id>https://tidtad8.github.io/blog/oscp-journey</id>
        <link href="https://tidtad8.github.io/blog/oscp-journey"/>
        <updated>2024-08-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[OSCP Certificate]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="OSCP Certificate" src="https://tidtad8.github.io/assets/images/oscp-2bee9af3b919ef846885287ea51f85fe.png" width="1099" height="845" class="img_ev3q">
I wanted to learn the basics of penetration testing for some time, and had my eye on OSCP.
But I started off with a TryHackMe subcription and cleared the Junior Penetration Tester path 1st.
Now I feel that maybe it would've been better to jump stright to OSCP instead.</p>
<p>I started my exam at 2pm that Sunday, and managed to clear the 2 independent machines with relative ease. I took a break for dinner and continued working on the remaining independent machine and the AD set. About 2 hours passed and I did not make much progress for both. Frustrated, I took a step back to review the uncovered information and tools at my disposal. I decided to try a different tool and managed to gain an initial foothold in the last independent machine. Not long after, I managed to get root, thereby granting me the remaining 20 points I needed to pass (plus the 10 bonus points). It was about 12am. I spent a few hours organizing information and ensuring I had the screenshots for the report before deciding to attempt the AD set. However, I did not manage to complete it before the time ran out.</p>
<p>I started my subscription in Aug 2023 and took my exam on July 2024, a really slow pace but I passed on my 1st try nonetheless.
Looking back, while taking the course I could've done a few things better:</p>
<ul>
<li class="">Clear all the capstone exercises</li>
<li class="">Write notes for modules exercises</li>
<li class="">Make use of OffSec discord server earlier</li>
<li class="">If possible, have a study buddy</li>
</ul>
<p>I felt that the course provided me with the basic knowledge on pentesting various systems, but I felt that it only scratched the surface. I constantly struggled to juggle various commitments while studying for OSCP, and had many moments of self doubt and uncertainty. But I'm glad I trusted the process and tried my hardest. I still have much to learn, and I look forward to my next certification.</p>]]></content>
        <category label="Certification" term="Certification"/>
        <category label="Ethical Hacking" term="Ethical Hacking"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Simple Network Sniffer & Packet Analyzer]]></title>
        <id>https://tidtad8.github.io/blog/network-sniffer</id>
        <link href="https://tidtad8.github.io/blog/network-sniffer"/>
        <updated>2023-12-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Simple Network Sniffer & Packet Analyzer]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Simple Network Sniffer &amp;amp; Packet Analyzer " src="https://tidtad8.github.io/assets/images/network-sniffer-5bd80f5b9ca07cec48dcc4db6c8ad965.jpg" width="1280" height="960" class="img_ev3q"></p>
<p>Network sniffer and packet analyzer for detecting malicious network activity and victim connections to rogue APs.</p>
<p>Implemented on a Raspberry Pi Pico W that captures MDPU frames by customizing firmware of the ESP32 WiFi module.</p>
<p>The frames are then parsed and analyzed for malicious activity, such as deauthentication attacks and rogue APs.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="overview-of-functionality">Overview of Functionality<a href="https://tidtad8.github.io/blog/network-sniffer#overview-of-functionality" class="hash-link" aria-label="Direct link to Overview of Functionality" title="Direct link to Overview of Functionality" translate="no">​</a></h2>
<ul>
<li class="">Real-time Packet Sniffing</li>
<li class="">Data Storage with SD Card</li>
<li class="">Web-based dashboard accessible through a Wi-Fi module to view captured data</li>
<li class="">Console Interface to invoke backend functions directly</li>
<li class="">Data parser for attack pattern matching</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mdpu-frames">MDPU Frames<a href="https://tidtad8.github.io/blog/network-sniffer#mdpu-frames" class="hash-link" aria-label="Direct link to MDPU Frames" title="Direct link to MDPU Frames" translate="no">​</a></h2>
<p><a href="https://howiwifi.com/2020/07/13/802-11-frame-types-and-formats/#:~:text=There%20are%20three%20types%20of,the%20layer%203%2D7%20information.">MDPU frames</a> are a type of management frame used in Wi-Fi networks. They are used to manage the connection between devices and access points. By capturing these frames, we can analyze the network traffic and detect any malicious activity.</p>
<p>There are 3 categories of MDPU frames:</p>
<ol>
<li class="">
<p>Management Frames – Used to establish and maintain the connection between devices and access points.</p>
</li>
<li class="">
<p>Control Frames – Used to control the flow of data between devices and access points.</p>
</li>
<li class="">
<p>Data Frames – Used to transmit data between devices and access points.</p>
</li>
</ol>
<p>Each of these frames contains information about the network, such as the SSID, MAC address, and signal strength. By analyzing this information, we can detect any suspicious activity on the network. They have their own unique structure and are transmitted at different times during the connection process, with their own subtypes.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="raspberry-pi-pico-w">Raspberry Pi Pico W<a href="https://tidtad8.github.io/blog/network-sniffer#raspberry-pi-pico-w" class="hash-link" aria-label="Direct link to Raspberry Pi Pico W" title="Direct link to Raspberry Pi Pico W" translate="no">​</a></h2>
<p>To capture the MDPU frames, we used a Raspberry Pi Pico W, a microcontroller board based on the RP2040 microcontroller. The Raspberry Pi Pico W has built-in Wi-Fi capabilities, which allow it to capture the frames transmitted over the network.</p>
<p>Custom firmware was developed for the ESP32 WiFi module using <a href="https://github.com/seemoo-lab/nexmon">the Nexmon project</a> to enable promiscuous mode.</p>
<p>The Pico W comes with an SD card slot. A SD card is used to store the captured MDPU frames. The Raspberry Pi Pico W is connected to the ESP32 WiFi module via UART, which allows it to capture the frames transmitted over the network.</p>
<p>A list of APs and clients is maintained, along with the number of times they have been seen in the captured frames due to the limited memory of the Raspberry Pi Pico W.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="simple-frame-parsing-algorithm">Simple Frame Parsing Algorithm<a href="https://tidtad8.github.io/blog/network-sniffer#simple-frame-parsing-algorithm" class="hash-link" aria-label="Direct link to Simple Frame Parsing Algorithm" title="Direct link to Simple Frame Parsing Algorithm" translate="no">​</a></h2>
<p>A simple algorithm is used to parse the captured MDPU frames and extracts the relevant information from them. The algorithm is based on the structure of the MDPU frames and the information they contain.</p>
<p><img decoding="async" loading="lazy" alt="Frame Parsing Algorithm" src="https://tidtad8.github.io/assets/images/frame-parsing-flow-chart-817a4f21746161639f0cefba80e7658e.jpg" width="782" height="1121" class="img_ev3q"></p>
<p>Different catergories of MDPU frames are parsed differently.
If the max AP/Client count is reached, the oldest entry is removed. The parsed data is then stored in a data structure for further analysis.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="pattern-matching">Pattern Matching<a href="https://tidtad8.github.io/blog/network-sniffer#pattern-matching" class="hash-link" aria-label="Direct link to Pattern Matching" title="Direct link to Pattern Matching" translate="no">​</a></h2>
<p>The parsed data is analyzed against certain patterns of MDPU frames to detect malicious activity.</p>
<ol>
<li class="">
<p>A temporary frame object is created in memory to store the parsed data.</p>
</li>
<li class="">
<p>Detect the frame type and subtype to create either an access point or client record object.</p>
</li>
<li class="">
<p>Perform pattern matching to detect malicious activity.</p>
<ul>
<li class="">Single frame subtype patterns<!-- -->
<ul>
<li class="">Rogue Access Points<!-- -->
<ul>
<li class="">Beacon Flood: Lure victims to connect to rogue AP</li>
</ul>
</li>
<li class="">Rogue Clients<!-- -->
<ul>
<li class="">Probe Request Flood: Might indicate network scanning</li>
<li class="">Authentication Flood: Might indicate authentication bruteforce on AP</li>
</ul>
</li>
</ul>
</li>
<li class="">Sequential Frame Analysis<!-- -->
<ul>
<li class="">Detect 4-way Handshake – Indicate connections between rogue AP and victim clients</li>
</ul>
</li>
</ul>
</li>
<li class="">
<p>Update flags in AP/Client record objects to indicate as rogue AP or victim client if a pattern is detected.</p>
</li>
</ol>
<p>The pattern matching detection is limited to the following:</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="rogue-ap---beacon-flood-detection">Rogue AP - Beacon Flood Detection<a href="https://tidtad8.github.io/blog/network-sniffer#rogue-ap---beacon-flood-detection" class="hash-link" aria-label="Direct link to Rogue AP - Beacon Flood Detection" title="Direct link to Rogue AP - Beacon Flood Detection" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Rogue AP" src="https://tidtad8.github.io/assets/images/rogue-ap-c8af7fafae99fc82348400937f4801d0.png" width="552" height="322" class="img_ev3q"></p>
<a href="https://www.cse.wustl.edu/~jain/cse571-07/ftp/wireless_hacking/index.html">Source</a>
<p>To trick users into connecting, rogue APs broadcast the same SSID as the legitimate AP. By flooding the network with deauth frames and beacon frames, they can force clients to disconnect from the legitimate AP and connect to the rogue AP. We can detect rogue APs through their high frequency of beacon frames and deauth frames.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="rogue-client---probe-flood-detection">Rogue Client - Probe Flood Detection<a href="https://tidtad8.github.io/blog/network-sniffer#rogue-client---probe-flood-detection" class="hash-link" aria-label="Direct link to Rogue Client - Probe Flood Detection" title="Direct link to Rogue Client - Probe Flood Detection" translate="no">​</a></h3>
<p>Probe flood attacks is detected by its large number of probe requests from a rogue client to the network to overwhelm the access point and prevent legitimate clients from connecting.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="rogue-client---authentication-brute-force-detection">Rogue Client - Authentication Brute Force Detection<a href="https://tidtad8.github.io/blog/network-sniffer#rogue-client---authentication-brute-force-detection" class="hash-link" aria-label="Direct link to Rogue Client - Authentication Brute Force Detection" title="Direct link to Rogue Client - Authentication Brute Force Detection" translate="no">​</a></h3>
<p>Authentication brute force attacks is detected by its large volume and frequency of authentication requests from a rogue client to the network to guess the password of the access point.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="handshake-between-rogue-ap-and-client">Handshake between Rogue AP and Client<a href="https://tidtad8.github.io/blog/network-sniffer#handshake-between-rogue-ap-and-client" class="hash-link" aria-label="Direct link to Handshake between Rogue AP and Client" title="Direct link to Handshake between Rogue AP and Client" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Handshake Detection Flow Chart" src="https://tidtad8.github.io/assets/images/handshake-detection-flow-chart-c9abfb3347aa3be3ee04c8a33b16a5ff.jpg" width="552" height="882" class="img_ev3q"></p>
<p>The handshake detection algorithm is based on the sequence of frames exchanged between the rogue AP and the victim client. The algorithm detects the handshake by analyzing the sequence of frames exchanged between the rogue AP and the victim client.</p>
<p>Psuedo code for handshake detection:</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">function </span><span class="token function" style="color:#d73a49">check_handshake_sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">client_record</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ap_record</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> frame</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> ap_record is None</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> client_record is not rogue</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            rogue_ap_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">check_if_sending_to_rogue_ap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">client_record</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> frame</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            client_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> client_record</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> rogue_ap_id is valid</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                handshake_index </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">find_existing_handshake_sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">client_record</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> None</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> handshake_index is invalid</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> frame is from client and is authentication frame</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token function" style="color:#d73a49">initialize_handshake_sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rogue_ap_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> client_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">else</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    handshake_sequence </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_handshake_sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handshake_index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    rogue_ap_mac_address </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_mac_address</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rogue_ap_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">destination_mac_matches</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rogue_ap_mac_address</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> frame</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        next_frame_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_next_frame_id</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handshake_sequence</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> next_frame_id matches frame subtype</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">last_frame_in_sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handshake_sequence</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                                </span><span class="token function" style="color:#d73a49">mark_handshake_complete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handshake_sequence</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token keyword" style="color:#00009f">else</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                                </span><span class="token function" style="color:#d73a49">increment_next_frame_index</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handshake_sequence</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token keyword" style="color:#00009f">else</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token function" style="color:#d73a49">reset_handshake_sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handshake_sequence</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> client_record is None</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> ap_record is rogue</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            handshake_index </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">find_existing_handshake_sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">None</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ap_record</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> handshake_index is valid</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> handshake_index is </span><span class="token number" style="color:#36acaa">0</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                client_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_client_id</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handshake_index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                client_mac_address </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_client_mac_address</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">client_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">destination_mac_matches</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">client_mac_address</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> frame</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token function" style="color:#d73a49">increment_next_frame_index</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handshake_sequences</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">else</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token function" style="color:#d73a49">reset_handshake_sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handshake_index</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>]]></content>
        <category label="C Programming" term="C Programming"/>
        <category label="Embedded Systems" term="Embedded Systems"/>
        <category label="Digital Forensics" term="Digital Forensics"/>
        <category label="Wi-Fi" term="Wi-Fi"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Travel Route Generator]]></title>
        <id>https://tidtad8.github.io/blog/travel-route-generator</id>
        <link href="https://tidtad8.github.io/blog/travel-route-generator"/>
        <updated>2023-09-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Travel Route Generator]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Travel Route Generator" src="https://tidtad8.github.io/assets/images/BusGenie-eeef157910033c3077c14fb8ee442a66.jpg" width="1898" height="1032" class="img_ev3q">
Generate optimal bus routes for a given set of bus stops based on algorithm
time &amp; space complexity, and travel cost and time.</p>
<p>Algorithms used in route calculationg include Djistraka, A-Star, Genetic, and more.</p>
<p>User-friendly web and mobile applications built on Flask and React Native libraries.</p>]]></content>
        <category label="Flask" term="Flask"/>
        <category label="Python" term="Python"/>
        <category label="React Native" term="React Native"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Simple Arcade Game with LibGDX]]></title>
        <id>https://tidtad8.github.io/blog/ecorun-arcade-game</id>
        <link href="https://tidtad8.github.io/blog/ecorun-arcade-game"/>
        <updated>2023-04-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Travel Route Generator]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Travel Route Generator" src="https://tidtad8.github.io/assets/images/EcoRun-b410a61bf77ed394dbcbbc2c64a4b2dc.png" width="1913" height="989" class="img_ev3q">
Sustainable living themed game made with the LibGDX framework while applying Object Oriented Programming (OOP) concepts.</p>
<p>The first step was to create a game engine which included a game loop, rendering, and input handling. The game loop was responsible for updating the game state and rendering the game world. The rendering was done using the SpriteBatch class which allowed for efficient rendering of 2D images. Input handling was done using the InputProcessor interface which allowed for handling of keyboard and mouse input.</p>
<p>The next step was to create the game world which included the player, obstacles, and power-ups. The player was controlled using the keyboard and could move left, right, up, and down. The obstacles were randomly generated and moved from the top of the screen to the bottom. The power-ups were also randomly generated and provided the player with special abilities.</p>
<p>I implemented collision detection between the player and obstacles as well as between the player and power-ups. When the player collided with an obstacle, the game was over and the player's score was displayed. When the player collided with a power-up, the player's score was increased and the power-up was removed from the game world.</p>
<p>As it was a arcade game, I ensured efficient resource management by implementing object pooling for the projectiles, obstacles, and power-ups. This allowed for reusing objects instead of creating new ones which improved performance.</p>]]></content>
        <category label="Game Development" term="Game Development"/>
        <category label="Java" term="Java"/>
        <category label="LibGDX" term="LibGDX"/>
        <category label="Object Oriented Programming" term="Object Oriented Programming"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Video Sharing Web Application]]></title>
        <id>https://tidtad8.github.io/blog/SITube-webapp</id>
        <link href="https://tidtad8.github.io/blog/SITube-webapp"/>
        <updated>2023-04-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Travel Route Generator]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Travel Route Generator" src="https://tidtad8.github.io/assets/images/SITube-102208dae55677eebaa31ddc7206916f.png" width="1920" height="1080" class="img_ev3q">
YouTube inspired web application built on the LAMP stack.</p>
<p>The application allows users to upload, view, and share videos. Users can create accounts, upload videos, like and comment on videos, and subscribe to other users. The application also includes a search feature that allows users to search for videos by title, description, or tags.</p>
<p>The LAMP stack was used to build the application. The front-end was built using HTML, CSS, and JavaScript. The back-end was built using PHP and MySQL. The application was hosted on a Linux web server hosted on Google Cloud. NetBeans IDE was used for development, connected to the server via SFTP. MySQL Workbench was used to manage the database.</p>
<p>The first step was to design the database schema. The tables were normalized to reduce redundancy and improve data integrity. One important aspect of the database design was to ensure that the relationships between the tables were properly defined and enforced using foreign key constraints. We decided to store thumbnails as BLOBs on the database, while video files were uploaded to the server's file system and store the file path in the database.</p>
<p>Next the backend API was implemented using PHP. The API was designed to be RESTful and followed best practices for API design. As we were implementing the frontend, the web application was ensured to be responsive on mobile as well.</p>]]></content>
        <category label="JavaScript" term="JavaScript"/>
        <category label="MySQL" term="MySQL"/>
        <category label="PHP" term="PHP"/>
        <category label="Web Development" term="Web Development"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tiny Dispenser]]></title>
        <id>https://tidtad8.github.io/blog/tiny-dispenser</id>
        <link href="https://tidtad8.github.io/blog/tiny-dispenser"/>
        <updated>2022-11-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tiny Dispenser]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Tiny Dispenser" src="https://tidtad8.github.io/assets/images/TinyDispenser-cb87a5fecf85cb9ff5638e2e07174672.jpg" width="1280" height="591" class="img_ev3q">
Automated food dispenser for fish tanks that allows users to set up to 3 timings to feed via Bluetooth (BLE) connection to the device. This will provide convenience to users who might not always be home to feed their pets.
There are two main components, the dispensing device and the mobile app for setting the dispensing time.</p>
<p>Check out the project on <a href="https://youtu.be/0kXaCy5oHAU">YouTube</a></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="hardware">Hardware<a href="https://tidtad8.github.io/blog/tiny-dispenser#hardware" class="hash-link" aria-label="Direct link to Hardware" title="Direct link to Hardware" translate="no">​</a></h2>
<ul>
<li class="">01 x TinyCircuits TinyZero</li>
<li class="">01 x TinyCircuits TinyScreen TinyShield</li>
<li class="">01 x TinyCircuits Bluetooth Low Energy TinyShield (ST)</li>
<li class="">01 x TinyCircuits Servo Controller TinyShield</li>
<li class="">01 x TowerPro SG91R Servo (JR)</li>
<li class="">01 x JST-SH Male to JR Male Connector</li>
<li class="">02 x Lithium Ion Polymer Battery, 3.7V 150MAh</li>
<li class="">Custom 3D printed parts</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="libraries">Libraries<a href="https://tidtad8.github.io/blog/tiny-dispenser#libraries" class="hash-link" aria-label="Direct link to Libraries" title="Direct link to Libraries" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="tinycircuits-official-site">TinyCircuits official site<a href="https://tidtad8.github.io/blog/tiny-dispenser#tinycircuits-official-site" class="hash-link" aria-label="Direct link to TinyCircuits official site" title="Direct link to TinyCircuits official site" translate="no">​</a></h3>
<ul>
<li class="">TinyScreen.h - To run the TinyScreen module.</li>
<li class="">ServoDriver.h - To run the Servo Controller module.</li>
<li class="">STBLE.h - To run the Bluetooth Low Energy (BLE) module.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="arduino-libraries">Arduino libraries<a href="https://tidtad8.github.io/blog/tiny-dispenser#arduino-libraries" class="hash-link" aria-label="Direct link to Arduino libraries" title="Direct link to Arduino libraries" translate="no">​</a></h3>
<ul>
<li class="">SPI.h - Allows the exchange of data between the board and Serial Peripheral Interface devices. (TinyScreen)</li>
<li class="">Wire.h - Allows communication with I2C devices. (TinyScreen, Servo Controller, BLE module)</li>
<li class="">RTCZero - To keep track of time for matching to feeding timings.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="main-program">Main Program<a href="https://tidtad8.github.io/blog/tiny-dispenser#main-program" class="hash-link" aria-label="Direct link to Main Program" title="Direct link to Main Program" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Program Flow Chart" src="https://tidtad8.github.io/assets/images/program-flow-chart-274d0231a196fcbe176723475a5ac00c.png" width="738" height="603" class="img_ev3q"></p>
<p>During initialization, the program initialize the variables and peripherals. Upon connection from the mobile app via Bluetooth, the real-time clock is automatically synced.
The program main loop will constantly do the following:</p>
<ul>
<li class="">Update the real-time clock.</li>
<li class="">Dispense food if the current time matches any of the set timings.</li>
<li class="">Update set timings accordingly based on Bluetooth data received.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="tracking--storing-time">Tracking &amp; Storing Time<a href="https://tidtad8.github.io/blog/tiny-dispenser#tracking--storing-time" class="hash-link" aria-label="Direct link to Tracking &amp; Storing Time" title="Direct link to Tracking &amp; Storing Time" translate="no">​</a></h3>
<p>We define a timeData struct from variable.h that is used for the tracking of the current time with the RTC library.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">timeData</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    byte seconds</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    byte minutes</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    byte hours</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    byte day</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    byte month</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    byte year</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<br>
<p>The timings are set by creating and initializing <code>td[4]</code>, an array of size 4, and setting the default dispense timings to <code>0600</code>, <code>1200</code>, and <code>1800</code>.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Set date &amp; time for actual time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">seconds</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minutes</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hours</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">day</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">month</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">year</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Set date &amp; time for 1st feeding time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">seconds</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minutes</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hours</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">day</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">month</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">year</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">02</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><br></span></code></pre></div></div>
<br>
<p>The RTC time is updated to be displayed on the screen. The <code>TimingX</code> variables are used to store the default timings or previous set timings and return to the mobile app.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setTime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hours</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minutes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setTime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">day</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">month</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">year</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> Timing1</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0600"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> Timing1</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1200"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> Timing1</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1800"</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="handling-bluetooth-data">Handling Bluetooth Data<a href="https://tidtad8.github.io/blog/tiny-dispenser#handling-bluetooth-data" class="hash-link" aria-label="Direct link to Handling Bluetooth Data" title="Direct link to Handling Bluetooth Data" translate="no">​</a></h3>
<p>Upon establishing a Bluetooth connection with the mobile app, the device will send the previous set timings, or default if no timing was set before. We create an 18-character array called <code>data[]</code> with <code>A</code>, <code>B</code>, and <code>C</code> in positions 0, 6, and 12 which represent the start point of timings 1, 2, and 3 respectively.</p>
<p><img decoding="async" loading="lazy" alt="Outgoing Data Format" src="https://tidtad8.github.io/assets/images/outgoing-data-format-0eabe1ec4b3f4cff3a182d61eaa56358.png" width="937" height="315" class="img_ev3q"></p>
<br>
<p>We then use for loops to assign the stored timing data from <code>TimingX</code> variables to <code>data[]</code> at positions 1 - 4, 7 - 10, and 13 - 16, with whitespace in between each timing. Before sending, <code>data[]</code> is converted into ASCII for handling in the mobile application. Finally, the <code>lib_aci_send_data() </code>function from <code>UART.ino</code> handles the sending of data. These operations are performed in <code>sendBackTiming()</code>.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sendBackTiming</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">void</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">18</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"A     B     C    "</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// loop through Timing1 time, insert into data. format A1234. </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// First timing 1234pm</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Timing1</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// loop through Timing2 time, insert into data. Eg. A1234 B1330. </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// First timing 12.34pm second timing 1.30pm.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token number" style="color:#36acaa">12</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Timing2</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// loop through Timing3 time, insert into data. Eg. A1234 B1330 C1830.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// First timing 12.34pm, second timing 1.30pm, third timing 6.30pm.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">13</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token number" style="color:#36acaa">17</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Timing3</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">13</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Convert to ascii</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token function" style="color:#d73a49">strlen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// initalize sendBuffer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">uint8_t</span><span class="token plain"> sendBuffer</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">21</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">uint8_t</span><span class="token plain"> sendLength </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// As data will always be 17 characters long loop and insert into sendBuffer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sendLength </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">17</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        sendBuffer</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">sendLength</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">sendLength</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        sendLength</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sendBuffer</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">sendLength</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token char">'\0'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//Terminate string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sendLength</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Method called to send data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token function" style="color:#d73a49">lib_aci_send_data</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">PIPE_UART_OVER_BTLE_UART_TX_TX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">uint8_t</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">sendBuffer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sendLength</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        SerialMonitorInterface</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">println</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">F</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"TX dropped!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<br>
<p>The Bluetooth data received from the mobile app is in the following format as illustrated in Figure 3. The current time data is identified by the preceding <code>D</code>, followed by the DateTime data. The dispensing timing data set by the user are differentiated by the preceding <code>TimingX</code> followed by the time data.</p>
<p><img decoding="async" loading="lazy" alt="Recieved Data Format" src="https://tidtad8.github.io/assets/images/recieved-data-format-14ea6544673d1790df43c9f170905a6e.png" width="943" height="412" class="img_ev3q"></p>
<br>
<p>If the data received is the current time, the <code>updateTime()</code> function is used, passing the Bluetooth data in <code>ble_rx_buffer[]</code> incremented by 1. This will pass the time values without the preceding <code>D</code> identifier.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// When any data is received</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ble_rx_buffer_len</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Identifer preceeding current time data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ble_rx_buffer</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token char">'D'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        SerialMonitorInterface</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">println</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Setting time"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// data +1 to exclude identifier</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">updateTime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ble_rx_buffer</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">sendBackTiming</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<br>
<p>We use <code>strtol()</code> to tokenize the time values separated by whitespace assigned to the timeData variable <code>td[0]</code>. For the next <code>strtol()</code> call the next will point to the whitespace, which would be skipped and parse the next value.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Update the current time on device</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">updateTime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">uint8_t</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">M</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">d</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">k</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">m</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> next</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Get timing parameters from received data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    y </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">strtol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">b</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    M </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">strtol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    d </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">strtol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    k </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">strtol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    m </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">strtol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    s </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">strtol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">next</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Store current time data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">seconds</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minutes</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">m</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hours</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">k</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">day</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">d</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">month</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">M</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">year</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">22</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Update current time on device</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setTime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hours</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minutes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">seconds</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setDate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">day</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">month</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">year</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<br>
<p>If the first character of the data is not <code>D</code>, then the program will check if the identifier is <code>1</code>, <code>2</code>, or <code>3</code>. We make compare the value of the character in position 6 of the Bluetooth data, we then use <code>memcpy()</code> to extract:</p>
<ol>
<li class="">The full timing in <code>hhmm</code> to <code>TimingX[]</code> variable</li>
<li class="">The hour and minute separately to set as respective <code>td[i]</code>.</li>
</ol>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Modify timing variables based on identifer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ble_rx_buffer</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token char">'1'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    SerialMonitorInterface</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">println</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Case 1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Set value of Timing1 for sending time to mobile app.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">memcpy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Timing1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ble_rx_buffer</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Get hour of Timing1 (hh)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> firstTwoChar</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">memcpy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">firstTwoChar</span><span class="token punctuation" style="color:#393A34">,</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ble_rx_buffer</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Get minutes of Timing1 (mm)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> lastTwoChar</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">memcpy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lastTwoChar</span><span class="token punctuation" style="color:#393A34">,</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ble_rx_buffer</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Update timing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hours </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">atoi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">firstTwoChar</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minutes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">atoi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lastTwoChar</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clearWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">46</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="updating-display">Updating Display<a href="https://tidtad8.github.io/blog/tiny-dispenser#updating-display" class="hash-link" aria-label="Direct link to Updating Display" title="Direct link to Updating Display" translate="no">​</a></h3>
<p>We have 2 functions in the main loop that handles the displaying of the current DateTime and set timings to the screen in the layout. The <code>setCursor()</code> function is used for positioning.</p>
<p><img decoding="async" loading="lazy" alt="Screen Display Layout" src="https://tidtad8.github.io/assets/images/screen-display-layout-0cf595e407e7d948fa5e6de29e4e81fc.png" width="635" height="526" class="img_ev3q"></p>
<br>
<p>In function <code>printTime()</code>, the current day, month, year, hour, minute, and second is retrieved from the RTC and written to the character array temp1 using <code>sprintf()</code>, adding <code>0</code> to a single digit parameter, before printing to display.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Display Date and time on screen</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">printTime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">void</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setFont</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">liberationSansNarrow_8ptFontInfo</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setCursor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%02d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getDay</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%02d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getMonth</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%02d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getYear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setCursor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">12</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%02d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getHours</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">":"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%02d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getMinutes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">":"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%02d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getSeconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<br>
<p>In the function <code>printFeedTime()</code>, we use a for loop for obtaining set timings 1,2,3 from timeData variable <code>td[4]</code>. The <code>sprintf()</code> function is used to write the hour and minute of the time data in <code>td[i]</code> to character array <code>temp1</code> and <code>temp2</code> respectively, before combining using <code>strcpy()</code> and <code>strcat()</code> into array <code>tempcombine[10]</code> to be displayed.
As these functions are called in the main loop, this ensures that the RTC and timing updates are reflected on the screen.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Display the 3 timings to dispense food</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">printFeedTime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">timeData </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// display.drawRect(50,10,46,40,1,0x6D);</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setCursor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Feeding"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">fontColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0x1F</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0x0000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setCursor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">12</span><span class="token operator" style="color:#393A34">+</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">12</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%02d:"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hours</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">sprintf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temp2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%02d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minutes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">char</span><span class="token plain"> tempcombine</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">strcpy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tempcombine</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> temp1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">strcat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tempcombine</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> temp2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// tempcombine is the feeding time string in the format hhmm e.g. 2330</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        display</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tempcombine</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<br>
<p>The <code>checkifFeedTime()</code> function uses a for loop to compare the set timings stored in timeData variable <code>td[4]</code> to the current time obtained from the RTC. <code>rtc.getSeconds()</code> is set to 0 as it would otherwise cause the servo to rotate continuously.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Dispense food if the current time matches any of the set timings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">checkifFeedtime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Loop through td that stores the 3 timings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getSeconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">==</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getMinutes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">==</span><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">minutes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rtc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getHours</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">==</span><span class="token plain">td</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hours</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">dispense</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<br>
<p>The <code>dispense()</code> function is called when the time matches to dispense food by rotating the servo, set to rotate 90 degrees and back.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dispense</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    servo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setServo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">750</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    servo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setServo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">750</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    servo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setServo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">750</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    servo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setServo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">750</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">delay</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    servo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setServo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1750</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    servo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setServo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1750</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    servo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setServo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1750</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    servo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setServo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1750</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mobile-application">Mobile Application<a href="https://tidtad8.github.io/blog/tiny-dispenser#mobile-application" class="hash-link" aria-label="Direct link to Mobile Application" title="Direct link to Mobile Application" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ui--functionality">UI &amp; Functionality<a href="https://tidtad8.github.io/blog/tiny-dispenser#ui--functionality" class="hash-link" aria-label="Direct link to UI &amp; Functionality" title="Direct link to UI &amp; Functionality" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Mobile App Screens" src="https://tidtad8.github.io/assets/images/mobile-app-screens-c37554445e63cadd3d5b5180b160f213.png" width="1331" height="733" class="img_ev3q"></p>
<p>MIT app inventor was used to create a simple mobile application for setting the dispenser feed time. The functions are as follows, with the respective code blocks.</p>
<ol>
<li class="">Datetime data to be synced with the device and Bluetooth connection status.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Get the current phone time" src="https://tidtad8.github.io/assets/images/G1-get-current-phone-time-a25cb6976281c94d68cdfb5eef4e292b.png" width="952" height="561" class="img_ev3q"></p>
<ol start="2">
<li class="">Scan for Bluetooth devices (ID = scan).</li>
<li class="">View available devices after scanning (ID = avail_device).</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Scan and retrieve available Bluetooth devices" src="https://tidtad8.github.io/assets/images/G2-bluetooth-scanning-ca4bca5d25c044cdfd8bdb572fffc29e.png" width="853" height="518" class="img_ev3q"></p>
<ol start="4">
<li class="">List of available Bluetooth devices to connect to from. Upon connection, the current time is sent to the device, and the app listens to any sent from the device. If any, the previous set timing is received from the device and is displayed on the time picker textbox.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Listen for any data sent from the device" src="https://tidtad8.github.io/assets/images/G3-listen-for-data-b3320bc2e43ca88d55a694dd0bac52f7.png" width="937" height="492" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Retrieve set timing data" src="https://tidtad8.github.io/assets/images/G4-retrieve-feed-timings-49682f3bdba17babed6ac56eba2f5748.png" width="663" height="946" class="img_ev3q"></p>
<ol start="5">
<li class="">UI will update to show the disconnect button (ID = disconnect).</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Terminate Bluetooth connection" src="https://tidtad8.github.io/assets/images/G5-terminate-bluetooth-connection-6d5878c3042ce28a4d45c227804cb5e6.png" width="913" height="638" class="img_ev3q"></p>
<ol start="6">
<li class="">Timepicker to set timings (ID = TimePicker1/2/3) in the set timing screen. Previously set timings are retrieved from the device, not reflected in the screenshot.</li>
<li class="">Timepicker interface. When selecting the time from the time picker, we perform a join operation on any single-digit hour or minute value, which always results in a 4-digit value. Upon pressing ‘OK’, the timing will be sent to the device. Timing will not be set if it is the same as the current time.</li>
<li class="">Selected timings are updated on the textbox.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Select &amp;amp; set feed time with timepicker" src="https://tidtad8.github.io/assets/images/G6-select-and-set-timepicker-4bb4554f241902f11fafc5536b70175e.png" width="1137" height="777" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="uuids">UUIDs<a href="https://tidtad8.github.io/blog/tiny-dispenser#uuids" class="hash-link" aria-label="Direct link to UUIDs" title="Direct link to UUIDs" translate="no">​</a></h3>
<p>To send and receive Bluetooth data, we utilize the Nordic UART Service. The 128-bit Service UUID (Universally Unique Identifier) and Characteristic UUID for uniquely identifying information are defined in the UART.ino.</p>
<p><img decoding="async" loading="lazy" alt="Service &amp;amp; Characteristics UUIDs in UART.ino" src="https://tidtad8.github.io/assets/images/service-and-characteristic-uuids-94e0e387090434a487d98b94562a8b0e.png" width="518" height="532" class="img_ev3q"></p>
<br>
<p>In the mobile app, we attach these UUIDs to the Bluetooth Low Energy (BLE) object to perform Bluetooth transmissions.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">          Service: 6e400001-b5a3-f393-e0a9-e50e24dcca9e</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RX Characteristic: 6e400002-b5a3-f393-e0a9-e50e24dcca9e</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TX Characteristic: 6e400003-b5a3-f393-e0a9-e50e24dcca9e</span><br></span></code></pre></div></div>
<ul>
<li class="">(xxxxxxx1) is always the Service UUID</li>
<li class="">(xxxxxxx2) is the Characteristic UUID for sending data (TX)</li>
<li class="">(xxxxxxx3) is the Characteristic UUID for receiving data(RX).</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="photos">Photos<a href="https://tidtad8.github.io/blog/tiny-dispenser#photos" class="hash-link" aria-label="Direct link to Photos" title="Direct link to Photos" translate="no">​</a></h2>
<p><i>Testing rotation mechanism with prototype 1</i>
<img decoding="async" loading="lazy" alt="Testing rotation mechanism with prototype 1" src="https://tidtad8.github.io/assets/images/prototype-1-testing-rotation-mechanism-8661139475b9ee46d72581ec6b578955.png" width="623" height="517" class="img_ev3q"></p>
<br>
<p><i>Front view of prototype 2</i>
<img decoding="async" loading="lazy" alt="Front view of prototype 2" src="https://tidtad8.github.io/assets/images/prototype-2-front-view-22c43642af5a2b61189229134e82c1cd.png" width="703" height="502" class="img_ev3q"></p>
<br>
<p><i>Internal view of prototype 2</i>
<img decoding="async" loading="lazy" alt="Internal view of prototype 2" src="https://tidtad8.github.io/assets/images/prototype-2-internal-view-c1d5c485fc0388a91490cd3317339df0.png" width="636" height="647" class="img_ev3q"></p>
<br>
<p><i>3d model design using TinkerCad</i>
<img decoding="async" loading="lazy" alt="3D model design with TinkerCad" src="https://tidtad8.github.io/assets/images/3d-model-design-tinkercad-5d7e16ba8b6ac97c6f84af97b70c0ddf.png" width="698" height="758" class="img_ev3q"></p>
<br>
<p><i>Final prototype</i>
<img decoding="async" loading="lazy" alt="Final 3D printed prototype" src="https://tidtad8.github.io/assets/images/prototype-3-final-3d-printed-f8d2b91b591ebfa2e70657ec606d571d.png" width="575" height="395" class="img_ev3q"></p>
<br>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="similar-work">Similar Work<a href="https://tidtad8.github.io/blog/tiny-dispenser#similar-work" class="hash-link" aria-label="Direct link to Similar Work" title="Direct link to Similar Work" translate="no">​</a></h2>
<ul>
<li class="">Smartwatch project by TinyCiruits - We made use of the UART.ino library used in this project to implement our Bluetooth Low Energy (BLE) functionality (Ref 7, 10). The project also utilizes the RTCZero library that is compatible with the TinyZero board which tracks DateTime (Ref 4).</li>
<li class="">Cat Feeder by Alexander (Sasha) Ulitin - This project was used as a reference for the physical design of the dispenser (Ref 13).</li>
<li class="">MIT App Inventor mobile app projects -  The implementation of Bluetooth in these projects were used as a reference for piecing together the BLE functionality in our app (Ref 15, 16).</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="references">References<a href="https://tidtad8.github.io/blog/tiny-dispenser#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<ol>
<li class="">C Library Function - strtol(). Tutorials Point. (n.d.). Retrieved November 2, 2022, from <a href="https://www.tutorialspoint.com/c_standard_library/c_function_strtol.htm" target="_blank" rel="noopener noreferrer" class="">https://www.tutorialspoint.com/c_standard_library/c_function_strtol.htm</a></li>
<li class="">C struct. Programiz. (n.d.). Retrieved November 2, 2022, from <a href="https://www.programiz.com/c-programming/c-structures" target="_blank" rel="noopener noreferrer" class="">https://www.programiz.com/c-programming/c-structures</a></li>
<li class="">Nordic Semiconductor. (n.d.) UART/Serial Port Emulation over BLE planetleak. (2014, February 27).</li>
<li class="">App Inventor 2 tutorial - android receive data from Arduino via HC-06 bluetooth. YouTube. Retrieved November 2, 2022, from <a href="https://www.youtube.com/watch?v=xjtxrxVauZg" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=xjtxrxVauZg</a>
RTCZero. RTCZero - Arduino Reference. (n.d.). Retrieved November 2, 2022, from <a href="https://www.arduino.cc/reference/en/libraries/rtczero/" target="_blank" rel="noopener noreferrer" class="">https://www.arduino.cc/reference/en/libraries/rtczero/</a></li>
<li class="">SPI. SPI - Arduino Reference. (n.d.). Retrieved November 2, 2022, from <a href="https://www.arduino.cc/reference/en/language/functions/communication/spi/" target="_blank" rel="noopener noreferrer" class="">https://www.arduino.cc/reference/en/language/functions/communication/spi/</a></li>
<li class="">TinyCircuits . (n.d.). TinyZero setup tutorial. TinyCircuits Docs. Retrieved November 2, 2022, from
<a href="https://learn.tinycircuits.com/Processors/TinyZero_Setup_Tutorial/" target="_blank" rel="noopener noreferrer" class="">https://learn.tinycircuits.com/Processors/TinyZero_Setup_Tutorial/</a></li>
<li class="">TinyCircuits. (2016, March 14). TinyScreen functions. O Watch - A Smart Watch Kit for Kids. Retrieved November 2, 2022, from <a href="http://theowatch.com/learn/o-watch-tinyscreen-programming/tinyscreen-functions/" target="_blank" rel="noopener noreferrer" class="">http://theowatch.com/learn/o-watch-tinyscreen-programming/tinyscreen-functions/</a></li>
<li class="">TinyCircuits. (n.d.). Bluetooth Low Energy TinyShield (ST) tutorial. TinyCircuits Docs. Retrieved November 2, 2022, from <a href="https://learn.tinycircuits.com/Communication/Bluetooth-Low-Energy_TinyShield_Tutorial/" target="_blank" rel="noopener noreferrer" class="">https://learn.tinycircuits.com/Communication/Bluetooth-Low-Energy_TinyShield_Tutorial/</a></li>
<li class="">TinyCircuits. (n.d.). Servo controller tinyshield tutorial. TinyCircuits Docs. Retrieved November 2, 2022, from <a href="https://learn.tinycircuits.com/Motors/Servo-Controller_TinyShield_Tutorial/" target="_blank" rel="noopener noreferrer" class="">https://learn.tinycircuits.com/Motors/Servo-Controller_TinyShield_Tutorial/</a></li>
<li class="">TinyCircuits. (n.d.). TinyScreen Smart Watch Kit.</li>
<li class="">TinyCircuits. Retrieved November 2, 2022, from <a href="https://tinycircuits.com/products/tinyscreen-smart-watch-kit" target="_blank" rel="noopener noreferrer" class="">https://tinycircuits.com/products/tinyscreen-smart-watch-kit</a></li>
<li class="">TinyCircuits. (n.d.). TinyScreen TinyShield. TinyCircuits Docs. Retrieved November 2, 2022, from
<a href="https://learn.tinycircuits.com/Display/TinyScreen_TinyShield_Tutorial/" target="_blank" rel="noopener noreferrer" class="">https://learn.tinycircuits.com/Display/TinyScreen_TinyShield_Tutorial/</a></li>
<li class="">TinyCircuits. (n.d.). TinyScreenReferenceManual.  TinyCircuits. Retrieved from <a href="https://usermanual.wiki/Pdf/TinyScreenReferenceManual.1153252474.pdf" target="_blank" rel="noopener noreferrer" class="">https://usermanual.wiki/Pdf/TinyScreenReferenceManual.1153252474.pdf</a></li>
<li class="">Ulitin, A. S. (2017, December 25). How to build a smart arduino cat feeder. YouTube. Retrieved November 2, 2022, from
<a href="https://www.youtube.com/watch?v=dqr-AT5HvyM" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=dqr-AT5HvyM</a></li>
<li class="">Wire. Wire - Arduino Reference. (n.d.). Retrieved November 2, 2022, from <a href="https://www.arduino.cc/en/Reference/Wire" target="_blank" rel="noopener noreferrer" class="">https://www.arduino.cc/en/Reference/Wire</a></li>
<li class="">YouTube. (2016, July 4). App Inventor 2 : Android receive data from Arduino via Bluetooth. YouTube. Retrieved November 2, 2022, from <a href="https://www.youtube.com/watch?v=0EnRCeLV_0o" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=0EnRCeLV_0o</a></li>
<li class="">YouTube. (2016, October 12). Create a bluetooth app and control the Arduino. YouTube. Retrieved November 2, 2022, from
<a href="https://www.youtube.com/watch?v=evVRCL9-TWs" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=evVRCL9-TWs</a></li>
</ol>]]></content>
        <category label="3D Printing" term="3D Printing"/>
        <category label="C++ Programming" term="C++ Programming"/>
        <category label="Embedded Systems" term="Embedded Systems"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Resale Flat Data Visualization & Analysis Dashboard]]></title>
        <id>https://tidtad8.github.io/blog/python-dashboard</id>
        <link href="https://tidtad8.github.io/blog/python-dashboard"/>
        <updated>2022-10-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Resale Flat Data Visualization & Analysis Dashboard]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Resale Flat Data Visualization &amp;amp; Analysis Dashboard" src="https://tidtad8.github.io/assets/images/PythonDashboard-4be198e223ecfb78f018470fd31a2bad.jpg" width="1342" height="712" class="img_ev3q">
Dashboard providing valuable insights through visualization and analysis of resale flat data in Singapore.</p>
<p>The dashboard provides insights into the resale flat market in Singapore, including trends in resale prices, locations, and more.</p>
<p>Built with Python packages: Pandas for data manipulation, Plotly for data visualization; Run on a Flask server.</p>
<p>The resale flat data was obtained from the Singapore government's data.gov.sg website. The data was cleaned and processed using Pandas to remove missing values and outliers. The data was then visualized using Plotly to create interactive plots that allow users to explore the data in more detail. Different types of plots were used to visualize the data, including line plots, scatter plots, and bar plots.</p>
<p>The main findings were that resale flat prices have been increasing over the years, with certain locations having higher prices than others. The dashboard also showed that certain flat types are more popular than others, with 4-room flats being the most common. The dashboard also included a heat map that showed the distribution of resale flats across Singapore.</p>]]></content>
        <category label="Flask" term="Flask"/>
        <category label="Pandas" term="Pandas"/>
        <category label="Plotly" term="Plotly"/>
        <category label="Python" term="Python"/>
    </entry>
</feed>