Taula de continguts:

Visualització de temps i temps Arduino 3 en 1: 11 passos
Visualització de temps i temps Arduino 3 en 1: 11 passos

Vídeo: Visualització de temps i temps Arduino 3 en 1: 11 passos

Vídeo: Visualització de temps i temps Arduino 3 en 1: 11 passos
Vídeo: Раскрываю секрет сочного мяса! Рецепт приготовления баранины с содой в помпейской печи 2024, De novembre
Anonim

Per Boomer48 Segueix-ne més per l'autor:

Ús de l’ATtiny85
Ús de l’ATtiny85
Utilitzant ATtiny85
Utilitzant ATtiny85
Eina de particionament de pastissos amb potència Pi i eina de poda de polígons
Eina de particionament de pastissos amb potència Pi i eina de poda de polígons
Eina de particionament de pastissos amb potència Pi i eina de poda de polígons
Eina de particionament de pastissos amb potència Pi i eina de poda de polígons
Controls digitals per a un amplificador d'àudio manual
Controls digitals per a un amplificador d'àudio manual
Controls digitals per a un amplificador d'àudio manual
Controls digitals per a un amplificador d'àudio manual

M'agraden els microcontroladors PIC i m'agrada programar en llenguatge assemblador. De fet, durant els darrers dos anys he publicat al meu lloc web uns 40 projectes basats en aquesta combinació. Fa poc vaig demanar algunes peces a un dels meus proveïdors favorits dels Estats Units i vaig veure un Arduino Nano, amb un cable de programació, per només 1,20 dòlars més que un xip de processador ATMEGA328. Així que en vaig comprar un parell. Després vaig descarregar l’IDE Arduino i em vaig treure la pols de la memòria de la programació ‘C ++’.

Aquest projecte és una combinació d’un rellotge que utilitza GPS per sincronitzar i un receptor de RF que descodifica els missatges meteorològics d’un sensor AcuRite comú. El resultat és una visualització de temperatura i temperatura a petita escala. El rellotge GPS i les rutines meteorològiques es configuren com a fitxers d’inclusió independents, de manera que és fàcil entrar a la rutina principal i configurar-lo per fer només la funció de rellotge o només la funció meteorològica. Simplement descomenteu el "#define" adequat a la part superior de la rutina principal si només voleu una de les funcions.

Si s’utilitzen ambdues funcions, la línia superior de la pantalla LCD mostra l’hora local i la línia inferior de la pantalla LCD mostra la humitat i la temperatura en centígrads i Fahrenheit. Si només s’utilitza la funció de rellotge, la línia superior mostra l’hora local i la línia inferior mostra UTC. Si només s’utilitza la funció meteorològica, la línia superior mostra el primer sensor rebut i la línia inferior mostra qualsevol altre sensor rebut. Vaig afegir aquesta capacitat perquè tinc dos sensors meteorològics.

Pas 1: sensor meteorològic

Sensor meteorològic
Sensor meteorològic
Sensor meteorològic
Sensor meteorològic
Sensor meteorològic
Sensor meteorològic

El sensor meteorològic AcuRite utilitzat aquí envia informació de temperatura i humitat cada 16 segons. A la part posterior mostra un número de model 000592TXR, però normalment s’anuncia com a model 06002M. Aquest sensor és utilitzat per molts models d’estacions meteorològiques diferents, de manera que és fàcil de trobar i els he pogut aconseguir a eBay per menys de 20 dòlars. AcuRite ven sensors d’aspecte similar per a algunes de les seves estacions meteorològiques, però poden adherir-se o no al mateix protocol de comunicació. Hi ha alguna indicació al web que el sensor 00606 només de temperatura utilitza el mateix format de missatge, però amb un byte d’humitat no vàlid.

Com es veu a la primera forma d’ona que es mostra més amunt, els missatges meteorològics s’envien en ràfegues amb una diferència de 2 ms entre els missatges successius. La segona forma d'ona que es mostra a dalt expandeix part d'un missatge per tal de veure les durades i els patrons de bits. Hi ha quatre bits de sincronització d’uns 600us d’alçada seguits de 600us de baix. Els bits de dades estan representats per 400us d’alçada seguits de 200us de baixa (1) o 200us d’alçada seguits de 400us de baixa (0).

El format del missatge consta de 7 bytes de dades. Els dos primers bytes són l’identificador del sensor i aquests no canvien (és a dir: no utilitza cap codi continu). L’últim byte és una suma de comprovació additiva simple dels primers sis bytes. El tercer byte és un indicador de nivell de bateria i sempre ha de tenir 44 hexadecimals si la bateria és bona. El quart byte és la humitat i té un valor sense escala entre 0 i 99. És important tenir en compte que el bit més significatiu de bytes 4, 5 i 6 és un bit de paritat i no forma part de la mesura valors. Els bytes 5 i 6 són la temperatura escalada (centígrads), concatenant-se els 4 bits inferiors del byte 5 amb els 7 bits inferiors del byte 6 per formar un valor d’11 bits. La temperatura sempre es representa com un nombre positiu i només es torna negativa quan s’aplica l’escala. L'escala és (C / 10) - 100. La divisió per 10 és necessària perquè la resolució de la temperatura és en dècimes de grau. La resta és necessària perquè el sensor afegeix 100 per mantenir el valor transmès positiu.

Pas 2: receptor de RF

Receptor de RF
Receptor de RF
Receptor de RF
Receptor de RF

El mòdul RF que faig servir per aquest projecte és el RXB6. És un receptor súper heterodí en oposició als receptors súper regeneratius menys desitjables. Si mireu els mòduls de RF barats que hi ha, trobareu que les plaques de transmissor i de receptor sovint s’agrupen. La majoria d'aquests receptors agrupats són de tipus superregeneratiu, de manera que solen tenir característiques de rendiment molt més baixes (inclòs el rang) que els receptors superheterodins. Només necessitem el mòdul receptor per a aquest projecte perquè rebrem senyals d’un transmissor de sensor meteorològic.

Pas 3: antenes RF

Antenes RF
Antenes RF

El RXB6 no ve amb antena. Podeu comprar-ne de helicoïdals bastant econòmicament, però també és fàcil fabricar la vostra pròpia antena. De fet, es podria lliscar un cable de pont de panell sobre el passador de l’antena del mòdul si no voleu que us agradi massa. L’ideal seria que una antena de cable recte tingués 1/4 de longitud d’ona que funcionés fins a uns 6,8 polzades. Inicialment vaig fer el filferro i no vaig tenir cap problema en agafar el sensor exterior tot i que el meu taller d’electrònica es troba al soterrani.

Una altra possibilitat és crear la vostra pròpia antena helicoïdal. Hi ha diversos plans per fer-ho al web, però el que es mostra a la imatge superior és el que he fet. Vaig utilitzar un cable de nucli sòlid d’un tros de cable Ethernet i el vaig enrotllar al voltant de la canya llisa d’una broca de 5/32 polzades. Deixeu l’aïllament activat, excepte la punta que es solda a la placa RF. Necessitaràs 20 voltes. També podeu utilitzar una broca de 7/32 polzades i embolicar 17 voltes. Qualsevol d’aquestes probablement funcionarà bé per als intervals que és probable que tingueu per als vostres sensors. La veritable clau és tenir un bon receptor de RF per començar. Els sensors AcuRite també tenen transmissors força forts.

Pas 4: protocol de comunicació RF

Hi ha unes quantes tècniques de modulació diferents per transmetre dades, però aquests sensors utilitzen el més simple que és OOK (teclat on-off) o ASK (teclat de desplaçament d’amplitud). Com que tractem amb bits de dades 0/1 en aquest exemple, l'amplitud està plena o totalment apagada. Per tant, per als nostres propòsits, OOK i ASK són els mateixos perquè OOK significa que la companyia de RF està plena o apagada. El format del missatge generalment el defineix el fabricant del dispositiu transmissor i poden utilitzar gairebé qualsevol velocitat de transmissió, qualsevol estil de format de bits i qualsevol longitud de missatge. La banda de 433 MHz està plena de transmissions per a comptadors intel·ligents, etc., de manera que cal programar el programari per filtrar només el format de missatge que volem utilitzar.

Pas 5: dades de temps

Dades de temps
Dades de temps

Utilitzo una unitat GPS barata per obtenir dades de temps precises que es reiniciaran automàticament després d’un tall d’alimentació. Tinc diverses unitats GPS (sense pantalles) que emeten les frases NMEA estàndard, però la més petita i barata de les unitats que tinc és la NEO-6M. El mòdul NEO-6M és fàcil de connectar a l’Arduino perquè utilitza un port sèrie de nivell TTL. L'única diferència real és que l'estàndard NMEA especifica una velocitat de transmissió en sèrie de 4800, però el NEO-6M per defecte és de 9600. Podeu executar el programa gratuït "u-center" per canviar la velocitat en bauds, però l'acabo de deixar al valor predeterminat de fàbrica. També hi ha un programa d’utilitat gratuït anomenat GPSInfo (publicat per Globalsat) que és molt útil per visualitzar informació GPS al PC. Podeu connectar la unitat GPS a un cable USB a TTL estàndard per comprovar-la o configurar-la mitjançant un PC. Tingueu en compte que el xip GPS del mòdul funciona a 3,3 volts (mitjançant un regulador de voltatge integrat), de manera que si voleu connectar-vos al port RXD, hauríeu de canviar de nivell des de 5 volts. El port TXD es pot connectar directament a Arduino o al PC.

Pas 6: zones horàries

Mostrar temps de GPS és una cosa fàcil de fer sempre que només vulgueu mostrar UTC (Temps Universal Coordinat). Les frases NMEA es componen de caràcters ASCII que es poden enviar directament a la pantalla LCD. La part de temps té el format de HHMMSS. FF (hores, minuts, segons i segons fraccionats). Per al nostre rellotge, la part fraccionària no és útil, de manera que només cal tractar sis caràcters. El problema és que aleshores haureu de convertir a la vostra hora local i a un format AM / PM de 12 hores si voleu això. Però de vegades els problemes fan que la vida sigui interessant, de manera que realment es tracta d’aquesta part del programari.

Pel que fa a les zones horàries, podríeu pensar que només n’hi hauria 24, amb 12 a l’est de la ubicació UTC (+ zones) i 12 a l’oest de la ubicació UTC (- zones). De fet, n’hi ha unes quantes que són hores fraccionades i una parella que supera el “límit” de 12 hores. Si resideix en alguna d'aquestes zones, em disculpo perquè el meu programari només representa les 24 hores senceres. També hi ha alguns de nosaltres que utilitzen l'horari d'estiu una part de l'any, però això no es té en compte automàticament al programari. Això requeriria una taula de cerca de dates futures, una complexitat addicional al programari i la necessitat d'actualitzar el programari si canvien les setmanes de l'any per al canvi. En canvi, el maquinari utilitza un commutador de contacte momentani per permetre una configuració fàcil de la zona horària (desplaçament UTC).

Pas 7: Esquema

Esquema
Esquema

L’esquema es mostra més amunt i inclou les connexions per a una interfície LCD 1602 de 4 bits. Les dades serials del receptor de RF es troben a nivells lògics digitals, de manera que es connecten directament a un dels pins d'entrada de dades Arduino. El pin està configurat al programari per realitzar una funció d'interrupció-canvi, de manera que puguem mesurar l'amplada del pols. La sortida GPS TXD està connectada directament a l’entrada Arduino RX.

S'utilitzen dos commutadors. Com es va esmentar anteriorment, un commutador de contacte momentani permet configurar el desplaçament UTC. Es pot prémer el commutador en qualsevol moment per entrar al mode definit. Inicialment, la pantalla mostrarà un desplaçament UTC no vàlid de "+77". Consulteu la secció "Programari de rellotge" per obtenir instruccions de configuració del desplaçament UTC.

El segon interruptor és un senzill interruptor d’encesa / apagada. A la posició "apagat", l'hora es mostrarà en format de 12 hores (AM / PM) i, en la posició "activada", l'hora es mostrarà en format de 24 hores. Aquest commutador es pot canviar en qualsevol moment per alternar entre formats.

Si només es desitja la funció de rellotge, no cal connectar el mòdul receptor RF. Si només es desitja la funció meteorològica, no cal que connecteu el GPS i els dos commutadors.

Pas 8: programari LCD

Acostumo a utilitzar un dels dos tipus d’interfícies LCD. Una és la interfície estàndard de 4 bits i l’altra és una interfície de 3 fils que utilitza un registre de desplaçament. Vaig dissenyar aquesta interfície quan treballava amb microcontroladors PIC petits que tenien un nombre limitat de pins d'E / S. He utilitzat la interfície de 4 bits per a aquest projecte, però tinc el meu propi fitxer LCD inclou en lloc d’utilitzar la biblioteca genèrica Arduino LCD. Això redueix el consum de memòria i la complexitat del codi i també em permet modificar el codi per a projectes específics com aquest.

Pas 9: programari de rellotge

La unitat GPS emet frases NMEA-0183 estàndard, que són cadenes ASCII que contenen informació variada. Per a aquesta aplicació, vaig escollir la frase GGA per obtenir la informació del temps, ja que aquesta era la frase que vaig utilitzar per a un projecte GPS anterior. Els camps d'informació de les frases NMEA estan separats per comes, de manera que, després de detectar la capçalera de la frase GGA, el programari normalment compta les comes i crida a la rutina adequada per a cada camp d'informació GPS desitjat. Aquí només es necessita la informació de temps que es troba al camp després de la primera coma, de manera que no cal comptar.

Els sis dígits de temps (HHMMSS) es guarden a la memòria intermèdia i després es processen després de rebre'ls tots. El GPS pot emetre alguns missatges incomplets al principi, de manera que la rutina de memòria intermèdia verifica que cada caràcter és un valor numèric ASCII. Si es rep un caràcter dolent, el missatge es descarta. Això també pot passar en poques ocasions durant el funcionament normal, sobretot si la comunicació del port sèrie cau una mica. Només he vist això una vegada i tot el que va passar és que el temps es va aturar un segon i després va saltar dos segons en lloc d’un.

Si el programari està configurat per mostrar només l'hora, la primera línia de la pantalla LCD mostrarà l'hora local i la segona línia mostrarà UTC. Per a UTC, el programari només envia els caràcters ASCII directament a la rutina de visualització, amb dos punts (:) inserits adequadament.

Per convertir l'UTC a l'hora local, s'ha d'aplicar el desplaçament UTC (zona horària). Com que l’hora UTC des del GPS és en format ASCII, el programari converteix els caràcters d’hora ASCII en decimal i després afegeix el desplaçament UTC. El desplaçament UTC s’emmagatzema com un valor BCD positiu amb un bit de signe, de manera que primer es converteix en un valor enter i després es nega si el bit de signe està establert. Un cop calculat el valor de l'hora local, s'utilitza una taula de cerca per convertir-lo a BCD i, a continuació, el BCD es torna a convertir en ASCII per mostrar-lo. La taula de cerca ha de gestionar el format UTC de 24 hores i els fusos horaris de +/- 12. Per fer-ho, les hores UTC de 0000 a 2300 ocupen les 24 entrades centrals de la taula amb 12 entrades anteriors i 12 entrades posteriors per tenir en compte els fusos horaris. Una taula té un format de 12 hores, de manera que també he afegit una taula de cerca per a la part AM / PM de la pantalla. L’altra taula té un format de 24 hores. Com s’ha esmentat anteriorment, un interruptor d’encesa / apagada permet seleccionar el format de 12 o 24 hores.

La zona horària es recupera de EEPROM durant la inicialització i es mostra breument. Si no s'ha configurat almenys una vegada, es crida a la rutina de configuració. La rutina de configuració també es pot trucar en qualsevol moment prement el commutador de contacte momentani. La rutina de configuració inicialitzarà la pantalla a "UTC OFFSET +77". Si premeu breument el commutador, el valor canviarà a “-00”. Si es requereix una zona horària positiva, una altra premuda breu canviarà el valor a "+00". Si premeu llargament (> 1 segon), el mode de configuració passarà al següent pas. En aquest moment, cada pulsació breu incrementarà el valor del temps fins a un màxim de 12. Després d’arribar a la zona horària desitjada, manteniu premut l’interruptor durant més d’un segon i, a continuació, deixeu-lo anar. El programari desarà el valor UTC a EEPROM i mostrarà breument "OFFSET SAVED". Si cometeu un error durant l'entrada, només heu de sortir i, a continuació, torneu a prémer el botó per restablir-lo.

El NEO-6M no requereix una bona correcció de posició per generar el temps, de manera que hauria de publicar missatges tan bon punt obtingui un satèl·lit. Fins llavors, a la pantalla es mostrarà "SENSE DADES".

Pas 10: programari meteorològic

El microcontrolador PIC té la capacitat d’encendre / apagar un temporitzador mitjançant un impuls extern. Aquest mateix pols d'entrada també es pot utilitzar com a interrupció externa per indicar una lectura de la durada del pols. L'Arduino no té aquesta capacitat exacta, així que he utilitzat la funció d'interrupció en canvi. En un cantó del pols del missatge RF, el controlador d'interrupcions estalvia el temps actual de microsegon. A la vora oposada es calcula el temps transcorregut per determinar l'amplada del pols.

El programari té una definició "DEBUG" que permet mostrar el format de dades en brut dels missatges rebuts. També hi ha una definició per especificar el pin d'entrada Arduino per al flux en sèrie del receptor de RF. El programari està configurat per calcular la configuració de registre d'interrupció-canvi adequada en funció d'aquesta definició. El càlcul només funciona per als pins digitals Arduino. Es podria utilitzar un pin analògic, però que requeriria una codificació dura dels valors del registre.

El controlador d’interrupcions determina si el recompte capturat és prou llarg per ser un impuls d’inici. Com es va esmentar anteriorment, la bretxa entre diversos missatges és de 2 ms, de manera que això és el que busca el programari. A causa de tot el trànsit de 433 MHz, la projecció inicial del programari assegura que el temps mesurat sigui d'almenys 1,8 ms, però no superior a 2,4 ms. Després de detectar l'inici, el programari busca els bits de sincronització (600us) i compta per assegurar-se que se'n rebin quatre. Un cop superades aquestes proves, el programari busca els temps de bits adequats de 200us i 400us.

Els bits rebuts es formen en bytes i cada byte es desa. Després de rebre set bytes, es verifica la suma de comprovació del missatge abans que es permeti un processament posterior. Si s'han de produir bytes en brut (mode de depuració), els bytes es converteixen en caràcters ASCII i s'envien a la pantalla LCD. Si es desitgen sortides d'humitat i temperatura, es realitzen les conversions adequades.

Els dos bytes de dades centígrads del missatge RF es combinen per formar un valor d'11 bits. La porció inferior es desplaça cap a l'esquerra un bit per eliminar el bit de paritat i alinear-lo amb els bits de la porció superior. Els dos bytes es formen en una variable de paraula de 16 bits i, tot seguit, es desplaça un bit a la dreta per obtenir l'alineació de bits final. A continuació, la paraula variable es converteix en una variable de coma flotant per als càlculs matemàtics.

Un gran avantatge d’utilitzar C ++ a l’Arduino enfront del llenguatge ensamblador al PIC és que simplifica els càlculs matemàtics. Com s'ha esmentat anteriorment, la conversió de centígrads és (C / 10) -100. El resultat es converteix en una cadena i s’envia a la pantalla LCD per mostrar-lo. El càlcul de Fahrenheit és (C * 1,8) + 32. El resultat es converteix de nou en una cadena i s'envia a la pantalla LCD per mostrar-lo. En ambdós casos, la conversió de cadena inclou el signe negatiu (si escau) i el punt decimal. Es fa una comprovació del punt decimal per assegurar-se que només s’envia un caràcter després del decimal a la pantalla. Aquesta comprovació és necessària perquè la cadena pot variar entre 3 i 5 caràcters.

Tinc dos sensors AcuRite, de manera que he afegit una comprovació al programari per assegurar-me que les dades d’un no sobreescriuen les dades de l’altre si el programari està configurat per fer només la funció meteorològica. El primer sensor rebut després de l’engegada es mostra a la línia 1 i l’altre es mostra a la línia 2. Mitjançant el mode de depuració, puc veure quin és l’identificador de cada sensor, de manera que podria fer una simple comprovació del codi si només volia processar dades d’un d’ells.

El programari supervisa l'estat de la bateria (byte3) i mostra un missatge si indica que la bateria és baixa. Aquest missatge sobreescriu la resta de dades d'aquest sensor.

Pas 11: pantalles

Pantalles
Pantalles
Pantalles
Pantalles
Pantalles
Pantalles

A continuació, es mostren alguns exemples de visualització de les diverses funcions. Tinc alguns altres instructables, però la majoria dels meus projectes de microcontroladors PIC es poden trobar al meu lloc web a: www.boomerrules.wordpress.com

Recomanat: