Turinys:

Temperatūros ir šviesos lygio monitorius su LCD ekranu NOKIA 5110: 4 žingsniai
Temperatūros ir šviesos lygio monitorius su LCD ekranu NOKIA 5110: 4 žingsniai

Video: Temperatūros ir šviesos lygio monitorius su LCD ekranu NOKIA 5110: 4 žingsniai

Video: Temperatūros ir šviesos lygio monitorius su LCD ekranu NOKIA 5110: 4 žingsniai
Video: Zigbee šviesos, temperatūros ir drėgmės jutiklis su Moes e-ink ekranu 2024, Liepa
Anonim
Image
Image

Sveiki visi!

Šiame skyriuje mes gaminame paprastą elektroninį prietaisą temperatūrai ir šviesos lygiui stebėti. Šių parametrų matavimai rodomi LCD NOKIA 5110. Įrenginys yra pagrįstas mikrovaldikliu AVR ATMEGA328P. Stebėjimo įtaisas turi skaitmeninį DS18B20 termometrą ir fotorezistorių šviesos lygiui matuoti.

1 žingsnis: aprašo komponentai

Aprašymas Komponentai
Aprašymas Komponentai
Aprašymas Komponentai
Aprašymas Komponentai

Pagrindiniai stebėjimo prietaiso komponentai:

  • Mikrokontroleris AVR «ATMEGA328P»
  • Nespalvotas grafinis skystųjų kristalų ekranas „NOKIA 5110“
  • Programuojamas skiriamosios gebos 1 laidų skaitmeninis termometras „DS18B20“
  • Nuo šviesos priklausomas rezistorius
  • Laidai

Mikrokontroleris AVR «ATMEGA328P»

Stebėjimo įrenginys naudoja šias periferines mikrovaldiklio funkcijas:

  1. 16 bitų laikmačio/skaitiklio pertraukimas
  2. 8 kanalų 10 bitų ADC
  3. Pagrindinė/pavaldi SPI nuosekli sąsaja

Nespalvotas grafinis skystųjų kristalų ekranas „NOKIA 5110“

Specifikacijos:

  1. 48 x 84 taškų LCD ekranas
  2. Serijinės magistralės sąsaja su maksimaliu dideliu greičiu 4 Mbit/s
  3. Vidinis valdiklis/tvarkyklė «PCD8544»
  4. LED apšvietimas
  5. Veikia 2,7–5 voltų įtampa
  6. Mažas energijos suvartojimas; jis tinka akumuliatoriams
  7. Temperatūros diapazonas nuo -25 ° C iki +70 ° C
  8. Palaikykite signalo CMOS įvestį

LCD adreso tvarkymas (adresavimas):

Skystųjų kristalų ekrane (DDRAM) rodomas atminties adresų išdėstymas yra matrica, kurią sudaro 6 eilutės (Y adresas) nuo Y-adreso 0 iki Y-adreso 5 ir 84 stulpeliai (X adresas) nuo X-adreso 0 iki X- Adresas 83. Jei vartotojas nori pasiekti rezultato rodymo LCD ekrane poziciją, jis turi atsižvelgti į ryšį tarp X adreso ir Y adreso.

Duomenys, kurie bus siunčiami rodyti, yra 8 bitų (1 baitas) ir bus išdėstyti kaip vertikali linija; šiuo atveju bitas MSB bus žemesnis, o bitas LSB - viršutinis, kaip parodyta paveikslėlyje.

Programuojamas skiriamosios gebos 1 laidų skaitmeninis termometras DALLAS «DS18B20»

Funkcijos:

  1. Unikaliai 1 laido sąsajai komunikuoti reikia tik vieno prievado kaiščio
  2. Sumažinkite komponentų skaičių naudodami integruotą temperatūros jutiklį ir EEPROM
  3. Matuoja temperatūrą nuo -55 ° C iki +125 ° C (nuo -67 ° F iki +257 ° F)
  4. ± 0,5 ° C Tikslumas nuo -10 ° C iki +85 ° C
  5. Programuojama skiriamoji geba nuo 9 bitų iki 12 bitų
  6. Nereikia jokių išorinių komponentų
  7. Parazitinis maitinimo režimas reikalauja tik 2 kontaktų (DQ ir GND)
  8. Supaprastina paskirstytas temperatūros jutiklines programas su daugialaidžiu režimu
  9. Kiekvienas įrenginys turi unikalų 64 bitų serijos kodą, saugomą vidiniame ROM
  10. Lankstūs vartotojo apibrėžti nepastovūs (NV) aliarmo nustatymai su pavojaus paieškos komanda Nustato įrenginius, kurių temperatūra yra už programuotų ribų

Programos:

  1. Termostatiniai valdikliai
  2. Pramoninės sistemos
  3. Vartojimo prekės
  4. Termometrai
  5. Termiškai jautrios sistemos

Nuo šviesos priklausomas rezistorius

Nuo šviesos priklausomas rezistorius (LDR) yra keitiklis, kuris keičia savo atsparumą pasikeitus šviesai ant jo paviršiaus.

Paprastai LDR turi nuo vieno megaohmo iki dviejų megaohmų esant visiškam tamsumui, nuo dešimties iki dvidešimt kilogramų omų esant dešimčiai liukso, nuo dviejų iki penkių kiloohmų esant 100 liuksų. Atsparumas tarp dviejų jutiklio kontaktų mažėja dėl šviesos intensyvumo arba padidėja laidumas tarp dviejų jutiklio kontaktų.

Naudokite įtampos skirstytuvo grandinę, kad pakeistumėte pasipriešinimo pokyčius į įtampos pokyčius.

2 veiksmas: mikrovaldiklio programinės įrangos kodas

#ifndef F_CPU #define F_CPU 16000000UL // nurodantis valdiklio kristalų dažnį (16 MHz AVR ATMega328P) #endif

// SPI INTERFACE APIBRĖŽIA #define MOSI3 SS tai B uostas, PIN 2

// IŠ naujo nustatyti ekraną #define RST 0 // IŠ naujo nustatyti B prievadą, PIN 0

// EKRANO REŽIMO PASIRINKIMAS - įvestis komandai/adresui arba duomenų įvedimui pasirinkti. #define DC 1 // DC tai B uostas, PIN 1

// kodų masyvas neigiamo signstatic const unsigned char neg [4] = {0x30, 0x30, 0x30, 0x30};

// kodai skaitmenų masyvas [0..9] static 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, 0x06, 0x06, 0x06, 0x06, 0x06, 0x8C, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 3 {0x3C, 0x3E, 0x7C, 0x60, 0x60, 0xFC, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x01, 0x03, 0x01}, // 4 {0x1C, 0x3E, 0x3E, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01x, // 5 0xFE, 0xFE, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 6 {0x04, 0x06, 0x06, 0x86, 0xE6, 0x86, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00}, // 7 {0xCC, 0xFE, 0xFE, 0x36, 0x36, 0xFE, 0xFE, 0xCC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 0x0 3, 0x01}, // 8 {0x3C, 0x7E, 0x7E, 0x66, 0x66, 0xFE, 0xFE, 0xFC, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01} // 9};

// koduoja žodžių masyvą „TEMP:“statinė const unsigned 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, 0x7E, 0x3 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 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, 0xF 0x9C, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01,};

// koduoja žodžių masyvą „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, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x01};

#įtraukti

#įtraukti #įtraukti

// Prievado inicijavimas negalioja Port_Init () {DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS) | (1 << RST) | (1 << DC); // Nustatyti MOSI, SCK, SS, RST, DC kaip išvestis, visi kiti įveda PORTB | = (1 << RST); // Nustatykite RST kaištį kaip aukštą PORTB | = (1 << SS); // Nustatykite SS kaištį kaip aukštą - ekranas yra Išjungti DDRC = 0xFFu; // Nustatykite visus PORTC kaiščius kaip išvestį. DDRC & = ~ (1 << 0); // Padaro pirmąjį PORTC kaištį kaip įvestį PORTC = 0x00u; // Nustatykite žemus visus PORTC kaiščius, kurie jį išjungia. }

// ADC inicializavimo negaliojimas ADC_init () {// Įgalinti ADC, atrankos dažnis = osc_freq/128 nustatyti išankstinį skalę iki didžiausios vertės, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); ADMUX = (1 << REFS0); // Pasirinkite įtampos atskaitą ADC // Pasirinkite kanalą nuliui pagal numatytuosius nustatymus naudodami ADC Multiplexer Select registrą (ADC0). }

// Funkcija skaityti analoginio į skaitmeninį konvertavimo rezultatą uint16_t get_LightLevel () {_delay_ms (10); // Palaukite, kol kanalas gaus pasirinktą ADCSRA | = (1 << ADSC); // Pradėkite ADC konvertavimą nustatydami ADSC bitą. rašykite 1 į ADSC, o (ADCSRA & (1 << ADSC)); // laukti, kol konversija bus baigta // ADSC vėl tampa 0 iki tol, nuolat vykdyti ciklą _delay_ms (10); grąžinimas (ADC); // Grąžinti 10 bitų rezultatą}

// SPI inicializavimas negalioja SPI_Init () {SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); // Įgalinti SPI, nustatyti kaip pagrindinį, nustatyti prescalerį kaip Fosc/16 SPI valdiklyje Registruotis }

// inicijuoti 16 bitų laikmatį1, pertraukti ir kintamasis void TIMER1_init () {// nustatyti laikmatį su prescaler = 256 ir CTC režimu TCCR1B | = (1 << WGM12) | (1 << CS12); // inicijuoti skaitiklį TCNT1 = 0; // inicijuoti palyginimo reikšmę - 1 sek OCR1A = 62500; // įgalinti palyginimo pertraukimą TIMSK1 | = (1 << OCIE1A); // įjungti globalius pertraukimus sei (); }

// Rodymas Įgalinti void SPI_SS_Enable () {PORTB & = ~ (1 << SS); // Įgalinti SS kaištį prie logikos 0}

// Ekrano išjungimas void SPI_SS_Disable () {PORTB | = (1 << SS); // Išjungti SS kaištį į logiką 1}

// Funkcija siųsti duomenis į ekrano buferį void SPI_Tranceiver (unsigned char data) {SPDR = data; // Įkelti duomenis į buferį while (! (SPSR & (1 << SPIF))); // Palaukite, kol bus baigtas perdavimas}

// Iš naujo nustatyti ekraną inicializacijos pradžioje void Display_Reset () {PORTB & = ~ (1 << RST); _delay_ms (100); PORTB | = (1 << RST); }

// Komandų rašymo funkcija void Display_Cmnd (nepasirašyti char duomenys) {PORTB & = ~ (1 << DC); // padaryti DC kaištį į logiką 0 komandinei operacijai SPI_Tranceiver (duomenys); // siųsti duomenis duomenų registre PORTB | = (1 << DC); // padidinkite DC kaištį į logiką, kad būtų galima valdyti duomenis}

// Vaizdo ekrano inicializavimas negalioja Display_init () {Display_Reset (); // iš naujo nustatyti ekraną Display_Cmnd (0x21); // komandų rinkinys papildymo režime Display_Cmnd (0xC0); // nustatyti įtampą siunčiant C0 reiškia VOP = 5V Display_Cmnd (0x07); // nustatyti temperatūrą koeficientas iki 3 Display_Cmnd (0x13); // įtampos šališkumo sistemos nustatyta vertė Display_Cmnd (0x20); // komandų rinkinys pagrindiniame režime Display_Cmnd (0x0C); // rodyti rezultatą įprastu režimu}

// Išvalyti ekrano tuštumą Display_Clear () {PORTB | = (1 << DC); // Padaryti DC kaištį į logiką aukštą, kad būtų galima valdyti duomenis (int k = 0; k <= 503; k ++) {SPI_Tranceiver (0x00);} PORTB & = ~ (1 << DC); // padaryti DC kaištį prie logikos nulis komandai atlikti}

// nustatykite stulpelį ir eilutę į rezultatų rodymo vietą LCD ekrane void Display_SetXY (unsigned char x, unsigned char y) {Display_Cmnd (0x80 | x); // stulpelis (0-83) Display_Cmnd (0x40 | y); // eilutė (0–5)}

// Funkcija rodyti neigiamą ženklą void Display_Neg (unsigned char neg) {Display_SetXY (41, 0); // Nustatykite rodomos pozicijos adresą (int index = 0; index0) {SPDR = 0x30;} // Įkelti duomenis į ekrano buferį (rodyti neigiamą ženklą) else {SPDR = 0x00;} // Įkelti duomenis į ekrano buferis (aiškus neigiamas ženklas), o (! (SPSR & (1 << SPIF))); // Palaukite, kol perdavimas bus baigtas _delay_ms (100); }}

// Funkcija, skirta išvalyti skaitmeninį ženklą void Off_Dig (unsigned char x, unsigned char y) {Display_SetXY (x, y); // Nustatykite rodomos vietos adresą (viršutinėje eilutėje) (int indeksas = 0; indeksas <8; indeksas ++) {SPI_Tranceiver (0);} // Įkelkite duomenis į ekrano buferį (aiški skaitmeninio ženklo viršutinė dalis) y ++; Display_SetXY (x, y); // Nustatykite rodomos vietos adresą (apatinėje eilutėje) (int indeksas = 0; indeksas <8; indeksas ++) {SPI_Tranceiver (0);} // Įkelkite duomenis į ekrano buferį (išvalyti skaitmeninio ženklo apatinę dalį)}

// Skaitmeninio ženklo negaliojimo rodymo funkcija Display_Dig (int dig, unsigned char x, unsigned char y) {Display_SetXY (x, y); // Nustatykite rodomos vietos adresą (viršutinėje eilutėje) (int index = 0; index <16; indeksas ++) {if (index == 8) {y ++; Display_SetXY (x, y);} // Nustatykite rodomos vietos adresą (apatinėje eilutėje) SPI_Tranceiver (šriftas6x8 [kasti] [indeksas]); // Įkelkite kodų masyvo duomenų masyvą į ekrano buferį _delay_ms (10); }}

// DS18B20 nepasirašyto simbolio inicijavimas DS18B20_init () {DDRD | = (1 << 2); // Nustatykite PORTD PD2 kaištį kaip išvestį PORTD & = ~ (1 << 2); // Nustatyti PD2 kaištį kaip žemą _delay_us (490); // Inicijavimo laikas DDRD & = ~ (1 << 2); // Nustatykite PORTD PD2 kaištį kaip įvestį _delay_us (68); // Laikas OK_Flag = (PIND & (1 << 2)); // gauti jutiklio impulsą _delay_us (422); grįžti OK_Flag; // grįžti 0-ok jutiklis yra kištukas, 1 klaidos jutiklis yra atjungtas}

// Funkcija skaityti baitą iš DS18B20 unsigned char read_18b20 () {unsigned char i, data = 0; (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Nustatykite PORTD PD2 kaištį kaip išvestį _delay_us (2); // Laiko DDRD & = ~ (1 1; // Kitas bitas, jei (PIND & (1 << 2)) duomenys | = 0x80; // įdėti bitą į baitą _delay_us (62);} grąžinti duomenis;}

// Funkcija rašyti baitą į DS18B20 void write_18b20 (nepasirašyti char duomenys) {unsigned char i; (i = 0; i <8; i ++) {DDRD | = (1 << 2); // Nustatykite PORTD PD2 kaištį kaip išvestį _delay_us (2); // Laikas, jei (duomenys & 0x01) DDRD & = ~ (1 << 2); // jei norime parašyti 1, atleiskite eilutę else DDRD | = (1 1; // Kitas bitas _delay_us (62); // Timing DDRD & = ~ (1 << 2); // Nustatykite PD2 kaištį PORTD kaip įvestis _delay_us (2);}}

// Funkcija rodyti šviesos lygį void Read_Lux () {uint16_t buferis; nepasirašytas int temp_int_1, temp_int_2, temp_int_3, temp_int_0; // vieno skaitmens, dviejų skaitmenų, trigubų skaitmenų, ketvirčio skaitmenų buferis = get_LightLevel (); // skaityti rezultatą iš analoginio į skaitmeninį konvertuoti šviesos lygį temp_int_0 = buferis % 10000/1000; // ketvirčio skaitmuo temp_int_1 = buferis % 1000 /100; // triženklis temp_int_2 = buferis % 100/10; // dviženklis temp_int_3 = buferis % 10; // vieno skaitmens if (temp_int_0> 0) // jei rezultatas yra ketvirčio skaitmuo {Display_Dig (temp_int_0, 32, 2); // rodyti 1 skaitmenį šviesos lygio Display_Dig (temp_int_1, 41, 2); // rodyti 2 skaitmenis šviesos lygio Display_Dig (temp_int_2, 50, 2); // rodyti 3 skaitmenis šviesos lygio Display_Dig (temp_int_3, 59, 2); // rodyti 4 skaitmenų šviesos lygį} else {if (temp_int_1> 0) // jei rezultatas yra triženklis skaičius {Off_Dig (32, 2); // išvalyti 1 skaičiaus ženklą Display_Dig (temp_int_1, 41, 2); // rodyti 1 skaitmenį šviesos lygio Display_Dig (temp_int_2, 50, 2); // rodyti 2 skaitmenis šviesos lygio Display_Dig (temp_int_3, 59, 2); // rodyti 3 šviesos lygio skaitmenis} else {if (temp_int_2> 0) // jei rezultatas yra dviženklis skaičius {Off_Dig (32, 2); // išvalyti 1 skaičiaus ženklą Off_Dig (41, 2); // išvalyti 2 skaičiaus ženklą Display_Dig (temp_int_2, 50, 2); // rodyti 1 skaitmenį šviesos lygio Display_Dig (temp_int_3, 59, 2); // rodyti 2 šviesos lygio skaitmenis} else // jei rezultatas yra vienaženklis skaičius {Off_Dig (32, 2); // išvalyti 1 skaičiaus ženklą Off_Dig (41, 2); // išvalyti 2 skaičiaus ženklą Off_Dig (50, 2); // išvalyti 3 skaičiaus ženklą Display_Dig (temp_int_3, 59, 2); // rodyti 1 šviesos lygio skaitmenį}}}}

// Funkcija rodyti temperatūrą void Read_Temp () {unsigned int buferis; unsigned int temp_int_1, temp_int_2, temp_int_3; // vieno skaitmens, dviejų skaitmenų, trijų skaitmenų, ketvirčio skaitmenų nepasirašytas simbolis Temp_H, Temp_L, OK_Flag, temp_flag; DS18B20_init (); // DS18B20 inicializavimas write_18b20 (0xCC); // Jutiklio kodo tikrinimas write_18b20 (0x44); // Pradėti temperatūros konversiją _delay_ms (1000); // Jutiklio apklausos uždelsimas DS18B20_init (); // DS18B20 inicializavimas write_18b20 (0xCC); // Jutiklio kodo tikrinimas write_18b20 (0xBE); // Komanda skaityti jutiklio RAM turinį Temp_L = read_18b20 (); // Skaityti pirmuosius du baitus Temp_H = read_18b20 (); temp_ vėliava = 1; // 1 teigiama temperatūra, 0 neigiama temperatūra // Gauti neigiamą temperatūrą, jei (Temp_H & (1 << 3)) // Sign Bit Check Check (jei bitas nustatytas-neigiama temperatūra) {sign int temp; temp_ vėliava = 0; // vėliava nustatyta 0 - neigiama temperatūra temp = (Temp_H << 8) | Temp_L; temperatūra = -temperatūra; // Konvertuoti papildomą kodą tiesioginiu Temp_L = temp; Temp_H = temp >> 8; } buferis = ((Temp_H 4); temp_int_1 = buferis % 1000/100; // triženklis temp_int_2 = buferis % 100/10; // dviženklis temp_int_3 = buferis % 10; // vieno skaitmens

// Jei temperatūra yra neigiamas rodomas temperatūros ženklas, kitaip išvalykite

if (temp_flag == 0) {Display_Neg (1);} else {Display_Neg (0);} if (temp_int_1> 0) // jei rezultatas yra triženklis skaičius {Display_Dig (temp_int_1, 45, 0); // rodyti 1 temperatūros skaitmenį Display_Dig (temp_int_2, 54, 0); // rodyti 2 skaitmenų temperatūrą Display_Dig (temp_int_3, 63, 0); // rodyti 3 skaitmenų temperatūrą} else {if (temp_int_2> 0) // jei rezultatas yra dviženklis skaičius {Off_Dig (45, 0); // išvalyti 1 skaičiaus ženklą Display_Dig (temp_int_2, 54, 0); // rodyti 1 temperatūros skaitmenį Display_Dig (temp_int_3, 63, 0); // rodyti 2 skaitmenų temperatūrą} else // jei rezultatas yra vienaženklis skaičius {Off_Dig (45, 0); // išvalyti 1 skaičiaus ženklą Off_Dig (54, 0); // išvalyti 2 skaičiaus ženklą Display_Dig (temp_int_3, 63, 0); // rodyti 1 temperatūros skaitmenį}}}

// Šis ISR suaktyvinamas kiekvieną kartą, kai sutampa laikmačių skaičius ir palyginimo vertė (kas 1 sekundė) ISR (TIMER1_COMPA_vect) {// Skaitymas, temperatūros ir šviesos lygio rodymas Read_Temp (); Skaityti_Lux (); }

// Funkcija rodyti žodžius „TEMP“ir „LUX“void Display_label () {// Žodis „TEMP“Display_SetXY (0, 0); // Nustatykite rodomos pozicijos adresą (aukštyn) eilutėje (int indeksas = 0; indeksas <105; indeksas ++) {if (indeksas == 40) {Display_SetXY (0, 1);} // Nustatykite pozicijos adresą ekrane (apatinėje eilutėje), jei (indeksas == 80) {Display_SetXY (72, 0);} // Nustatykite rodomos pozicijos adresą (viršutinė eilutė), jei (indeksas == 92) {Display_SetXY (72, 1); } // Nustatykite rodomos vietos adresą (apatinėje eilutėje) SPDR = TEMP_1 [indeksas]; // Įkelkite kodų masyvo duomenis į ekrano buferį, kai (! (SPSR & (1 << SPIF))); // Palaukite, kol perdavimas bus baigtas _delay_ms (10); } // Žodis "LUX" Display_SetXY (0, 2); // Nustatykite rodomos pozicijos adresą (aukštyn) eilutėje (int indeksas = 0; indeksas <60; indeksas ++) {if (indeksas == 30) {Display_SetXY (0, 3);} // Nustatykite pozicijos adresą ekrane (apatinėje eilutėje) SPDR = TEMP_2 [indeksas]; // Įkelkite kodų masyvo duomenis į ekrano buferį, kai (! (SPSR & (1 << SPIF))); // Palaukite, kol perdavimas bus baigtas _delay_ms (10); }}

int main (niekinis)

{Port_Init (); // Uosto inicijavimas ADC_init (); // ADC inicijavimas SPI_Init (); // SPI inicijavimas SPI_SS_Enable (); // Ekrano įjungimas DS18B20_init (); // DS18B20 „Display_init“() inicializavimas; // Ekrano inicijavimas Display_Clear (); // Rodyti aiškų Display_label (); // Rodyti žodžius "TEMP" ir "LUX" TIMER1_init (); // Laikmatis1 inicijavimas. Pradėkite stebėti. Gaunami parametrai kas sekundę. // Begalybės kilpa, kol (1) {}}

3 veiksmas: mikroprocesoriaus programinės įrangos mirksėjimas

HEX failo įkėlimas į mikrovaldiklio „flash“atmintį. Žiūrėkite vaizdo įrašą su išsamiu mikrovaldiklio „flash“atminties įrašymo aprašymu: „Mikrovaldiklio„ flash “atminties įrašymas…

4 žingsnis: Stebėjimo įrenginio grandinės surinkimas

Stebėjimo įrenginio grandinės mazgas
Stebėjimo įrenginio grandinės mazgas
Stebėjimo įrenginio grandinės mazgas
Stebėjimo įrenginio grandinės mazgas

Prijunkite komponentus pagal schemą.

Įjunkite maitinimą ir jis veikia!

Rekomenduojamas: