Indholdsfortegnelse:

Temperatur- og lysniveauovervågning med visning på LCD NOKIA 5110: 4 trin
Temperatur- og lysniveauovervågning med visning på LCD NOKIA 5110: 4 trin

Video: Temperatur- og lysniveauovervågning med visning på LCD NOKIA 5110: 4 trin

Video: Temperatur- og lysniveauovervågning med visning på LCD NOKIA 5110: 4 trin
Video: Han Yu Ri ✗ Shin Kang Wook ➤ The Temperature Of Language: Our Nineteen fmv |💕 K Drama Hindi Song Mix 2024, Juli
Anonim
Image
Image

Hej allesammen!

I dette afsnit laver vi en enkel elektronisk enhed til at overvåge temperatur og lysniveau. Målinger af disse parametre vises på LCD NOKIA 5110. Enheden er baseret på mikrokontrolleren AVR ATMEGA328P. Overvågningsenheden er udstyret med DS18B20 digitalt termometer og fotoresistor til måling af lysniveau.

Trin 1: Beskrivelse Komponenter

Beskrivelse Komponenter
Beskrivelse Komponenter
Beskrivelse Komponenter
Beskrivelse Komponenter

Grundlæggende komponenter i overvågningsenheden:

  • Mikrokontroller AVR «ATMEGA328P»
  • Monokrom grafisk LCD «NOKIA 5110»
  • Programmerbar opløsning 1-tråds digitalt termometer «DS18B20»
  • Lysafhængig modstand
  • Ledninger

Mikrokontroller AVR «ATMEGA328P»

Overvågningsenheden bruger følgende perifere funktioner i mikrokontroller:

  1. 16-bit timer/tæller afbrydelse
  2. 8-kanals 10-bit ADC
  3. Master/slave SPI serielt interface

Monokrom grafisk LCD «NOKIA 5110»

Specifikationer:

  1. 48 x 84 Dot LCD -skærm
  2. Serielt businterface med maksimal høj hastighed 4 Mbits/S
  3. Intern controller/driver «PCD8544»
  4. LED baglys
  5. Kør ved spænding 2,7-5 volt
  6. Lavt strømforbrug; det er velegnet til batteri applikationer
  7. Temperaturområde fra -25˚C til +70˚C
  8. Support Signal CMOS -input

Håndtering af LCD -adresse (adressering):

Adressearrangementet for hukommelse, der vises på LCD-display (DDRAM) er Matrix, der består af 6 rækker (Y-adresse) fra Y-adresse 0 til Y-adresse 5 og 84 kolonner (X-adresse) fra X-adresse 0 til X- Adresse 83. Hvis brugeren ønsker at få adgang til positionen for at vise resultatet på LCD-display, skal henvise til forholdet mellem X-adresse og Y-adresse.

Data, der sendes til visning, er 8 bit (1 Byte), og de vil blive arrangeret som en lodret linje; i dette tilfælde vil Bit MSB være lavere og Bit LSB være øverst som vist på billedet.

Programmerbar opløsning 1-tråds digitalt termometer DALLAS «DS18B20»

Funktioner:

  1. Unikt 1-Wire®-interface kræver kun en portstift til kommunikation
  2. Reducer komponentantal med integreret temperatursensor og EEPROM
  3. Måler temperaturer fra -55 ° C til +125 ° C (-67 ° F til +257 ° F)
  4. ± 0,5 ° C Nøjagtighed fra -10 ° C til +85 ° C
  5. Programmerbar opløsning fra 9 bit til 12 bit
  6. Ingen eksterne komponenter påkrævet
  7. Parasitic Power Mode kræver kun 2 pins til drift (DQ og GND)
  8. Forenkler distribuerede temperaturfølende applikationer med multidrop-kapacitet
  9. Hver enhed har en unik 64-bit seriel kode gemt i indbygget ROM
  10. Fleksibel brugerdefinerbar ikke-flygtig (NV) alarmindstilling med alarmsøgningskommando Identificerer enheder med temperaturer uden for programmerede grænser

Ansøgninger:

  1. Termostatstyring
  2. Industrielle systemer
  3. Forbrugerprodukter
  4. Termometre
  5. Termisk følsomme systemer

Lysafhængig modstand

Lysafhængig modstand (LDR) er en transducer, der ændrer dens modstand, når lys falder på dens overflade ændres.

Typisk vil en LDR have fra en megaOhm til to megaOhm ved totalt mørke, fra ti til tyve kiloOhms ved ti LUX, fra to til fem kiloohms ved 100 LUX. Modstanden mellem sensorens to kontakter falder med lysintensiteten, eller konduktansen mellem to sensorkontakter øges.

Brug spændingsdelerkredsløb til at konvertere ændring i modstand til ændring i spænding.

Trin 2: Firmware -kode til mikrokontroller

#ifndef F_CPU #definere F_CPU 16000000UL // fortæller controller krystalfrekvens (16 MHz AVR ATMega328P) #endif

// SPI INTERFACE DEFINES #define MOSI 3 // MOSI it's PORT B, PIN 3 #define MISO 4 // MISO it's PORT B, PIN 4 #define SCK 5 // SCK it's PORT B, PIN 5 #define SS 2 // SS det er PORT B, PIN 2

// NULSTIL DISPLAYET #definer RST 0 // NULSTIL det er PORT B, PIN 0

// DISPLAY MODE SELECT - Indtast for at vælge enten kommando/adresse eller datainput. #define DC 1 // DC det er PORT B, PIN 1

// koder array af negative tegnstatiske const unsigned char neg [4] = {0x30, 0x30, 0x30, 0x30};

// koder array af cifre [0..9] statisk const unsigned char font6x8 [10] [16] = {{0xFC, 0xFE, 0xFE, 0x06, 0x06, 0xFE, 0xFE, 0xFC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 0 {0x00, 0x00, 0x18, 0x1C, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00}, // 1 { 0x0C, 0x8E, 0xCE, 0xE6, 0xE6, 0xBE, 0x9E, 0x0C, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 2 {0x00, 0x04, 0x06, 0x0,, 0x8C, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 3 {0x3C, 0x3E, 0x7C, 0x60, 0x60, 0xFC, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00 0x01, 0x03, 0x01}, // 4 {0x1C, 0x3E, 0x3E, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 5 { 0xFE, 0xFE, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 6 {0x04, 0x06, 0x06, 0x6, 0x6, 0x6, 0x6, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00}, // 7 {0xCC, 0xFE, 0xFE, 0x36, 0x36, 0xFE, 0xFE, 0xCC, 0x01, 0x03, 0x03, 0x0, 0x0 0x0 3, 0x01}, // 8 {0x3C, 0x7E, 0x7E, 0x66, 0x66, 0xFE, 0xFE, 0xFC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01} // 9};

// koder array af ordet "TEMP:" statisk const usigneret char TEMP_1 [165] = {0x02, 0x06, 0x06, 0xFE, 0xFE, 0xFE, 0x06, 0x06, 0x02, 0x00, 0xFC, 0xFE, 0xFE, 0x26, 0x26, 0x24, 0x00, 0xFC, 0xFE, 0xFE, 0x1C, 0x38, 0x70, 0x38, 0x1C, 0xFE, 0xFE, 0xFC, 0x00, 0xFC, 0xFE, 0xFE, 0x66, 0x66, 0x7E, 0x7, 0x8, 0x8 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00 0x01, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0C, 0x1E, 0x33, 0x33, 0x1E, 0x0C, 0x0, 0x8 0x9C, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01,};

// koder array af ordet "LUX:" const unsigned char TEMP_2 [60] = {0xFC, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE, 0xFC, 0x00, 0x00, 0xFC, 0xFE, 0xFC, 0x00, 0x04, 0x8E, 0xDE, 0xFC, 0xF8, 0xFC, 0xDE, 0x8E, 0x04, 0x00, 0x8C, 0x8C, 0x01, 0x03, 0x03, 0x03, 0x03, 0x0, 0x0, 0x0, 0x3, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x01};

#omfatte

#include #include

// Portinitialiseringvoid Port_Init () {DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS) | (1 << RST) | (1 << DC); // Indstil MOSI, SCK, SS, RST, DC som output, alle andre input PORTB | = (1 << RST); // Indstil RST pin så høj PORTB | = (1 << SS); // Indstil SS pin som høj - Display er Deaktiver DDRC = 0xFFu; // Indstil alle stifter i PORTC som output. DDRC & = ~ (1 << 0); // Gør første pin af PORTC som input PORTC = 0x00u; // Sæt alle stifter i PORTC lavt, hvilket slukker det. }

// ADC Initialization void ADC_init () {// Aktiver ADC, sampling freq = osc_freq/128 indstil prescaler til maks. Værdi, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); ADMUX = (1 << REFS0); // Vælg spændingsreferencen for ADC // Vælg kanalnul som standard ved hjælp af ADC Multiplexer Select register (ADC0). }

// Funktion til at læse resultatet af analog til digital konvertering uint16_t get_LightLevel () {_delay_ms (10); // Vent et stykke tid på, at kanalen får den valgte ADCSRA | = (1 << ADSC); // Start ADC -konverteringen ved at indstille ADSC -bit. skriv 1 til ADSC mens (ADCSRA & (1 << ADSC)); // vent på, at konverteringen er færdig // ADSC bliver 0 igen indtil da, kør loop kontinuerligt _delay_ms (10); retur (ADC); // Returner 10-bit resultatet}

// SPI Initialization void SPI_Init () {SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); // Aktiver SPI, Set as Master, Set Prescaler as Fosc/16 in SPI control Tilmeld }

// initialiser 16 bit Timer1, afbryd og variabelt tomrum TIMER1_init () {// opsæt timer med prescaler = 256 og CTC mode TCCR1B | = (1 << WGM12) | (1 << CS12); // initialiser tælleren TCNT1 = 0; // initialiser sammenligningsværdi - 1 sek. OCR1A = 62500; // aktiver sammenligne afbryd TIMSK1 | = (1 << OCIE1A); // muliggøre globale afbrydelser sei (); }

// Vis Aktiver tomrum SPI_SS_Enable () {PORTB & = ~ (1 << SS); // Aktiver SS -pin til logik 0}

// Display Disable void SPI_SS_Disable () {PORTB | = (1 << SS); // Deaktiver SS -pin til logik 1}

// Funktion til at sende data til displaybufferens tomrum SPI_Tranceiver (usignerede char -data) {SPDR = data; // Indlæs data i bufferen mens (! (SPSR & (1 << SPIF))); // Vent, indtil transmissionen er fuldført}

// Nulstil displayet i begyndelsen af initialiseringen void Display_Reset () {PORTB & = ~ (1 << RST); _forsinkelse_ms (100); PORTB | = (1 << RST); }

// Kommando skrivefunktion ugyldig Display_Cmnd (usignerede char -data) {PORTB & = ~ (1 << DC); // lav DC pin til logik 0 for kommandodrift SPI_Tranceiver (data); // sende data om dataregister PORTB | = (1 << DC); // gør DC pin til logik høj for datadrift}

// Initialisering af Display ugyldig Display_init () {Display_Reset (); // nulstil displayet Display_Cmnd (0x21); // kommando indstillet i tilføjelsestilstand Display_Cmnd (0xC0); // indstil spændingen ved at sende C0 betyder VOP = 5V Display_Cmnd (0x07); // indstil temp. koefficient til 3 Display_Cmnd (0x13); // sætværdi for spændingsbias system Display_Cmnd (0x20); // kommando indstillet i grundlæggende tilstand Display_Cmnd (0x0C); // vis resultat i normal tilstand}

// Ryd displayet ugyldigt Display_Clear () {PORTB | = (1 << DC); // lav DC pin til logik høj for datadrift for (int k = 0; k <= 503; k ++) {SPI_Tranceiver (0x00);} PORTB & = ~ (1 << DC); // lav DC pin til logik nul til kommandooperation}

// indstil kolonnen og rækken til positionen for visning af resultat på LCD Display ugyldig Display_SetXY (usigneret tegn x, usigneret tegning y) {Display_Cmnd (0x80 | x); // kolonne (0-83) Display_Cmnd (0x40 | y); // række (0-5)}

// Funktion til at vise negativt tegn ugyldigt Display_Neg (usigneret tegn) {Display_SetXY (41, 0); // Indstil placeringsadressen på displayet for (int index = 0; index0) {SPDR = 0x30;} // Indlæs data i bufferen på displayet (vis negativt tegn) ellers {SPDR = 0x00;} // Indlæs data i visningsbufferen (klart negativt tegn) mens (! (SPSR & (1 << SPIF))); // Vent, indtil transmissionen er fuldført _delay_ms (100); }}

// Funktion til at rydde det digitale tegn ugyldigt Off_Dig (usigneret tegn x, usigneret tegning) {Display_SetXY (x, y); // Indstil placeringsadressen på displayet (øverste række) for (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Indlæs data i bufferen på displayet (fjern øverste del af digitalt tegn) y ++; Display_SetXY (x, y); // Indstil adressen på positionen på displayet (nederste række) for (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Indlæs data i bufferens display (tydelig nederste del af digitalt skilt)}

// Funktion til at vise digitalt tegn ugyldigt Display_Dig (int dig, unsigned char x, unsigned char y) {Display_SetXY (x, y); // Indstil adressen på positionen på displayet (øverste række) for (int index = 0; index <16; index ++) {if (index == 8) {y ++; Display_SetXY (x, y);} // Indstil adressen på positionen på displayet (nederste række) SPI_Tranceiver (font6x8 [dig] [index]); // Indlæs koder array af cifret data i bufferen på display _delay_ms (10); }}

// Initialisering af DS18B20 usigneret char DS18B20_init () {DDRD | = (1 << 2); // Indstil PD2 pin på PORTD som output PORTD & = ~ (1 << 2); // Indstil PD2 -pin som lav _forsinkelse_us (490); // Initialisering Timing DDRD & = ~ (1 << 2); // Indstil PD2 -pin på PORTD som input _delay_us (68); // Timing OK_Flag = (PIND & (1 << 2)); // få sensorpuls _delay_us (422); returner OK_Flag; // return 0-ok sensor er stik, sensor med 1 fejl er taget ud}

// Funktion til at læse byte fra DS18B20 usigneret char read_18b20 () {usigneret char i, data = 0; for (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Indstil PD2 -pin på PORTD som output _delay_us (2); // Timing DDRD & = ~ (1 1; // Næste bit hvis (PIND & (1 << 2)) data | = 0x80; // sæt bit i byte _delay_us (62);} returner data;}

// Funktion til at skrive byte til DS18B20 void write_18b20 (usignerede char -data) {unsigned char i; for (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Indstil PD2 -pin på PORTD som output _delay_us (2); // Timing if (data & 0x01) DDRD & = ~ (1 << 2); // hvis vi vil skrive 1, skal du slippe linjen ellers DDRD | = (1 1; // Næste bit _delay_us (62); // Timing DDRD & = ~ (1 << 2); // Indstil PD2 -pin på PORTD som input _delay_us (2);}}

// Funktion til visning af lysniveau tomrum Read_Lux () {uint16_t buffer; usigneret int temp_int_1, temp_int_2, temp_int_3, temp_int_0; // enkelt cifre, to cifre, tre cifre, kvart cifre buffer = get_LightLevel (); // læs resultatet af analog til digital konvertere lysniveau temp_int_0 = buffer % 10000 /1000; // kvartcifret temp_int_1 = buffer % 1000 /100; // trecifret temp_int_2 = buffer % 100 /10; // tocifret temp_int_3 = buffer % 10; // encifret hvis (temp_int_0> 0) // hvis resultatet er et kvartcifret nummer {Display_Dig (temp_int_0, 32, 2); // vis 1 ciffer i lysniveau Display_Dig (temp_int_1, 41, 2); // vis 2 cifret lysniveau Display_Dig (temp_int_2, 50, 2); // vis 3 cifret lysniveau Display_Dig (temp_int_3, 59, 2); // vis 4 cifret lysniveau} ellers {if (temp_int_1> 0) // hvis resultatet er et trecifret tal {Off_Dig (32, 2); // ryd 1 tegn på nummeret Display_Dig (temp_int_1, 41, 2); // vis 1 ciffer i lysniveau Display_Dig (temp_int_2, 50, 2); // vis 2 cifret lysniveau Display_Dig (temp_int_3, 59, 2); // vis 3 cifret lysniveau} ellers {if (temp_int_2> 0) // hvis resultatet er tocifret nummer {Off_Dig (32, 2); // ryd 1 tegn på nummeret Off_Dig (41, 2); // ryd 2 tegn på nummer Display_Dig (temp_int_2, 50, 2); // vis 1 ciffer i lysniveau Display_Dig (temp_int_3, 59, 2); // vis 2 cifret lysniveau} ellers // hvis resultatet er et cifret tal {Off_Dig (32, 2); // ryd 1 tegn på nummeret Off_Dig (41, 2); // ryd 2 tegn på nummeret Off_Dig (50, 2); // ryd 3 tegn på nummer Display_Dig (temp_int_3, 59, 2); // vis 1 ciffer i lysniveau}}}}

// Funktion til visning af ugyldig temperatur Read_Temp () {usigneret int buffer; usigneret int temp_int_1, temp_int_2, temp_int_3; // enkelt cifre, to cifre, tre cifre, kvart cifre usigneret char Temp_H, Temp_L, OK_Flag, temp_flag; DS18B20_init (); // Initialisering af DS18B20 skrive_18b20 (0xCC); // Sensor kode check write_18b20 (0x44); // Start temperaturkonvertering _delay_ms (1000); // Forsinkelse af sensorafstemning DS18B20_init (); // Initialisering af DS18B20 skrive_18b20 (0xCC); // Sensor kode check write_18b20 (0xBE); // Kommando for at læse indholdet af Sensor RAM Temp_L = read_18b20 (); // Læs de første to byte Temp_H = read_18b20 (); temp_flag = 1; // 1-positiv temperatur, 0-negativ temperatur // Få negativ temperatur hvis (Temp_H & (1 << 3)) // Sign Bit Check (hvis bit er indstillet-negativ temperatur) {underskrevet int temp; temp_flag = 0; // flag er indstillet 0 - negativ temperatur temp = (Temp_H << 8) | Temp_L; temp = -temp; // Konverter den ekstra kode i direkte Temp_L = temp; Temp_H = temp >> 8; } buffer = ((Temp_H 4); temp_int_1 = buffer % 1000 /100; // trecifret temp_int_2 = buffer % 100 /10; // tocifret temp_int_3 = buffer % 10; // enkeltcifret

// Hvis temperaturen er et negativt tegn på temperatur, er det ellers klart

if (temp_flag == 0) {Display_Neg (1);} else {Display_Neg (0);} if (temp_int_1> 0) // hvis resultatet er et trecifret tal {Display_Dig (temp_int_1, 45, 0); // vis 1 ciffer med temperatur Display_Dig (temp_int_2, 54, 0); // vis 2 -cifret temperatur Display_Dig (temp_int_3, 63, 0); // vis 3 cifret temperatur} ellers {if (temp_int_2> 0) // hvis resultatet er tocifret nummer {Off_Dig (45, 0); // ryd 1 tegn på nummeret Display_Dig (temp_int_2, 54, 0); // vis 1 ciffer med temperatur Display_Dig (temp_int_3, 63, 0); // vis 2 cifret temperatur} ellers // hvis resultatet er et cifret tal {Off_Dig (45, 0); // ryd 1 tegn på nummeret Off_Dig (54, 0); // ryd 2 tegn på nummer Display_Dig (temp_int_3, 63, 0); // vis 1 ciffer med temperatur}}}

// Denne ISR udløses, når der forekommer en match mellem timertælling og sammenligningsværdi (hvert 1. sekund) ISR (TIMER1_COMPA_vekt) {// Læsning, visning af temperatur og lysniveau Read_Temp (); Read_Lux (); }

// Funktion til at vise ordene "TEMP" og "LUX" ugyldig Display_label () {// Word "TEMP" Display_SetXY (0, 0); // Indstil placeringsadressen på displayet (opad række) for (int index = 0; index <105; index ++) {if (index == 40) {Display_SetXY (0, 1);} // Indstil adresse for position på displayet (nederste række) hvis (index == 80) {Display_SetXY (72, 0);} // Indstil adressen på positionen på displayet (opad række) hvis (index == 92) {Display_SetXY (72, 1); } // Indstil placeringsadressen på displayet (nederste række) SPDR = TEMP_1 [indeks]; // Indlæs koder array -data i bufferens display mens (! (SPSR & (1 << SPIF))); // Vent, indtil transmissionen er fuldført _delay_ms (10); } // Word "LUX" Display_SetXY (0, 2); // Indstil placeringsadressen på displayet (opad række) for (int index = 0; index <60; index ++) {if (index == 30) {Display_SetXY (0, 3);} // Indstil adresse for position på display (nederste række) SPDR = TEMP_2 [indeks]; // Indlæs koder array -data i bufferens display mens (! (SPSR & (1 << SPIF))); // Vent, indtil transmissionen er fuldført _delay_ms (10); }}

int main (tomrum)

{Port_Init (); // Portinitialisering ADC_init (); // ADC Initialisering SPI_Init (); // SPI Initialisering SPI_SS_Enable (); // Display Aktiver DS18B20_init (); // Initialisering af DS18B20 Display_init (); // Displayinitialisering Display_Clear (); // Vis tydelig Display_label (); // Vis ord "TEMP" og "LUX" TIMER1_init (); // Timer1 Initialisering. Start overvågning. Henter parametre hvert andet sekund. // Infinity loop mens (1) {}}

Trin 3: Blinkende firmware til mikrokontroller

Upload af HEX -fil i mikrokontrollerens flash -hukommelse. Se videoen med en detaljeret beskrivelse af mikrokontrollerens flashhukommelsesforbrænding: Mikrokontrollerens flashhukommelse brænder …

Trin 4: Overvågning af enheds kredsløbssamling

Overvågningsenhedskredsløbssamling
Overvågningsenhedskredsløbssamling
Overvågningsenhedens kredsløbssamling
Overvågningsenhedens kredsløbssamling

Tilslut komponenter i henhold til skematisk diagram.

Tilslut strøm, og det virker!

Anbefalede: