{"id":3463,"date":"2021-04-15T10:36:30","date_gmt":"2021-04-15T15:36:30","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3463"},"modified":"2021-04-15T10:36:30","modified_gmt":"2021-04-15T15:36:30","slug":"lorawan-interruptor-temporizado-archivo-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-interruptor-temporizado-archivo-ino\/","title":{"rendered":"LoRaWan \u2013 Interruptor temporizado. Archivo.ino"},"content":{"rendered":"<p>Un dispositivo como actuador requiere recibir un mensaje de control desde el broker para establecer el estado del artefacto o cosa. En el caso de LoRaWan el mensaje debe gestionarse por el gateway para transformar un mensaje Mqtt enviado al formato de bytes usado en la red LoRa, es decir un Encoder.<\/p>\n<p>En el dispositivo LoRa se requiere al menos una funci\u00f3n para recibir los mensajes, interpretaci\u00f3n de los bytes recibidos y con \u00e9stos actualizar el estado de los pines de salidas usados como control.<\/p>\n<h2>Datos de control<\/h2>\n<p>Lo primordial en el dispositivo es el pin de control. Para el ejemplo inicial se usa el LED incorporado en el m\u00f3dulo de desarrollo Pin25.<\/p>\n<pre><span style=\"color: #434f54\">\/\/ actuador<\/span>\r\n<span style=\"color: #5e6d03\">#define<\/span> <span style=\"color: #000000\">LEDPin<\/span> <span style=\"color: #000000\">25<\/span>  <span style=\"color: #434f54\">\/\/LED light<\/span>\r\n<span style=\"color: #00979c\">boolean<\/span> <span style=\"color: #000000\">estado<\/span> <span style=\"color: #434f54\">=<\/span> <span style=\"color: #00979c\">false<\/span>;  <span style=\"color: #434f54\">\/\/estado dispositivo<\/span>\r\n<\/pre>\n<p>Un dato complementario es la <strong><em>duraci\u00f3n<\/em><\/strong> del actuador en estado encendido, es un factor necesario en el sistema de riego, pues se deber\u00eda usar solo por periodos cortos de tiempo. Se aprovecha el modo de ahorro de energ\u00eda del dispositivo en contraste con los largos periodos sin riego.<\/p>\n<h2>Intrucciones Principales<\/h2>\n<p>A las instrucciones principales se a\u00f1aden las l\u00edneas para la declaraci\u00f3n de las variables. El resto de operaciones se las a\u00f1ade como funciones.<\/p>\n<pre><span style=\"color: #95a5a6\">\/* HelTec Automation(TM) LoRaWAN 1.0.2 OTAA example use OTAA, CLASS A<\/span>\r\n<span style=\"color: #95a5a6\"> * Solo ESP32+LoRa series boards con licencia <\/span><u><span style=\"color: #95a5a6\">http:\/\/www.heltec.cn\/search\/<\/span><\/u><span style=\"color: #95a5a6\">);<\/span>\r\n<span style=\"color: #95a5a6\"> *<\/span><u><span style=\"color: #95a5a6\">https:\/\/github.com\/HelTecAutomation\/ESP32_LoRaWAN<\/span><\/u>\r\n<span style=\"color: #95a5a6\">*\/<\/span>\r\n<span style=\"color: #5e6d03\">#include<\/span> <span style=\"color: #434f54\">&lt;<\/span><span style=\"color: #000000\">ESP32_LoRaWAN<\/span><span style=\"color: #434f54\">.<\/span><span style=\"color: #000000\">h<\/span><span style=\"color: #434f54\">&gt;<\/span>\r\n<span style=\"color: #5e6d03\">#include<\/span> <span style=\"color: #005c5f\">\"Arduino.h\"<\/span>\r\n\r\n<span style=\"color: #95a5a6\">\/*licencia Heltec ESP32 LoRaWan <\/span><u><span style=\"color: #95a5a6\">http:\/\/resource.heltec.cn\/search<\/span><\/u><span style=\"color: #95a5a6\"> *\/<\/span>\r\n<span style=\"color: #00979c\">uint32_t<\/span>  <span style=\"color: #000000\">license<\/span>[4] = { <span style=\"color: #000000\">0xC254CA22<\/span>, <span style=\"color: #000000\">0xFB5646A9<\/span>, <span style=\"color: #000000\">0xA23B184F<\/span>, <span style=\"color: #000000\">0x8F613844<\/span>};\r\n\r\n<span style=\"color: #95a5a6\">\/* OTAA parametros*\/<\/span>\r\n<span style=\"color: #00979c\">uint8_t<\/span> DevEui[] = { <span style=\"color: #000000\">0xbc<\/span>, <span style=\"color: #000000\">0x55<\/span>, <span style=\"color: #000000\">0x31<\/span>, <span style=\"color: #000000\">0x89<\/span>, <span style=\"color: #000000\">0x12<\/span>, <span style=\"color: #000000\">0xbf<\/span>, <span style=\"color: #000000\">0xd0<\/span>, <span style=\"color: #000000\">0x90<\/span> };\r\n<span style=\"color: #00979c\">uint8_t<\/span> AppEui&lt;[] = { <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span> };\r\n<span style=\"color: #00979c\">uint8_t<\/span> AppKey[] = { <span style=\"color: #000000\">0x99<\/span>, <span style=\"color: #000000\">0x42<\/span>, <span style=\"color: #000000\">0xd4<\/span>, <span style=\"color: #000000\">0x4b<\/span>, <span style=\"color: #000000\">0xfc<\/span>, <span style=\"color: #000000\">0x59<\/span>, <span style=\"color: #000000\">0x85<\/span>, <span style=\"color: #000000\">0x0a<\/span>, <span style=\"color: #000000\">0xad<\/span>, <span style=\"color: #000000\">0x76<\/span>, <span style=\"color: #000000\">0x15<\/span>, <span style=\"color: #000000\">0x3b<\/span>, <span style=\"color: #000000\">0x7a<\/span>, <span style=\"color: #000000\">0xdb<\/span>, <span style=\"color: #000000\">0x50<\/span>, <span style=\"color: #000000\">0x32<\/span> };\r\n\r\n<span style=\"color: #95a5a6\">\/* ABP parametros*\/<\/span>\r\n<span style=\"color: #00979c\">uint8_t<\/span> NwkSKey[] = { <span style=\"color: #000000\">0xd6<\/span>, <span style=\"color: #000000\">0x28<\/span>, <span style=\"color: #000000\">0x15<\/span>, <span style=\"color: #000000\">0x0c<\/span>, <span style=\"color: #000000\">0x99<\/span>, <span style=\"color: #000000\">0x79<\/span>, <span style=\"color: #000000\">0xbc<\/span>, <span style=\"color: #000000\">0xec<\/span>, <span style=\"color: #000000\">0xed<\/span>, <span style=\"color: #000000\">0x11<\/span>, <span style=\"color: #000000\">0x67<\/span>, <span style=\"color: #000000\">0x75<\/span>, <span style=\"color: #000000\">0x0b<\/span>, <span style=\"color: #000000\">0x37<\/span>, <span style=\"color: #000000\">0xb4<\/span>, <span style=\"color: #000000\">0xe0<\/span> };\r\n<span style=\"color: #00979c\">uint8_t<\/span> AppSKey[] = { <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span>, <span style=\"color: #000000\">0x00<\/span> };\r\n<span style=\"color: #00979c\">uint32_t<\/span> DevAddr  = ( <span style=\"color: #00979c\">uint32_t<\/span> )<span style=\"color: #000000\">0x00052815<\/span>;\r\n\r\n<span style=\"color: #434f54\">\/\/LoraWan channelsmask, default channels 0-7\/<\/span>\r\n<span style=\"color: #00979c\">uint16_t<\/span> userChannelsMask[6]={ <span style=\"color: #000000\">0x00FF<\/span>,0x0000,0x0000,0x0000,0x0000,0x0000 };\r\n\r\n<span style=\"color: #000000\">DeviceClass_t<\/span>  loraWanClass = <span style=\"color: #000000\">CLASS_A<\/span>;  <span style=\"color: #95a5a6\">\/*Soporte de A and C*\/<\/span>\r\n<span style=\"color: #00979c\">uint32_t<\/span> <span style=\"color: #000000\">appTxDutyCycle<\/span> = <span style=\"color: #000000\">30000<\/span>;        <span style=\"color: #95a5a6\">\/*15000; en [ms]*\/<\/span>\r\n<span style=\"color: #00979c\">bool<\/span> <span style=\"color: #000000\">overTheAirActivation<\/span> = <span style=\"color: #00979c\">true<\/span>;     <span style=\"color: #95a5a6\">\/*OTAA or ABP*\/<\/span>\r\n<span style=\"color: #00979c\">bool<\/span> <span style=\"color: #000000\">loraWanAdr<\/span> = <span style=\"color: #00979c\">true<\/span>;               <span style=\"color: #95a5a6\">\/*ADR enable*\/<\/span>\r\n<span style=\"color: #00979c\">bool<\/span> <span style=\"color: #000000\">isTxConfirmed<\/span> = <span style=\"color: #00979c\">true<\/span>;            <span style=\"color: #95a5a6\">\/*confirmed or unconfirmed messages *\/<\/span>\r\n<span style=\"color: #00979c\">uint8_t<\/span> <span style=\"color: #000000\">appPort<\/span> = <span style=\"color: #000000\">3<\/span>;                  <span style=\"color: #95a5a6\">\/* Application port *\/<\/span>\r\n  \r\n<span style=\"color: #95a5a6\">\/* reintentos de transmisi\u00f3n, en caso de no recibir ack *\/<\/span>\r\n<span style=\"color: #00979c\">uint8_t<\/span> <span style=\"color: #000000\">confirmedNbTrials<\/span> = <span style=\"color: #000000\">8<\/span>;\r\n\r\n<span style=\"color: #95a5a6\">\/* Seleccionado de Arduino IDE tools *\/<\/span>\r\n<span style=\"color: #00979c\">uint8_t<\/span> <span style=\"color: #000000\">debugLevel<\/span> = <span style=\"color: #000000\">LoRaWAN_DEBUG_LEVEL<\/span>; \r\n<span style=\"color: #000000\">LoRaMacRegion_t<\/span> <span style=\"color: #000000\">loraWanRegion<\/span> = <span style=\"color: #000000\">ACTIVE_REGION<\/span>;\r\n\r\n<span style=\"color: #434f54\">\/\/ Mensajes por Puerto Serial<\/span>\r\n<span style=\"color: #00979c\">volatile<\/span> <span style=\"color: #00979c\">boolean<\/span> serial_msg = <span style=\"color: #00979c\">true<\/span>;\r\n\r\n<span style=\"color: #434f54\">\/\/ actuador<\/span>\r\n<span style=\"color: #5e6d03\">#define<\/span> LEDPin 25  <span style=\"color: #434f54\">\/\/LED light<\/span>\r\n<span style=\"color: #00979c\">boolean<\/span> estado = <span style=\"color: #00979c\">false<\/span>;  <span style=\"color: #434f54\">\/\/estado dispositivo<\/span>\r\n\r\n<span style=\"color: #434f54\">\/\/ Sensor de estado de bateria, revisar modelo de m\u00f3dulo<\/span>\r\n<span style=\"color: #434f54\">\/\/ PowerDetection 13 en Wireless Stick lite, otros 37<\/span>\r\n<span style=\"color: #5e6d03\">#define<\/span> Vext 21\r\n<span style=\"color: #5e6d03\">#define<\/span> PowerDetection 13\r\n\r\n<span style=\"color: #00979c\">void<\/span> <span style=\"color: #5e6d03\">setup<\/span>(){\r\n  <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">begin<\/span>(115200);\r\n  <span style=\"color: #5e6d03\">while<\/span> (<span style=\"color: #434f54\">!<\/span><b><span style=\"color: #d35400\">Serial<\/span><\/b>);\r\n  <b><span style=\"color: #d35400\">SPI<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">begin<\/span>(SCK,MISO,MOSI,SS);\r\n  <span style=\"color: #000000\">Mcu<\/span><span style=\"color: #434f54\">.<\/span>init(SS,RST_LoRa,DIO0,DIO1,license);\r\n  deviceState = DEVICE_STATE_INIT;\r\n}\r\n<span style=\"color: #00979c\">void<\/span> <span style=\"color: #5e6d03\">loop<\/span>(){\r\n  <span style=\"color: #5e6d03\">switch<\/span>( deviceState )  {\r\n    <span style=\"color: #5e6d03\">case<\/span> DEVICE_STATE_INIT<span style=\"color: #434f54\">:<\/span>    {\r\n      LoRaWAN<span style=\"color: #434f54\">.<\/span><span style=\"color: #000000\">init<\/span>(loraWanClass,loraWanRegion);\r\n      <span style=\"color: #5e6d03\">break<\/span>;\r\n    }\r\n    <span style=\"color: #5e6d03\">case<\/span> <span style=\"color: #000000\">DEVICE_STATE_JOIN<\/span><span style=\"color: #434f54\">:<\/span>    {\r\n      LoRaWAN<span style=\"color: #434f54\">.<\/span><span style=\"color: #000000\">join<\/span>();\r\n      <span style=\"color: #5e6d03\">break<\/span>;\r\n    }\r\n    <span style=\"color: #5e6d03\">case<\/span> <span style=\"color: #000000\">DEVICE_STATE_SEND<\/span><span style=\"color: #434f54\">:<\/span>    {\r\n      <span style=\"color: #000000\">prepareTxFrame<\/span>( <span style=\"color: #000000\">appPort<\/span> );\r\n      LoRaWAN<span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">send<\/span>(loraWanClass);\r\n      deviceState = <span style=\"color: #000000\">DEVICE_STATE_CYCLE<\/span>;\r\n      <span style=\"color: #5e6d03\">if<\/span> (serial_msg){\r\n        <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #005c5f\">\"  estado: \"<\/span>);\r\n        <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">println<\/span>(estado);\r\n      }\r\n      <span style=\"color: #5e6d03\">break<\/span>;\r\n    }\r\n    <span style=\"color: #5e6d03\">case<\/span> <span style=\"color: #000000\">DEVICE_STATE_CYCLE<\/span><span style=\"color: #434f54\">:<\/span>    {\r\n      <span style=\"color: #434f54\">\/\/ Schedule next packet transmission<\/span>\r\n      <span style=\"color: #000000\">txDutyCycleTime<\/span> = <span style=\"color: #000000\">appTxDutyCycle<\/span> <span style=\"color: #434f54\">+<\/span> <span style=\"color: #000000\">randr<\/span>( <span style=\"color: #434f54\">-<\/span><span style=\"color: #000000\">APP_TX_DUTYCYCLE_RND<\/span>,\r\n                                                <span style=\"color: #000000\">APP_TX_DUTYCYCLE_RND<\/span> );\r\n      LoRaWAN<span style=\"color: #434f54\">.<\/span><span style=\"color: #000000\">cycle<\/span>(<span style=\"color: #000000\">txDutyCycleTime<\/span>);\r\n      deviceState = <span style=\"color: #000000\">DEVICE_STATE_SLEEP<\/span>;\r\n      <span style=\"color: #5e6d03\">break<\/span>;\r\n    }\r\n    <span style=\"color: #5e6d03\">case<\/span> <span style=\"color: #000000\">DEVICE_STATE_SLEEP<\/span><span style=\"color: #434f54\">:<\/span>    {\r\n      LoRaWAN<span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">sleep<\/span>(loraWanClass,<span style=\"color: #000000\">debugLevel<\/span>);\r\n      <span style=\"color: #5e6d03\">break<\/span>;\r\n    }\r\n    <span style=\"color: #5e6d03\">default<\/span><span style=\"color: #434f54\">:<\/span>    {\r\n      deviceState = DEVICE_STATE_INIT;\r\n      <span style=\"color: #5e6d03\">break<\/span>;\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<h2>Recibe trama<\/h2>\n<p>La recepci\u00f3n de los datos en la trana, \"downlink\", se realiza en la variable Buffer que es un arreglo de Bytes. La instrucci\u00f3n de control requiere dos valores: estado y duraci\u00f3n , por lo que se usa el primer y segundo Byte. Este detalle se debe ajustar en cada situaci\u00f3n para la cantidad de bytes que se requieran.<\/p>\n<p>Recibidos los datos, se invoca a la funci\u00f3n para control del actuador \"actuador_pin()\".<\/p>\n<pre><span style=\"color: #00979c\">void<\/span>  <span style=\"color: #000000\">downLinkDataHandle<\/span>(<span style=\"color: #000000\">McpsIndication_t<\/span> <span style=\"color: #434f54\">*<\/span>mcpsIndication){\r\n  lora_printf(<span style=\"color: #005c5f\">\"+REV DATA:%s,RXSIZE %d,PORT %d\\r\\n\"<\/span>,\r\n              mcpsIndication<span style=\"color: #434f54\">-<\/span><span style=\"color: #434f54\">&gt;<\/span><span style=\"color: #000000\">RxSlot<\/span><span style=\"color: #434f54\">?<\/span><span style=\"color: #005c5f\">\"RXWIN2\"<\/span><span style=\"color: #434f54\">:<\/span><span style=\"color: #005c5f\">\"RXWIN1\"<\/span>,\r\n              mcpsIndication<span style=\"color: #434f54\">-<\/span><span style=\"color: #434f54\">&gt;<\/span><span style=\"color: #000000\">BufferSize<\/span>,\r\n              mcpsIndication<span style=\"color: #434f54\">-<\/span><span style=\"color: #434f54\">&gt;<\/span><span style=\"color: #000000\">Port<\/span>);\r\n  lora_printf(<span style=\"color: #005c5f\">\"+REV DATA:\"<\/span>);\r\n  \r\n  <span style=\"color: #000000\">actuador_pin<\/span>(mcpsIndication<span style=\"color: #434f54\">-<\/span><span style=\"color: #434f54\">&gt;<\/span><span style=\"color: #000000\">Buffer<\/span>[<span style=\"color: #000000\">0<\/span>],\r\n                mcpsIndication<span style=\"color: #434f54\">-<\/span><span style=\"color: #434f54\">&gt;<\/span><span style=\"color: #000000\">Buffer<\/span>[<span style=\"color: #000000\">1<\/span>]);\r\n\r\n  <span style=\"color: #5e6d03\">for<\/span>(<span style=\"color: #00979c\">uint8_t<\/span> <span style=\"color: #000000\">i<\/span>=<span style=\"color: #000000\">0<\/span>;<span style=\"color: #000000\">i<\/span><span style=\"color: #434f54\">&lt;<\/span>mcpsIndication<span style=\"color: #434f54\">-<\/span><span style=\"color: #434f54\">&gt;<\/span><span style=\"color: #000000\">BufferSize<\/span>;<span style=\"color: #000000\">i<\/span><span style=\"color: #434f54\">++<\/span>)  {\r\n    lora_printf(<span style=\"color: #005c5f\">\"%02X\"<\/span>,mcpsIndication<span style=\"color: #434f54\">-<\/span><span style=\"color: #434f54\">&gt;<\/span><span style=\"color: #000000\">Buffer<\/span>[<span style=\"color: #000000\">i<\/span>]);\r\n  }\r\n  lora_printf(<span style=\"color: #005c5f\">\"\\r\\n\"<\/span>);\r\n}\r\n<\/pre>\n<h2>Controla estado de actuador<\/h2>\n<p>Con los dato recibidos en la funci\u00f3n anterior, se selecciona la acci\u00f3n para cada caso de valor de estado.<\/p>\n<pre><span style=\"color: #00979c\">void<\/span> <span style=\"color: #000000\">actuador_pin<\/span>(<span style=\"color: #00979c\">uint8_t<\/span> estado, <span style=\"color: #00979c\">uint8_t<\/span> <span style=\"color: #000000\">duracion<\/span>) {\r\n  <span style=\"color: #5e6d03\">if<\/span> (serial_msg){\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #005c5f\">\"\\n instruccion recibida: \"<\/span>);\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(estado);\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #005c5f\">\"  \"<\/span>);\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">println<\/span>(<span style=\"color: #000000\">duracion<\/span>);\r\n  }\r\n  <span style=\"color: #5e6d03\">switch<\/span>(estado) {\r\n    <span style=\"color: #5e6d03\">case<\/span> <span style=\"color: #000000\">49<\/span><span style=\"color: #434f54\">:<\/span> {\r\n      <span style=\"color: #d35400\">pinMode<\/span>(LEDPin,<span style=\"color: #00979c\">OUTPUT<\/span>);\r\n      <span style=\"color: #d35400\">digitalWrite<\/span>(LEDPin, <span style=\"color: #00979c\">HIGH<\/span>);\r\n      estado = <span style=\"color: #00979c\">true<\/span>;\r\n      <span style=\"color: #5e6d03\">if<\/span> (serial_msg){\r\n        <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #005c5f\">\"activador: ON \"<\/span>);\r\n        <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #005c5f\">\" duraci\u00f3n (s): \"<\/span>);\r\n        <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #000000\">duracion<\/span>);\r\n      }\r\n      <span style=\"color: #d35400\">delay<\/span>(<span style=\"color: #000000\">duracion<\/span><span style=\"color: #434f54\">*<\/span><span style=\"color: #000000\">1000<\/span>); <span style=\"color: #434f54\">\/\/ en segundos<\/span>\r\n      <span style=\"color: #d35400\">digitalWrite<\/span>(LEDPin, <span style=\"color: #00979c\">LOW<\/span>);\r\n      estado = <span style=\"color: #00979c\">false<\/span>;\r\n      <span style=\"color: #5e6d03\">break<\/span>;\r\n    }\r\n    <span style=\"color: #5e6d03\">case<\/span> <span style=\"color: #000000\">50<\/span><span style=\"color: #434f54\">:<\/span> {\r\n      <span style=\"color: #d35400\">pinMode<\/span>(LEDPin,<span style=\"color: #00979c\">OUTPUT<\/span>);\r\n      <span style=\"color: #d35400\">digitalWrite<\/span>(LEDPin, <span style=\"color: #00979c\">LOW<\/span>);\r\n      estado = <span style=\"color: #00979c\">false<\/span>;\r\n      <span style=\"color: #5e6d03\">if<\/span> (serial_msg){\r\n        <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">println<\/span>(<span style=\"color: #005c5f\">\"activador: OFF\"<\/span>);\r\n      }\r\n      <span style=\"color: #d35400\">delay<\/span>(<span style=\"color: #000000\">duracion<\/span><span style=\"color: #434f54\">*<\/span><span style=\"color: #000000\">1000<\/span>); <span style=\"color: #434f54\">\/\/ en segundos<\/span>\r\n      <span style=\"color: #5e6d03\">break<\/span>;\r\n    }\r\n    <span style=\"color: #5e6d03\">default<\/span><span style=\"color: #434f54\">:<\/span> {<span style=\"color: #5e6d03\">break<\/span>;}\r\n  }\r\n}\r\n<\/pre>\n<p>Las siguientes funciones son las mismas usadas en el ejemplo de revisi\u00f3n de estado de bater\u00eda.<\/p>\n<h2>Prepara trama<\/h2>\n<pre><span style=\"color: #00979c\">static<\/span> <span style=\"color: #00979c\">void<\/span> <span style=\"color: #000000\">prepareTxFrame<\/span>( <span style=\"color: #00979c\">uint8_t<\/span> <span style=\"color: #000000\">port<\/span> ){\r\n  <span style=\"color: #00979c\">uint16_t<\/span> <span style=\"color: #000000\">BateriaV<\/span> = <span style=\"color: #000000\">SensorBateria<\/span>();\r\n  \r\n  <span style=\"color: #000000\">appDataSize<\/span> = <span style=\"color: #000000\">4<\/span> ;\r\n  <span style=\"color: #000000\">appData<\/span>[<span style=\"color: #000000\">3<\/span>] = <span style=\"color: #000000\">0<\/span> ;\r\n  <span style=\"color: #000000\">appData<\/span>[<span style=\"color: #000000\">2<\/span>] = <span style=\"color: #000000\">0<\/span> ;\r\n  <span style=\"color: #000000\">appData<\/span>[<span style=\"color: #000000\">1<\/span>] = <span style=\"color: #d35400\">highByte<\/span>(<span style=\"color: #000000\">BateriaV<\/span>);\r\n  <span style=\"color: #000000\">appData<\/span>[<span style=\"color: #000000\">0<\/span>] = <span style=\"color: #d35400\">lowByte<\/span>(<span style=\"color: #000000\">BateriaV<\/span>);\r\n  \r\n  <span style=\"color: #5e6d03\">if<\/span> (serial_msg){\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #005c5f\">\"trama datos Byte: \"<\/span>);\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #000000\">appData<\/span>[<span style=\"color: #000000\">1<\/span>]);\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #005c5f\">\"  \"<\/span>);\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">println<\/span>(<span style=\"color: #000000\">appData<\/span>[<span style=\"color: #000000\">0<\/span>]);\r\n  }\r\n}\r\n<\/pre>\n<h2>Lectura de Sensor<\/h2>\n<pre><span style=\"color: #00979c\">uint16_t<\/span> <span style=\"color: #000000\">SensorBateria<\/span>(){\r\n  <span style=\"color: #434f54\">\/\/ lectura ADC Voltaje de bateria <\/span>\r\n  <span style=\"color: #d35400\">digitalWrite<\/span>(<span style=\"color: #000000\">Vext<\/span>, <span style=\"color: #00979c\">LOW<\/span>);\r\n  <span style=\"color: #d35400\">delay<\/span>(<span style=\"color: #000000\">10<\/span>);\r\n  <span style=\"color: #00979c\">uint16_t<\/span> <span style=\"color: #000000\">ADC_voltage<\/span> = <span style=\"color: #d35400\">analogRead<\/span>(<span style=\"color: #000000\">PowerDetection<\/span>);\r\n  <span style=\"color: #d35400\">digitalWrite<\/span>(<span style=\"color: #000000\">Vext<\/span>, <span style=\"color: #00979c\">HIGH<\/span>);\r\n  \r\n  <span style=\"color: #5e6d03\">if<\/span> (serial_msg){\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">print<\/span>(<span style=\"color: #005c5f\">\"Voltaje Bater\u00eda (V): \"<\/span>);\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">println<\/span>(<span style=\"color: #000000\">ADC_voltage<\/span>);\r\n  }\r\n  <span style=\"color: #5e6d03\">return<\/span> <span style=\"color: #000000\">ADC_voltage<\/span>;\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Un dispositivo como actuador requiere recibir un mensaje de control desde el broker para establecer el estado del artefacto o cosa. En el caso de LoRaWan el mensaje debe gestionarse por el gateway para transformar un mensaje Mqtt enviado al formato de bytes usado en la red LoRa, es decir un Encoder. En el dispositivo &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/lorawan-interruptor-temporizado-archivo-ino\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"LoRaWan \u2013 Interruptor temporizado. Archivo.ino\"<\/span><\/a><\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1465791],"tags":[],"class_list":["post-3463","post","type-post","status-publish","format-standard","hentry","category-lorawan-interruptor-temporizado"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3463","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=3463"}],"version-history":[{"count":1,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3463\/revisions"}],"predecessor-version":[{"id":3464,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3463\/revisions\/3464"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}