{"id":29998,"date":"2021-06-28T09:36:07","date_gmt":"2021-06-28T09:36:07","guid":{"rendered":"http:\/\/onlineclassesguru.com\/?p=29998"},"modified":"2021-06-28T09:36:07","modified_gmt":"2021-06-28T09:36:07","slug":"morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an","status":"publish","type":"post","link":"https:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/","title":{"rendered":"Morse  beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages."},"content":{"rendered":"<style type=\"text\/css\"><\/style><p><strong>Morse\u00a0<\/strong>\u00a0<strong>beeper<\/strong>\u00a0is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive\u00a0<strong>morse code<\/strong>\u00a0messages.<\/p>\n<p>This project involves interfacing with an\u00a0<strong>LCD<\/strong>\u00a0screen, a\u00a0<strong>radio<\/strong>\u00a0module, the\u00a0<strong>EEPROM<\/strong>, and a\u00a0<strong>buzzer<\/strong>. We also design and implement an easy to navigate user interface in a constrained 16\u00d72 screen while managing external\u00a0<strong>interrupts<\/strong>\u00a0and handling data\u00a0<strong>storage<\/strong>.<\/p>\n<p>In the end, all devices that follow this guideline should be able to communicate as described in this document.<\/p>\n<p><strong>What you will need:<\/strong><\/p>\n<ul>\n<li>Arduino LCD Keypad Shield<\/li>\n<li>Piezo Buzzer<\/li>\n<li>NRF24L01+ module<\/li>\n<\/ul>\n<p><strong>In the process you will:<\/strong><\/p>\n<ul>\n<li>Interface with a\u00a0<strong>Liquid Crystal Display<\/strong>\u00a0(LCD) component.<\/li>\n<li>Use a voltage divider as an\u00a0<strong>analog input<\/strong>\u00a0to detect button presses.<\/li>\n<li>Interface with an\u00a0<strong>NRF2401L+<\/strong>\u00a0module via SPI to communicate with other modules.<\/li>\n<li>Use\u00a0<strong>interrupts<\/strong>\u00a0to process incoming messages.<\/li>\n<li>Interface with a piezo\u00a0<strong>buzzer<\/strong>\u00a0to notify user of events.<\/li>\n<li>Interface with the Arduino\u2019s\u00a0<strong>EEPROM<\/strong>\u00a0to store long-term data that can be retrieved after a power cycle.<\/li>\n<li>Use the\u00a0<strong>Watchdog Timer<\/strong>\u2018s jitter to generate random byte sequences.<\/li>\n<li>Implement a beeper as a\u00a0<strong>state machine<\/strong>.<\/li>\n<li>Apply the concept of abstractions in C++ by defining\u00a0<strong>classes<\/strong>\u00a0and instantiating\u00a0<strong>objects<\/strong>\u00a0from those classes to promote re-usability and increased efficiency.<\/li>\n<li>Use\u00a0<strong>inheritance<\/strong>\u00a0to extend Arduino\u2019s classes.<\/li>\n<li>Use\u00a0<strong>pointers<\/strong>\u00a0to handle dynamic memory allocation.<\/li>\n<\/ul>\n<p><strong>Entropy Class<\/strong><\/p>\n<p>If we compare our beeper to a cellphone you\u2019ll agree that we need to assign it a phone number. Imagine that your phone number is\u00a0321-123-4567. If you were not guaranteed that this number belonged\u00a0<strong>only<\/strong>\u00a0to you, then someone else (who shares your number) could also be getting your calls and texts.<\/p>\n<p>We use the term\u00a0<strong>universally unique identifier (UUID)<\/strong>\u00a0to refer to a number that is used to uniquely identify some entity. The probability that a\u00a0<strong>UUID<\/strong>\u00a0will be duplicated is not zero but it is low enough to be considered negligible.<\/p>\n<p>We are going to use the\u00a0Entropy\u00a0class to generate a sequence of random bytes using the\u00a0Watchdog Timer\u2019s natural jitter. These bytes will become our unique identifier. You can find the class\u00a0<a href=\"https:\/\/sites.google.com\/site\/astudyofentropy\/file-cabinet\/Entropy-v1.0.2.zip?attredirects=0&amp;d=1\">here<\/a>.<\/p>\n<p><strong>NR24 Class<\/strong><\/p>\n<p>The\u00a0nRF24L01+\u00a0is a single chip radio transceiver that operates in the 2.4 \u2013 2.5 GHz band. It features ultra low power consumption and speeds up to 2 Mbps. We need to use a microcontroller to configure this radio through a\u00a0<strong>Serial Peripheral Interface (SPI)<\/strong>. You can download the datasheet\u00a0<a href=\"https:\/\/www.sparkfun.com\/datasheets\/Components\/SMD\/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf\">here<\/a>.<\/p>\n<p>The\u00a0nRF24L01+\u00a0implements the concept of data pipes.\u00a0<strong>Pipes<\/strong>\u00a0are logical channels in the physical RF\u00a0<strong>channel<\/strong>. Each pipe is assigned its own physical address for subsequent write or read operations. Each address is 40-bit long. This radio is able to write data to one pipe or to listen for data from up to six pipes.<\/p>\n<p>We need to generate a 40-bit UUID to assign to our radio\u2019s receiving data pipe to minimize the chances of two radios having the same address during lab. It is important to ensure that the address that you assign to the radio\u2019s receiving data pipe is\u00a0<strong>unique<\/strong>.<\/p>\n<p>We will use the\u00a0<a href=\"https:\/\/github.com\/nRF24\/RF24\">NR24\u00a0library<\/a>\u00a0to control the radio. Documentation for the library can be found\u00a0<a href=\"http:\/\/tmrh20.github.io\/RF24\/classRF24.html\">here<\/a>.<\/p>\n<p>The following table describes how to wire your\u00a0NRF24L01+\u00a0module.\u00a0<strong>Please note that the module can not operate at 5V.<\/strong><\/p>\n<table width=\"888\">\n<thead>\n<tr>\n<td><strong>Name<\/strong><\/td>\n<td><strong>Description<\/strong><\/td>\n<td><strong>Connected To<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>CE<\/td>\n<td>Chip Enable (RX \/ TX)<\/td>\n<td>A1<\/td>\n<\/tr>\n<tr>\n<td>CSN<\/td>\n<td>SPI Chip Select<\/td>\n<td>A2<\/td>\n<\/tr>\n<tr>\n<td>MOSI<\/td>\n<td>SPI Slave Data Input<\/td>\n<td>11 or ICSP-4<\/td>\n<\/tr>\n<tr>\n<td>MISO<\/td>\n<td>SPI Slave Data Output<\/td>\n<td>12 or ICSP-1<\/td>\n<\/tr>\n<tr>\n<td>SCK<\/td>\n<td>SPI Clock<\/td>\n<td>13 or ICSP-3<\/td>\n<\/tr>\n<tr>\n<td>IRQ<\/td>\n<td>Maskable Interrupt<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>VCC<\/td>\n<td>Power (1.9V \u2013 3.6V)<\/td>\n<td>3.3 V<\/td>\n<\/tr>\n<tr>\n<td>GND<\/td>\n<td>Ground (0V)<\/td>\n<td>GND<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>LCDKeypad Class<\/strong><\/p>\n<p>The LCD library,\u00a0<a href=\"https:\/\/www.arduino.cc\/en\/Reference\/LiquidCrystal\">LiquidCrystal<\/a>, allows you to control displays that are compatible with the\u00a0<strong>Hitachi HD 44780<\/strong>\u00a0driver.<\/p>\n<p>The LCD Keypad Shield provided looks like this:<\/p>\n<p>The following table describes which pins are used by the shield.<\/p>\n<table width=\"888\">\n<thead>\n<tr>\n<td><strong>Pin<\/strong><\/td>\n<td><strong>Description<\/strong><\/td>\n<td><strong>Pin<\/strong><\/td>\n<td><strong>Description<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>A0<\/td>\n<td>Buttons<\/td>\n<td>7<\/td>\n<td>LCD DB7<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>LCD DB4<\/td>\n<td>8<\/td>\n<td>LCD RS<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>LCD DB5<\/td>\n<td>9<\/td>\n<td>LCD Enable<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>LCD DB6<\/td>\n<td>10<\/td>\n<td>Backlight Control<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>From the picture above you can see that the shield is equipped with the following buttons:<\/p>\n<ul>\n<li>Select<\/li>\n<li>Left<\/li>\n<li>Up<\/li>\n<li>Down<\/li>\n<li>Right<\/li>\n<li>Reset<\/li>\n<\/ul>\n<p>These buttons (with the exception of the reset button) are wired to pin\u00a0A0\u00a0using a\u00a0<strong>voltage divider<\/strong>. The value at pin\u00a0A0depends on which button was pressed. A portion of the schematic is presented below.<\/p>\n<p>The\u00a0<strong>resistances<\/strong>\u00a0used in your shield might vary depending on the manufacturer. You will need this information when calculating the expected value for a button press. For instance, when button\u00a0UP\u00a0is pressed, the voltage at pin\u00a0A0\u00a0can be found using\u00a0<strong>Ohm\u2019s law<\/strong>.<\/p>\n<p>Alternatively, you can obtain this information with a multimeter or by reading the value at the pin when a button is pressed. The complete schematic can be found\u00a0<a href=\"http:\/\/image.dfrobot.com\/image\/data\/DFR0009\/LCDKeypad%20Shield%20V1.0%20SCH.pdf\">here<\/a>.<\/p>\n<p>The Arduino reads the value at the pin and provides a number ranging from\u00a00 \u2013 1023\u00a0corresponding to the input voltage. Since we calculated the voltage at pin\u00a0A0\u00a0to be\u00a00.7081 V\u00a0we can proceed to map this value to reflect the Arduino\u2019s\u00a0<strong>10-bit ADC<\/strong>\u00a0resolution. We know that\u00a05V\u00a0is represented by the decimal value\u00a01023\u00a0and that\u00a00V\u00a0is represented by\u00a00. We can now map the value accordingly using the\u00a0<strong>Rule of Three<\/strong>. We find out that the value at the pin read by the Arduino is around\u00a0144.<\/p>\n<p>You will use\u00a0<strong>inheritance<\/strong>\u00a0to create an\u00a0LCDKeypad\u00a0class which will:<\/p>\n<ul>\n<li>Extend the\u00a0LiquidCrystal\u00a0class.<\/li>\n<li>Define the following\u00a0enum\u00a0to make your code more readable:<\/li>\n<\/ul>\n<p>typedefenum {LEFT, RIGHT, UP, DOWN, SELECT, NONE} Button;<\/p>\n<ul>\n<li>Implement\u00a0<strong>debouncing<\/strong>\u00a0for the analog input wired at pin\u00a0A0. Define and implement the function\u00a0getButtonPress()which returns the button that was pressed. The function prototype is provided below.<\/li>\n<\/ul>\n<p>Button getButtonPress();<\/p>\n<p><strong>Memory Class<\/strong><\/p>\n<p>In embedded systems where no disk drive exists, non-volatile memory is typically a variant of Read-Only Memory (ROM). The\u00a0<strong>ATMega328P<\/strong>\u00a0follows a Harvard architecture, where program code and data are separated. Program code is stored in Flash. Data, on the other hand, can be found in both\u00a0<strong>SRAM<\/strong>\u00a0and\u00a0<strong>EEPROM<\/strong>. The microcontroller on the Arduino Uno board has 1KiB of\u00a0<strong>EEPROM<\/strong>\u00a0memory.<\/p>\n<p>You will be using the\u00a0<strong>EEPROM<\/strong>\u00a0to store configuration information, contacts, and messages. The table below describes the memory map implemented for this system.<\/p>\n<table width=\"888\">\n<thead>\n<tr>\n<td><strong>Address<\/strong><\/td>\n<td><strong>Value<\/strong><\/td>\n<td><strong>Purpose<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>000 \u2013 002<\/td>\n<td>0xC0FFEE<\/td>\n<td>Initialization Flag<\/td>\n<\/tr>\n<tr>\n<td>003 \u2013 017<\/td>\n<td>Contact Object<\/td>\n<td>Node\u2019s Contact: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>018 \u2013 019<\/td>\n<td>0xFACE<\/td>\n<td>Contact List Flag<\/td>\n<\/tr>\n<tr>\n<td>020<\/td>\n<td>Counter<\/td>\n<td>Number of Contacts<\/td>\n<\/tr>\n<tr>\n<td>021 \u2013 035<\/td>\n<td>Contact Object<\/td>\n<td>Contact #1: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>036 \u2013 050<\/td>\n<td>Contact Object<\/td>\n<td>Contact #2: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>051 \u2013 065<\/td>\n<td>Contact Object<\/td>\n<td>Contact #3: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>066 \u2013 080<\/td>\n<td>Contact Object<\/td>\n<td>Contact #4: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>081 \u2013 095<\/td>\n<td>Contact Object<\/td>\n<td>Contact #5: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>096 \u2013 110<\/td>\n<td>Contact Object<\/td>\n<td>Contact #6: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>111 \u2013 125<\/td>\n<td>Contact Object<\/td>\n<td>Contact #7: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>126 \u2013 140<\/td>\n<td>Contact Object<\/td>\n<td>Contact #8: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>141 \u2013 155<\/td>\n<td>Contact Object<\/td>\n<td>Contact #9: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>156 \u2013 170<\/td>\n<td>Contact Object<\/td>\n<td>Contact #10: UUID and Name<\/td>\n<\/tr>\n<tr>\n<td>171 \u2013 172<\/td>\n<td>0xCA11<\/td>\n<td>Message List Flag<\/td>\n<\/tr>\n<tr>\n<td>173<\/td>\n<td>Counter<\/td>\n<td>Number of Messages<\/td>\n<\/tr>\n<tr>\n<td>174 \u2013 186<\/td>\n<td>Message Object<\/td>\n<td>Message #1<\/td>\n<\/tr>\n<tr>\n<td>187 \u2013 199<\/td>\n<td>Message Object<\/td>\n<td>Message #2<\/td>\n<\/tr>\n<tr>\n<td>200 \u2013 212<\/td>\n<td>Message Object<\/td>\n<td>Message #3<\/td>\n<\/tr>\n<tr>\n<td>213 \u2013 225<\/td>\n<td>Message Object<\/td>\n<td>Message #4<\/td>\n<\/tr>\n<tr>\n<td>226 \u2013 238<\/td>\n<td>Message Object<\/td>\n<td>Message #5<\/td>\n<\/tr>\n<tr>\n<td>239 \u2013 251<\/td>\n<td>Message Object<\/td>\n<td>Message #6<\/td>\n<\/tr>\n<tr>\n<td>252 \u2013 264<\/td>\n<td>Message Object<\/td>\n<td>Message #7<\/td>\n<\/tr>\n<tr>\n<td>265 \u2013 277<\/td>\n<td>Message Object<\/td>\n<td>Message #8<\/td>\n<\/tr>\n<tr>\n<td>278 \u2013 290<\/td>\n<td>Message Object<\/td>\n<td>Message #9<\/td>\n<\/tr>\n<tr>\n<td>291 \u2013 303<\/td>\n<td>Message Object<\/td>\n<td>Message #10<\/td>\n<\/tr>\n<tr>\n<td>304 \u2013 316<\/td>\n<td>Message Object<\/td>\n<td>Message #11<\/td>\n<\/tr>\n<tr>\n<td>317 \u2013 329<\/td>\n<td>Message Object<\/td>\n<td>Message #12<\/td>\n<\/tr>\n<tr>\n<td>330 \u2013 342<\/td>\n<td>Message Object<\/td>\n<td>Message #13<\/td>\n<\/tr>\n<tr>\n<td>343 \u2013 355<\/td>\n<td>Message Object<\/td>\n<td>Message #14<\/td>\n<\/tr>\n<tr>\n<td>356 \u2013 368<\/td>\n<td>Message Object<\/td>\n<td>Message #15<\/td>\n<\/tr>\n<tr>\n<td>369 \u2013 381<\/td>\n<td>Message Object<\/td>\n<td>Message #16<\/td>\n<\/tr>\n<tr>\n<td>382 \u2013 394<\/td>\n<td>Message Object<\/td>\n<td>Message #17<\/td>\n<\/tr>\n<tr>\n<td>395 \u2013 407<\/td>\n<td>Message Object<\/td>\n<td>Message #18<\/td>\n<\/tr>\n<tr>\n<td>408 \u2013 420<\/td>\n<td>Message Object<\/td>\n<td>Message #19<\/td>\n<\/tr>\n<tr>\n<td>421 \u2013 433<\/td>\n<td>Message Object<\/td>\n<td>Message #20<\/td>\n<\/tr>\n<tr>\n<td>434<\/td>\n<td>Offset<\/td>\n<td>Next available spot @ &lt;Base + Offset&gt;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The memory map consists of the following sections:<\/p>\n<ol>\n<li><strong>Flags:<\/strong>\u00a0There are three flags in the memory map that get verified at every boot for\u00a0<strong>integrity<\/strong>\u00a0and\u00a0<strong>schema<\/strong>.\n<ul>\n<li><strong>Initialization Flag:<\/strong>\u00a0Consists of three bytes (000 \u2013 002) that spell\u00a00xC0FFEE. These bytes are set during the device\u2019s setup stage.<\/li>\n<li><strong>Contact List Flag:<\/strong>\u00a0Consists of two bytes (018 \u2013 019) that spell\u00a00xFACE. These bytes are set during the device\u2019s setup stage and mark the beginning of the contact list related entries in the\u00a0<strong>EEPROM<\/strong>.<\/li>\n<li><strong>Message List Flag:<\/strong>\u00a0Consists of two bytes (171 \u2013 172) that spell\u00a00xCA11. These bytes are set during the device\u2019s setup stage and mark the beginning of the message list related entries in the\u00a0<strong>EEPROM<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Counters:<\/strong>\u00a0There are two counter entries in the\u00a0<strong>EEPROM<\/strong>.\n<ul>\n<li><strong>Contact Counter<\/strong>: Keeps track the number of contacts stored in the\u00a0<strong>EEPROM<\/strong>. May hold values from 0 to 10.<\/li>\n<li><strong>Message Counter<\/strong>: Keeps track the number of messages stored in the\u00a0<strong>EEPROM<\/strong>. May hold values from 0 to 20.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Offsets:<\/strong>\u00a0There is one offset entry in the\u00a0<strong>EEPROM<\/strong>. According to the memory table above, the base address for the messages (or the address for the first message) is\u00a0174. By adding an offset to this base address we can obtain the position of any message element relative to the first one. The offset entry can store up to\u00a0<strong>8-bits<\/strong>\u00a0of information allowing you to traverse from location\u00a0174\u00a0all the way to location\u00a0429. This is useful to point to the next location available for saving a message.<\/li>\n<li><strong>Contact Objects:<\/strong>\u00a0The\u00a0<strong>EEPROM<\/strong>\u00a0stores up to 10 contact objects. These objects are\u00a0<strong>15 bytes<\/strong>\u00a0long and contain the contact\u2019s\u00a0<strong>name<\/strong>\u00a0and radio\u2019s\u00a0<strong>UUID<\/strong>. The object located at address\u00a0003\u00a0contains information regarding the node and is set during setup time. Since we only have room for ten contacts, additional contacts must not be allowed. See the\u00a0Contact\u00a0class for more information.<\/li>\n<li><strong>Message Objects:<\/strong>\u00a0The\u00a0<strong>EEPROM<\/strong>\u00a0stores up to 20 message objects. These objects are\u00a0<strong>13 bytes<\/strong>\u00a0long and contain information on the sender, the receiver, the payload, and the payload\u2019s length. Since we only have room for twenty messages in the given design, we may need to reuse\u00a0<strong>EEPROM<\/strong>\u00a0locations if we receive more than twenty messages. See the\u00a0Message\u00a0class for more information.<\/li>\n<\/ol>\n<p>You will be implementing the\u00a0Memory\u00a0class that handles writing and reading data to the\u00a0<strong>EEPROM<\/strong>. A template is provided below.<\/p>\n<p>classMemory {<\/p>\n<p>public:<\/p>\n<p>Memory();<\/p>\n<p>Memory(Contact node);<\/p>\n<p>unsignedchar* getNodeUUID();<\/p>\n<p>char* getNodeName();<\/p>\n<p>unsignedshortgetNumberContacts();<\/p>\n<p>unsignedshortgetNumberMessages();<\/p>\n<p>Contact getContact(unsignedshort index);<\/p>\n<p>Message getMessage(unsignedshort index);<\/p>\n<p>boolsaveContact(Contact contact);<\/p>\n<p>voidsaveMessage(Message message);<\/p>\n<p>voidsaveNodeInformation(Contact contact);<\/p>\n<p>\/\/ Add as you see fit<\/p>\n<p>protected:<\/p>\n<p>boolhasSchema();<\/p>\n<p>voidsetSchema();<\/p>\n<p>voidclearMessages();<\/p>\n<p>voidclearContacts();<\/p>\n<p>unsignedshortgetMessagePointerOffset();<\/p>\n<p>\/\/ Add as you see fit<\/p>\n<p>private:<\/p>\n<p>constunsignedshort MAX_CONTACTS = 10;<\/p>\n<p>constunsignedshort MAX_MESSAGES = 20;<\/p>\n<p>\/\/ Add as you see fit<\/p>\n<p>};<\/p>\n<p>Let\u2019s start explaining what each of the functions must do.<\/p>\n<ul>\n<li><strong>Memory()<\/strong><strong>:<\/strong>\u00a0Default constructor for the\u00a0Memory\u00a0class. Makes sure that the\u00a0<strong>schema<\/strong>\u00a0is set up by verifying the flag bytes. If the\u00a0<strong>schema<\/strong>\u00a0is corrupted or has never been set up, we:\n<ul>\n<li>Set the\u00a0<strong>flag<\/strong>\u00a0bytes in their appropriate location.<\/li>\n<li>Clear the locations reserved for contacts and messages.<\/li>\n<li>Reset the contact and messages counters.<\/li>\n<li>Reset the offset entry.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Memory(Contact node)<\/strong><strong>:<\/strong>\u00a0Parametrized constructor for the\u00a0Memory\u00a0class. Takes a\u00a0Contact\u00a0object as an argument. The contact object contains the information on the node\u2019s\u00a0<strong>name<\/strong>\u00a0and\u00a0<strong>UUID<\/strong>. This performs the same operations as the default constructor plus saving the\u00a0Contact\u00a0object in the space reserved for the node\u2019s\u00a0<strong>name<\/strong>\u00a0and\u00a0<strong>UUID<\/strong>.<\/li>\n<li><strong>unsigned char* getNodeUUID()<\/strong><strong>:<\/strong>\u00a0Returns the node\u2019s 40-bit\u00a0<strong>UUID<\/strong>.<\/li>\n<li><strong>char* getNodeName()<\/strong><strong>:<\/strong>\u00a0Returns the node\u2019s\u00a0<strong>name<\/strong>.<\/li>\n<li><strong>unsigned short getNumberContacts()<\/strong><strong>:<\/strong>\u00a0Returns the contents of contact counter entry.<\/li>\n<li><strong>unsigned short getNumberMessages()<\/strong><strong>:<\/strong>\u00a0Returns the contents of messages counter entry.<\/li>\n<li><strong>Contact getContact(unsigned short index)<\/strong><strong>:<\/strong>\u00a0Returns the\u00a0Contact\u00a0object specified by the\u00a0index. If\u00a0index\u00a0points to an unsaved location, return an empty\u00a0Contact.<\/li>\n<li><strong>Message getMessage(unsigned short index)<\/strong><strong>:<\/strong>\u00a0Returns the\u00a0Message\u00a0object specified by the\u00a0index. If\u00a0index\u00a0points to an unsaved location, return an empty\u00a0Message.<\/li>\n<li><strong>bool saveContact(Contact contact)<\/strong><strong>:<\/strong>\u00a0Saves the given\u00a0Contact\u00a0object into an empty location in the\u00a0<strong>EEPROM<\/strong>\u00a0and returns\u00a0true. If no more empty locations are available, returns\u00a0false.<\/li>\n<li><strong>void saveMessage(Message message)<\/strong><strong>:<\/strong>\u00a0Saves the given\u00a0Message\u00a0object into the next available location in the\u00a0<strong>EEPROM<\/strong>. Note that this location might have a previous message that will get overwritten if there are no more empty message locations. In other words, after the twenty messages have been saved, the system will overwrite older messages to make room for the new ones.<\/li>\n<li><strong>void saveNodeInformation(Contact contact)<\/strong><strong>:<\/strong>\u00a0Saves the given\u00a0Contact\u00a0object into the node\u2019s contact location.<\/li>\n<li><strong>bool hasSchema()<\/strong><strong>:<\/strong>\u00a0Verifies that the\u00a0<strong>flag<\/strong>\u00a0bytes and\u00a0<strong>schema<\/strong>\u00a0are set for the node. Returns\u00a0true\u00a0if that\u2019s the case,\u00a0false\u00a0otherwise.<\/li>\n<li><strong>void setSchema()<\/strong><strong>:<\/strong>\u00a0Sets the\u00a0<strong>flag<\/strong>\u00a0bytes and\u00a0<strong>schema<\/strong>\u00a0for the node.<\/li>\n<li><strong>void clearMessages()<\/strong><strong>:<\/strong>\u00a0Clears the\u00a0<strong>EEPROM<\/strong>\u00a0locations associated with\u00a0Message\u00a0entries. Resets the messages counter.<\/li>\n<li><strong>void clearContacts()<\/strong><strong>:<\/strong>\u00a0Clears the\u00a0<strong>EEPROM<\/strong>\u00a0locations associated with\u00a0Contact\u00a0entries. Resets the contacts counter.<\/li>\n<li><strong>unsigned short getMessagePointerOffset()<\/strong><strong>:<\/strong>\u00a0Returns the value of the message pointer offset entry from the\u00a0<strong>EEPROM<\/strong>.<\/li>\n<\/ul>\n<p><strong>Contact Class<\/strong><\/p>\n<p>A\u00a0Contact\u00a0object stores information on a contact\u2019s\u00a0<strong>name<\/strong>\u00a0and\u00a0<strong>UUID<\/strong>. The\u00a0<strong>UUID<\/strong>\u00a0is 40-bit long and the contact\u2019s name is up to ten characters long. This gives a\u00a0Contact\u00a0object a size of\u00a0<strong>15 bytes<\/strong>.<\/p>\n<ol>\n<li><strong>Contact\u2019s UUID:<\/strong>\u00a0The contact\u2019s 40-bit\u00a0<strong>UUID<\/strong>.<\/li>\n<li><strong>Contact\u2019s name:<\/strong>\u00a0The contact\u2019s\u00a0<strong>name<\/strong>. This can hold up to ten characters.<\/li>\n<\/ol>\n<p>A template is provided below.<\/p>\n<p>classContact {<\/p>\n<p>public:<\/p>\n<p>Contact();<\/p>\n<p>Contact(unsignedchar* givenUUID, charconst* givenName);<\/p>\n<p>Contact(unsignedchar* givenUUID, char givenName);<\/p>\n<p>voidsetUUID(unsignedchar* givenUUID);<\/p>\n<p>voidsetName(charconst* givenName);<\/p>\n<p>voidsetName(char givenName);<\/p>\n<p>unsignedchar* getUUID();<\/p>\n<p>char* getName();<\/p>\n<p>\/\/ Add as you see fit<\/p>\n<p>private:<\/p>\n<p>\/\/ \u2026<\/p>\n<p>\/\/ \u2026<\/p>\n<p>\/\/ \u2026<\/p>\n<p>};<\/p>\n<p>Let\u2019s start explaining what each of the functions must do.<\/p>\n<ul>\n<li><strong>Contact()<\/strong><strong>:<\/strong>\u00a0Default constructor for the\u00a0Contact\u00a0class. Creates an empty contact with an empty\u00a0<strong>name<\/strong>\u00a0and empty\u00a0<strong>UUID<\/strong>.<\/li>\n<li><strong>Contact(unsigned char* givenUUID, char const* givenName)<\/strong><strong>:<\/strong>\u00a0Parametrized constructor for the\u00a0Contact\u00a0class. Takes a given 40-bit\u00a0<strong>UUID<\/strong>\u00a0and a C-style string as parameters to initialize the object\u2019s data members.<\/li>\n<li><strong>Contact(unsigned char* givenUUID, char givenName)<\/strong><strong>:<\/strong>\u00a0Parametrized constructor for the\u00a0Contact\u00a0class. Takes a given 40-bit\u00a0<strong>UUID<\/strong>\u00a0and a character as parameters to initialize the object\u2019s data members.<\/li>\n<li><strong>void setUUID(unsigned char* givenUUID)<\/strong><strong>:<\/strong>\u00a0Saves the given\u00a0<strong>UUID<\/strong>\u00a0as the contact\u2019s\u00a0<strong>UUID<\/strong>.<\/li>\n<li><strong>void setName(char const* givenName)<\/strong><strong>:<\/strong>\u00a0Saves the given C-style string as the contact\u2019s\u00a0<strong>name<\/strong>. Enforces that the contact\u2019s\u00a0<strong>name<\/strong>\u00a0is up to ten characters long by truncating the excess characters.<\/li>\n<li><strong>void setName(char givenName)<\/strong><strong>:<\/strong>\u00a0Saves the given character as the contact\u2019s\u00a0<strong>name<\/strong>.<\/li>\n<li><strong>unsigned char* getUUID()<\/strong><strong>:<\/strong>\u00a0Returns the contact\u2019s 40-bit\u00a0<strong>UUID<\/strong>.<\/li>\n<li><strong>char* getName()<\/strong><strong>:<\/strong>\u00a0Returns the contact\u2019s name as a C-style string.<\/li>\n<\/ul>\n<p><strong>Message Class<\/strong><\/p>\n<p>A\u00a0Message\u00a0object stores the\u00a0<strong>UUID<\/strong>\u00a0of the sender and the receiver, alongside with the payload and its length. This gives a\u00a0Message\u00a0object the size of\u00a0<strong>13 bytes<\/strong>.<\/p>\n<ol>\n<li><strong>Sender\u2019s UUID:<\/strong>\u00a0The sender\u2019s 40-bit\u00a0<strong>UUID<\/strong>.<\/li>\n<li><strong>Receivers\u2019s UUID:<\/strong>\u00a0The receiver\u2019s 40-bit\u00a0<strong>UUID<\/strong>. Used to verify that message was received by the intended party.<\/li>\n<li><strong>Payload:<\/strong>\u00a0The payload consists of\u00a0<strong>morse code<\/strong>\u00a0messages that may vary in size. Their size cannot exceed 16 characters (since that\u2019s the maximum amount we can display on the LCD screen). Morse code uses the\u00a0<strong>.<\/strong>\u00a0and the\u00a0<strong>\u2013<\/strong>symbols and we will represent these with\u00a0<strong>zeroes<\/strong>\u00a0and\u00a0<strong>ones<\/strong>\u00a0respectively. This allows us to represent each character with a bit instead of a byte. We need 2 bytes to represent up to 16 characters.<\/li>\n<li><strong>Payload Length:<\/strong>\u00a0Since a message can vary in\u00a0<strong>length<\/strong>, the payload length tells us how many bits are valid to be interpreted as part of the message. We use 1 byte to store the payload\u2019s length.<\/li>\n<\/ol>\n<p>A template is provided below.<\/p>\n<p>classMessage {<\/p>\n<p>public:<\/p>\n<p>Message();<\/p>\n<p>Message(unsignedchar* from, unsignedchar* to, unsignedshort payload, unsignedchar length);<\/p>\n<p>Message(unsignedchar* from, unsignedchar* to, charconst* message);<\/p>\n<p>voidsetLength(unsignedchar length);<\/p>\n<p>voidsetTo(unsignedchar* to);<\/p>\n<p>voidsetFrom(unsignedchar* from);<\/p>\n<p>voidsetPayload(unsignedshort payload);<\/p>\n<p>unsignedchargetLength();<\/p>\n<p>unsignedchar* getTo();<\/p>\n<p>unsignedchar* getFrom();<\/p>\n<p>unsignedshortgetPayload();<\/p>\n<p>char* getPayloadString();<\/p>\n<p>protected:<\/p>\n<p>unsignedshortstringToPayload(charconst* message);<\/p>\n<p>char* payloadToString(unsignedshort payload, unsignedchar length);<\/p>\n<p>private:<\/p>\n<p>\/\/ \u2026<\/p>\n<p>\/\/ \u2026<\/p>\n<p>\/\/ \u2026<\/p>\n<p>};<\/p>\n<p>Let\u2019s start explaining what each of the functions must do.<\/p>\n<ul>\n<li><strong>Message()<\/strong><strong>:<\/strong>\u00a0Default constructor for the\u00a0Message\u00a0class. Creates an empty message.<\/li>\n<li><strong>Message(unsigned char* from, unsigned char* to, unsigned short payload, unsigned char length)<\/strong><strong>:<\/strong>Parametrized constructor for the\u00a0Message\u00a0class. Takes the sender and receiver\u2019s\u00a0<strong>UUIDs<\/strong>, the\u00a0<strong>payload<\/strong>, and its\u00a0<strong>length<\/strong>.<\/li>\n<li><strong>Message(unsigned char* from, unsigned char* to, char const* message)<\/strong><strong>:<\/strong>\u00a0Parametrized constructor for the\u00a0Message\u00a0class. Takes the sender and receiver\u2019s\u00a0<strong>UUIDs<\/strong>. Additionally, it takes a message in a C-style string. The payload\u00a0<strong>length<\/strong>\u00a0is calculated after the conversion from a C-style string to the payload bits.<\/li>\n<li><strong>void setLength(unsigned char length)<\/strong><strong>:<\/strong>\u00a0Sets the\u00a0<strong>length<\/strong>\u00a0of the payload for the\u00a0Message\u00a0object.<\/li>\n<li><strong>void setTo(unsigned char* to)<\/strong><strong>:<\/strong>\u00a0Sets the receiver\u2019s\u00a0<strong>UUID<\/strong>\u00a0for the\u00a0Message\u00a0object.<\/li>\n<li><strong>void setFrom(unsigned char* from)<\/strong><strong>:<\/strong>\u00a0Sets the sender\u2019s\u00a0<strong>UUID<\/strong>\u00a0for the\u00a0Message\u00a0object.<\/li>\n<li><strong>void setPayload(unsigned short payload)<\/strong><strong>:<\/strong>\u00a0Sets the\u00a0<strong>payload<\/strong>\u00a0for the\u00a0Message\u00a0object.<\/li>\n<li><strong>unsigned char getLength()<\/strong><strong>:<\/strong>\u00a0Returns the payload\u2019s\u00a0<strong>length<\/strong>.<\/li>\n<li><strong>unsigned char* getTo()<\/strong><strong>:<\/strong>\u00a0Returns the receiver\u2019s\u00a0<strong>UUID<\/strong>.<\/li>\n<li><strong>unsigned char* getFrom()<\/strong><strong>:<\/strong>\u00a0Returns the sender\u2019s\u00a0<strong>UUID<\/strong>.<\/li>\n<li><strong>unsigned short getPayload()<\/strong><strong>:<\/strong>\u00a0Returns the\u00a0<strong>payload<\/strong>.<\/li>\n<li><strong>char* getPayloadString()<\/strong><strong>:<\/strong>\u00a0Returns the\u00a0<strong>decoded<\/strong>\u00a0version of the\u00a0<strong>payload<\/strong>\u00a0in a C-style string.<\/li>\n<li><strong>unsigned short stringToPayload(char const* message)<\/strong><strong>:<\/strong>\u00a0<strong>Encodes<\/strong>\u00a0up to a 16 character Morse code string into a 16 bit buffer. Returns the result of this encoding.<\/li>\n<li><strong>char* payloadToString(unsigned short payload, unsigned char length)<\/strong><strong>:<\/strong>\u00a0<strong>Decodes<\/strong>\u00a0a payload into a C-style string. Uses the payload\u2019s length to determine the size of the resulting string. Returns the decoded string.<\/li>\n<\/ul>\n<p><strong>State Machine<\/strong><\/p>\n<p>We have modeled the beeper as a\u00a0<strong>state machine<\/strong>\u00a0based on its behavior. Take a look at the diagram below.<\/p>\n<p>The following states can be identified:<\/p>\n<ul>\n<li><strong>Setup<\/strong>: First time boot. User enters his name and a UUID gets generated. User information is stored in the EEPROM. Subsequent boots skip this state and start in the\u00a0Menu\u00a0state.\n<ul>\n<li><strong>SELECT<\/strong>: Saves the user\u2019s name and goes to the main menu.<\/li>\n<li><strong>LEFT<\/strong>: Erases the last character and moves cursor to the left.<\/li>\n<li><strong>RIGHT<\/strong>: Confirms character moves cursor to right.<\/li>\n<li><strong>UP<\/strong>: Scrolls letter<\/li>\n<li><strong>DOWN<\/strong>: Scrolls letter<\/li>\n<\/ul>\n<\/li>\n<li><strong>Menu<\/strong>: Displays the menu options. There are blinking arrows on the ends of the second row. These arrows indicate that the user can press the Left or Right buttons to scroll to the next option. The options wrap around once all have been displayed. The arrows complete a blink cycle in a second.\n<ul>\n<li><strong>SELECT<\/strong>: Goes to the selected option. The following is a list of valid menu options.\n<ul>\n<li><strong>Contacts<\/strong>: Goes to\u00a0Contacts.<\/li>\n<li><strong>Messages<\/strong>: Goes to\u00a0Messages.<\/li>\n<li><strong>N. Contact<\/strong>: Goes to\u00a0New Contact.<\/li>\n<li><strong>About Me<\/strong>: Goes to\u00a0About Me.<\/li>\n<\/ul>\n<\/li>\n<li><strong>LEFT<\/strong>: Scrolls options.<\/li>\n<li><strong>RIGHT<\/strong>: Scrolls options.<\/li>\n<li><strong>UP<\/strong>: None<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<\/ul>\n<\/li>\n<li><strong>Contacts<\/strong>: Displays the contacts stored in the device. There are blinking arrows on the ends of the second row. These arrows indicate that the user can press the Left or Right buttons to scroll to the next option. The options wrap around once all have been displayed. The arrows complete a blink cycle in a second.\n<ul>\n<li><strong>SELECT<\/strong>: Compose message for selected contact.<\/li>\n<li><strong>LEFT<\/strong>: Scrolls contact options.<\/li>\n<li><strong>RIGHT<\/strong>: Scrolls contact options.<\/li>\n<li><strong>UP<\/strong>: Goes back to the previous screen.<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<\/ul>\n<\/li>\n<li><strong>Messages<\/strong>: Displays the messages stored in the device. A list of sent and received messages. A marker on the top right of the screen determines whether the message was sent or received.\n<ul>\n<li><strong>SELECT<\/strong>: Open the selected option.<\/li>\n<li><strong>LEFT<\/strong>: Scroll messages.<\/li>\n<li><strong>RIGHT<\/strong>: Scroll messages.<\/li>\n<li><strong>UP<\/strong>: Goes back to the previous screen.<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<\/ul>\n<\/li>\n<li><strong>New Contact<\/strong>: Validates whether or not there is space for a new contact. If there is, it transitions to the\u00a0New Contact Name\u00a0state. Otherwise, it transitions to the\u00a0List Full\u00a0state.<\/li>\n<li><strong>New Contact Name<\/strong>: Screen for new contact name input. A marker on the top right of the screen determines whether this is the first or second screen in the process of adding a contact. The first screen consists of inputting the new contact\u2019s name while the second screen consists of inputting the new contact\u2019s UUID.\n<ul>\n<li><strong>SELECT<\/strong>: Saves name and goes to the\u00a0New Contact UUID\u00a0screen.<\/li>\n<li><strong>LEFT<\/strong>: Erases the last character and moves cursor to the left.<\/li>\n<li><strong>RIGHT<\/strong>: Confirms character and moves cursor to the right.<\/li>\n<li><strong>UP<\/strong>: Scrolls letter.<\/li>\n<li><strong>DOWN<\/strong>: Scrolls letter.<\/li>\n<\/ul>\n<\/li>\n<li><strong>New Contact UUID<\/strong>: Screen for new contact name input. A marker on the top right of the screen determines that this is the second screen in the process of adding a new contact.\n<ul>\n<li><strong>SELECT<\/strong>: Saves UUID and goes to the\u00a0New Contact Added\u00a0screen. Saves contact to the EEPROM.<\/li>\n<li><strong>LEFT<\/strong>: Erases the last character and moves cursor to the left.<\/li>\n<li><strong>RIGHT<\/strong>: Confirms character and moves cursor to the right.<\/li>\n<li><strong>UP<\/strong>: Scrolls letter.<\/li>\n<li><strong>DOWN<\/strong>: Scrolls letter.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Contact Added<\/strong>: Informative screen that let\u2019s the user know that the contact was successfully added. Times out in two seconds returning back to the main menu.\n<ul>\n<li><strong>SELECT<\/strong>: None<\/li>\n<li><strong>LEFT<\/strong>: None<\/li>\n<li><strong>RIGHT<\/strong>: None<\/li>\n<li><strong>UP<\/strong>: Goes back to main menu.<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<li><strong>Time out<\/strong>: Goes back to main menu in two seconds. The delay should be non-blocking.<\/li>\n<\/ul>\n<\/li>\n<li><strong>List Full<\/strong>: Informative screen that let\u2019s the user know that there is no space for a new contact. Times out in two seconds returning back to the main menu.\n<ul>\n<li><strong>SELECT<\/strong>: None<\/li>\n<li><strong>LEFT<\/strong>: None<\/li>\n<li><strong>RIGHT<\/strong>: None<\/li>\n<li><strong>UP<\/strong>: Goes back to main menu.<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<li><strong>Time out<\/strong>: Goes back to main menu in two seconds. The delay should be non-blocking.<\/li>\n<\/ul>\n<\/li>\n<li><strong>About Me<\/strong>: Shows the user\u2019s name and UUID.\n<ul>\n<li><strong>SELECT<\/strong>: None<\/li>\n<li><strong>LEFT<\/strong>: None<\/li>\n<li><strong>RIGHT<\/strong>: None<\/li>\n<li><strong>UP<\/strong>: Goes back to main menu.<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<\/ul>\n<\/li>\n<li><strong>Message New<\/strong>: Displays the user name to who we are sending the message to. It also allows constructing a morse string to be sent.\n<ul>\n<li><strong>SELECT<\/strong>: Attempts to send the message.<\/li>\n<li><strong>LEFT<\/strong>: Write a dot.<\/li>\n<li><strong>RIGHT<\/strong>: Write a dash.<\/li>\n<li><strong>UP<\/strong>: Goes back to the previous screen.<\/li>\n<li><strong>DOWN<\/strong>: Erases one character.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Message Sent<\/strong>: Informative screen that let\u2019s the user know that the message was sent successfully. Play a tone through the buzzer indicating that a message was sent. Times out in two seconds returning back to the main menu.\n<ul>\n<li><strong>SELECT<\/strong>: None<\/li>\n<li><strong>LEFT<\/strong>: None<\/li>\n<li><strong>RIGHT<\/strong>: None<\/li>\n<li><strong>UP<\/strong>: Goes back to main menu<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<li><strong>Time out<\/strong>: Goes back to main menu in two seconds. The delay should be non-blocking.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Message Failed<\/strong>: Informative screen that let\u2019s the user know that the message could not be sent. Play a tone through the buzzer indicating that sending the failed. Times out in two seconds returning back to the main menu.\n<ul>\n<li><strong>SELECT<\/strong>: None<\/li>\n<li><strong>LEFT<\/strong>: None<\/li>\n<li><strong>RIGHT<\/strong>: None<\/li>\n<li><strong>UP<\/strong>: Goes back to main menu<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<li><strong>Time out<\/strong>: Goes back to main menu in two seconds. The delay should be non-blocking.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Message Open<\/strong>: Displays a message that has been saved in the device. Displays whether the message was sent or received, the user, and the message.\n<ul>\n<li><strong>SELECT<\/strong>: None<\/li>\n<li><strong>LEFT<\/strong>: None<\/li>\n<li><strong>RIGHT<\/strong>: None<\/li>\n<li><strong>UP<\/strong>: Goes back to the previous screen.<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<\/ul>\n<\/li>\n<li><strong>Message Received<\/strong>: Informative screen that let\u2019s the user know that a new message has been received. Times out in two seconds returning back to the previous screen. Play a tone through the buzzer indicating that a message was received.\n<ul>\n<li><strong>SELECT<\/strong>: None<\/li>\n<li><strong>LEFT<\/strong>: None<\/li>\n<li><strong>RIGHT<\/strong>: None<\/li>\n<li><strong>UP<\/strong>: Goes back to the previous screen.<\/li>\n<li><strong>DOWN<\/strong>: None<\/li>\n<li><strong>Time out<\/strong>: Goes back to the previous screen in two seconds. The delay should be non-blocking.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>User Interface<\/strong><\/p>\n<p>The following section depicts the user interface that must be implemented for the beeper.<\/p>\n<p><strong>Submission<\/strong><\/p>\n<ul>\n<li>Once your team has completed the assignment show it your TA. You might be asked to reconfigure the device, explain your code, test communicating with other groups, etc.<\/li>\n<li>Zip your files for submission. At the very least you should have\u00a0Beeper.ino,\u00a0Memory.hpp,\u00a0Contact.hpp, and\u00a0Message.hpp. Do not include in your .zip file any external library that can be downloaded from the Internet. The .zip file must be named after your Tracks ID. This is for plagiarism detection purposes.<\/li>\n<\/ul>\n<p><center><a href=\"http:\/\/onlineclassesguru.com\/orders\/ordernow\"><img decoding=\"async\" src=\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcTyj99p60XCLyLk1htB7-1neRt8-2QdnenNlQ&usqp=CAU\"target=\"_http:\/\/onlineclassesguru.com\/orders\/ordernow\"\/><\/center><p>","protected":false},"excerpt":{"rendered":"<p>Morse\u00a0\u00a0beeper\u00a0is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive\u00a0morse code\u00a0messages. This project involves interfacing with an\u00a0LCD\u00a0screen, a\u00a0radio\u00a0module, the\u00a0EEPROM, and a\u00a0buzzer. We also design and implement an&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-29998","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v17.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages. - onlineclassesguru<\/title>\n<meta name=\"description\" content=\"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages. - onlineclassesguru\" \/>\n<meta property=\"og:description\" content=\"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/\" \/>\n<meta property=\"og:site_name\" content=\"onlineclassesguru\" \/>\n<meta property=\"article:published_time\" content=\"2021-06-28T09:36:07+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin_admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/onlineclassesguru.com\/#website\",\"url\":\"https:\/\/onlineclassesguru.com\/\",\"name\":\"onlineclassesguru\",\"description\":\"Cheap Professional coursework and reaction papers help\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/onlineclassesguru.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/#webpage\",\"url\":\"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/\",\"name\":\"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages. - onlineclassesguru\",\"isPartOf\":{\"@id\":\"https:\/\/onlineclassesguru.com\/#website\"},\"datePublished\":\"2021-06-28T09:36:07+00:00\",\"dateModified\":\"2021-06-28T09:36:07+00:00\",\"author\":{\"@id\":\"https:\/\/onlineclassesguru.com\/#\/schema\/person\/1831fa4d28e47b468621cf27932f5742\"},\"description\":\"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages.\",\"breadcrumb\":{\"@id\":\"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/onlineclassesguru.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages.\"}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/onlineclassesguru.com\/#\/schema\/person\/1831fa4d28e47b468621cf27932f5742\",\"name\":\"admin_admin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/onlineclassesguru.com\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429c8d043f7a770af242b0031e8b9f2b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429c8d043f7a770af242b0031e8b9f2b?s=96&d=mm&r=g\",\"caption\":\"admin_admin\"},\"url\":\"https:\/\/onlineclassesguru.com\/index.php\/author\/admin_admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages. - onlineclassesguru","description":"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/","og_locale":"en_US","og_type":"article","og_title":"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages. - onlineclassesguru","og_description":"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages.","og_url":"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/","og_site_name":"onlineclassesguru","article_published_time":"2021-06-28T09:36:07+00:00","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin_admin","Est. reading time":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/onlineclassesguru.com\/#website","url":"https:\/\/onlineclassesguru.com\/","name":"onlineclassesguru","description":"Cheap Professional coursework and reaction papers help","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/onlineclassesguru.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"WebPage","@id":"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/#webpage","url":"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/","name":"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages. - onlineclassesguru","isPartOf":{"@id":"https:\/\/onlineclassesguru.com\/#website"},"datePublished":"2021-06-28T09:36:07+00:00","dateModified":"2021-06-28T09:36:07+00:00","author":{"@id":"https:\/\/onlineclassesguru.com\/#\/schema\/person\/1831fa4d28e47b468621cf27932f5742"},"description":"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages.","breadcrumb":{"@id":"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/onlineclassesguru.com\/index.php\/2021\/06\/28\/morse-beeper-is-a-wireless-communication-device-that-receives-and-sends-messages-to-others-using-its-internal-transceiver-in-this-project-we-design-and-prototype-a-device-that-resembles-a-beeper-an\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/onlineclassesguru.com\/"},{"@type":"ListItem","position":2,"name":"Morse beeper is a wireless communication device that receives and sends messages to others using its internal transceiver. In this project, we design and prototype a device that resembles a beeper and is able to store contacts, send, and receive morse code messages."}]},{"@type":"Person","@id":"https:\/\/onlineclassesguru.com\/#\/schema\/person\/1831fa4d28e47b468621cf27932f5742","name":"admin_admin","image":{"@type":"ImageObject","@id":"https:\/\/onlineclassesguru.com\/#personlogo","inLanguage":"en-US","url":"https:\/\/secure.gravatar.com\/avatar\/429c8d043f7a770af242b0031e8b9f2b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429c8d043f7a770af242b0031e8b9f2b?s=96&d=mm&r=g","caption":"admin_admin"},"url":"https:\/\/onlineclassesguru.com\/index.php\/author\/admin_admin\/"}]}},"_links":{"self":[{"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/posts\/29998"}],"collection":[{"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/comments?post=29998"}],"version-history":[{"count":1,"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/posts\/29998\/revisions"}],"predecessor-version":[{"id":29999,"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/posts\/29998\/revisions\/29999"}],"wp:attachment":[{"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/media?parent=29998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/categories?post=29998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/onlineclassesguru.com\/index.php\/wp-json\/wp\/v2\/tags?post=29998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}