Բովանդակություն:

Temերմաստիճանի և լուսավորության մակարդակի մոնիտոր `LCD NOKIA 5110: 4 քայլ ցուցադրմամբ
Temերմաստիճանի և լուսավորության մակարդակի մոնիտոր `LCD NOKIA 5110: 4 քայլ ցուցադրմամբ

Video: Temերմաստիճանի և լուսավորության մակարդակի մոնիտոր `LCD NOKIA 5110: 4 քայլ ցուցադրմամբ

Video: Temերմաստիճանի և լուսավորության մակարդակի մոնիտոր `LCD NOKIA 5110: 4 քայլ ցուցադրմամբ
Video: カカオ豆がチョコレートになるまで 高級チョコレート工場に潜入 ダンデライオン・チョコレート ファクトリー&カフェ蔵前 チョコレート職人 ASMR チャーリーとチョコレート工場のようなファクトリー 2024, Հուլիսի
Anonim
Image
Image

Ողջույն բոլորին!

Այս բաժնում մենք պատրաստում ենք պարզ էլեկտրոնային սարք `ջերմաստիճանը և լուսավորության մակարդակը վերահսկելու համար: Այս պարամետրերի չափումները ցուցադրվում են LCD NOKIA 5110 -ով: Սարքը հիմնված է AVR ATMEGA328P միկրոկառավարիչի վրա: Մոնիտորինգի սարքը հագեցած է DS18B20 թվային ջերմաչափով և ֆոտոռեզիստորով `լուսավորման մակարդակը չափելու համար:

Քայլ 1: Նկարագրություն Բաղադրիչներ

Նկարագրություն Բաղադրիչներ
Նկարագրություն Բաղադրիչներ
Նկարագրություն Բաղադրիչներ
Նկարագրություն Բաղադրիչներ

Մոնիտորինգի սարքի հիմնական բաղադրիչները.

  • Միկրոկոնտրոլեր AVR «ATMEGA328P»
  • Մոնոխրոմ գրաֆիկական LCD «NOKIA 5110»
  • Mրագրավորվող բանաձևով 1-լարային թվային ջերմաչափ «DS18B20»
  • Լույսից կախված դիմադրություն
  • Լարերը

Միկրոկոնտրոլեր AVR «ATMEGA328P»

Մոնիտորինգի սարքն օգտագործում է միկրոկառավարիչի հետևյալ ծայրամասային առանձնահատկությունները.

  1. 16-բիթ ժամաչափ/հաշվիչի ընդհատում
  2. 8-ալիքային 10-բիթանոց ADC
  3. Վարպետ/ստրուկ SPI սերիական ինտերֆեյս

Մոնոխրոմ գրաֆիկական LCD «NOKIA 5110»

Տեխնիկական պայմաններ.

  1. 48 x 84 կետանոց LCD էկրան
  2. Սերիական ավտոբուսի միջերես ՝ առավելագույն արագությամբ 4 Մբիթ/վ արագությամբ
  3. Ներքին վերահսկիչ/վարորդ «PCD8544»
  4. LED հետևի լույս
  5. Աշխատեք 2.7-5 վոլտ լարման վրա
  6. Powerածր էներգիայի սպառումը; այն հարմար է մարտկոցների կիրառման համար
  7. Temերմաստիճանը `-25˚C- ից +70˚C
  8. Աջակցման ազդանշանի CMOS մուտքագրում

LCD հասցեի կառավարում (հասցեավորում).

Հիշողության հասցեի դասավորությունը, որը ցուցադրվում է LCD էկրանով (DDRAM), մատրիցա է, որը բաղկացած է 6 տողից (Y հասցե) Y- հասցեից մինչև Y- հասցե 5 և 84 սյունակ (X հասցե) X- հասցեից 0-ից X- Հասցե 83. Եթե օգտվողը ցանկանում է մուտք գործել LCD էկրանին արդյունքի ցուցադրման դիրք, ապա պետք է անդրադառնա X- հասցեի և Y- հասցեի հարաբերություններին:

Տվյալները, որոնք կուղարկվեն ցուցադրման, 8 բիթանոց են (1 բայթ) և դասավորված կլինեն որպես ուղղահայաց գիծ. այս դեպքում Bit MSB- ն ավելի ցածր կլինի, իսկ Bit LSB- ը ՝ վերին, ինչպես ցույց է տրված նկարում:

Mրագրավորվող բանաձևով 1-լարային թվային ջերմաչափ DALLAS «DS18B20»

Հատկություններ:

  1. Եզակի 1-Wire® ինտերֆեյսը կապի համար պահանջում է միայն մեկ նավահանգիստ
  2. Կրճատեք բաղադրիչների քանակը ինտեգրված ջերմաստիճանի տվիչով և EEPROM- ով
  3. Չափում է ջերմաստիճանը -55 ° C- ից +125 ° C (-67 ° F- ից +257 ° F)
  4. ± 0.5 ° C uracyշգրտություն -10 ° C- ից +85 ° C
  5. Mրագրավորվող լուծում ՝ 9 բիթից մինչև 12 բիթ
  6. Արտաքին բաղադրիչներ չեն պահանջվում
  7. Պարազիտային էներգիայի ռեժիմը շահագործման համար պահանջում է ընդամենը 2 կապում (DQ և GND)
  8. Պարզեցնում է բաշխված ջերմաստիճանի զգացողության ծրագրերը ՝ բազմակի անկման հնարավորությամբ
  9. Յուրաքանչյուր սարք ունի 64-բիթանոց սերիական եզակի ծածկագիր, որը պահվում է ներկառուցված ROM- ում
  10. Userկուն օգտագործողի կողմից սահմանվող ոչ անկայուն (NV) rmարթուցիչի կարգավորումներ rmարթուցիչի որոնման հրամանով ifiesրագրավորված սահմաններից դուրս ջերմաստիճան ունեցող սարքերի նույնականացում

Դիմումներ:

  1. Թերմոստատիկ հսկողություն
  2. Արդյունաբերական համակարգեր
  3. Սպառողական ապրանքներ
  4. Երմաչափեր
  5. Allyերմային զգայուն համակարգեր

Լույսից կախված դիմադրություն

Լույսի վրա կախված դիմադրողը (LDR) փոխարկիչ է, որը փոխում է իր դիմադրությունը, երբ լույսը ընկնում է նրա մակերևույթի վրա:

Սովորաբար LDR- ն կունենա մեկ մեգաօմից մինչև երկու մեգաօհմ ընդհանուր մթության մեջ, տասից մինչև քսան կիլոօմս `տասը LUX- ում, երկուից հինգ կիլոգրամ` 100 LUX- ով: Սենսորի երկու շփումների միջև դիմադրությունը նվազում է լույսի ինտենսիվությամբ կամ սենսորի երկու շփումների միջև հաղորդունակությունը մեծանում է:

Օգտագործեք լարման բաժանարար միացում `լարման փոփոխության դիմադրության փոփոխությունը փոխակերպելու համար:

Քայլ 2: Microcontroller որոնվածի ծածկագիր

#ifndef F_CPU #սահմանել F_CPU 16000000UL // պատմող վերահսկիչ բյուրեղային հաճախականություն (16 ՄՀց AVR ATMega328P) #endif

// SPI INTERFACE DEFINES #define MOSI 3 // MOSI it PORT B, PIN 3 #define MISO 4 // MISO it PORT B, PIN 4 #define SCK 5 // SCK it PORT B, PIN 5 #define SS 2 // SS դա PORT B, PIN 2

// ESԱՆԿԱՐԵԼ Dուցադրումը #սահմանեք RST 0 // Վերակայեք այն PORT B, PIN 0

// DISPLAY MODE SELECT - Մուտք ՝ հրաման/հասցե կամ տվյալների մուտքագրում ընտրելու համար: #սահմանեք DC 1 // DC դա PORT B, PIN 1

// բացասական սինստատիկ const անստորագիր char neg կոդերի զանգված [4] = {0x30, 0x30, 0x30, 0x30};

// թվանշանների զանգված [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 1 0x0C, 0x8E, 0xCE, 0xE6, 0xE6, 0xBE, 0x9E, 0x0C, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 2 {0x00, 0x04, 0x06, 0x26, 0x76, 0xFE, 0xDE, 0x8C, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 3 {0x3C, 0x3E, 0x7C, 0x60, 0x60, 0xFC, 0xFE, 0xFC, 0x00, 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 {0xFC, 0xFE, 0xFE, 0x36, 0x36, 0xF6, 0xF6, 0xE4, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01}, // 6 {0x04, 0x06, 0x06, 0x86, 0xE6, 0xFE, 0x7E, 0x1C, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00}, // 7 {0xCC, 0xFE, 0xFE, 0x36, 0x36, 0xFE, 0xFE, 0xCC, 0x01, 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};

// «TEMP:» բառի զանգվածային ծածկագիր TEMP_1 [165] = {0x02, 0x06, 0x06, 0xFE, 0xFE, 0xFE, 0x06, 0x06, 0x02, 0x00, 0xFC, 0xFE, 0xFE, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26 0x24, 0x00, 0xFC, 0xFE, 0xFE, 0x1C, 0x38, 0x70, 0x38, 0x1C, 0xFE, 0xFE, 0xFC, 0x00, 0xFC, 0xFE, 0xFE, 0x66, 0x66, 0x7E, 0x7E, 0x3C, 0x00, 0x8C, 0x8C, 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, 0x00, 0xF8, 0xFC, 0x0C, 0x9C, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01,};

// բառերի զանգված «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, 0x01, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x01, 0x01};

#ներառում

#ներառել #ներառել

// Նավահանգստի սկզբնականացում </ b> Պորտ_Ինիտ () {DDRB = (1 << MOSI] | (1 << SCK) | (1 << SS] | (1 << RST) | (1 << DC); // Set MOSI, SCK, SS, RST, DC որպես ելք, մյուս բոլոր մուտքերը PORTB | = (1 << RST); // Սահմանել RST կապը որպես բարձր PORTB | = (1 << SS); // SS pin- ը բարձր դնել - Displayուցադրումն է Անջատել DDRC = 0xFFu; // Սահմանեք PORTC- ի բոլոր կապումներն որպես ելք: DDRC & = ~ (1 << 0); // կազմում է PORTC- ի առաջին կապը որպես մուտքագրում PORTC = 0x00u; // Setածր դարձրեք PORTC- ի բոլոր կապումները, որն անջատում է այն: }

// ADC Initialization void ADC_init () {// Միացնել ADC- ն, ընտրանքի հաճախականությունը = osc_freq/128 սահմանել prescaler- ը առավելագույն արժեքի, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2] | (1 << ADPS1] | (1 << ADPS0]; ADMUX = (1 << REFS0); // Ընտրեք ADC- ի լարման հղումը // Լռելյայն ընտրեք ալիքը զրոյի միջոցով ՝ օգտագործելով ADC Multiplexer Select գրանցամատյանը (ADC0): }

// Անալոգային թվային փոխակերպման արդյունքը կարդալու գործառույթ uint16_t get_LightLevel () {_delay_ms (10); // Սպասեք որոշ ժամանակ, մինչև ալիքը ստանա ընտրված ADCSRA | = (1 << ADSC); // Սկսեք ADC- ի փոխարկումը `ADSC բիթ սահմանելով: գրել 1 ADSC- ին, մինչդեռ (ADCSRA & (1 << ADSC)); // սպասեք փոխակերպման ավարտին // ADSC- ն մինչև այդ նորից 0 է դառնում, անընդհատ գործարկեք հանգույցը _delay_ms (10); վերադարձ (ADC); // Վերադարձնել 10-բիթանոց արդյունքը}

// SPI Initialization void SPI_Init () {SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0); // Միացնել SPI- ն, սահմանել որպես վարպետ, Prescaler- ը սահմանել որպես Fosc/16 SPI կառավարման մեջ գրանցվել}

// սկզբնականացնել 16 բիթ ժմչփ 1, ընդհատում և փոփոխական անվավեր TIMER1_init () {// ժամանակաչափ սահմանել նախաչափիչով = 256 և CTC ռեժիմով TCCR1B | = (1 << WGM12) | (1 << CS12); // սկզբնական հաշվիչ TCNT1 = 0; // սկզբնական համեմատել արժեքը - 1 վրկ OCR1A = 62500; // միացնել համեմատել ընդհատումը TIMSK1 | = (1 << OCIE1A); // միացնել գլոբալ ընդհատումները sei (); }

// Displayուցադրել Միացնել դատարկ SPI_SS_Enable () {PORTB & = ~ (1 << SS); // Միացնել SS- ի կապը տրամաբանությանը 0}

// Displayուցադրել Disable void SPI_SS_Disable () {PORTB | = (1 << SS); // Անջատեք SS քորոցը տրամաբանությանը 1}

// Տվյալների բուֆերի մեջ տվյալների ուղարկման գործառույթ void SPI_Tranceiver (չստորագրված ածխաթթվային տվյալներ) {SPDR = տվյալներ; // Տեղադրեք տվյալները բուֆերում մինչ (! (SPSR & (1 << SPIF)))); // Սպասեք, մինչև փոխանցումն ավարտվի}

// Վերակայել ցուցադրումը սկզբնավորման սկզբում void Display_Reset () {PORTB & = ~ (1 << RST); _ ուշացում (100); PORTB | = (1 << RST); }

// Հրամանի գրելու գործառույթը դատարկ է Display_Cmnd (անստորագիր նշանի տվյալներ) {PORTB & = ~ (1 << DC); // դարձնել DC քորոց տրամաբանության 0 SPI_Tranceiver հրամանի գործողության համար (տվյալներ); // տվյալների գրանցման տվյալների ուղարկում PORTB | = (1 << DC); // տվյալների փոխանցման համար տրամաբանական բարձր դարձնել DC քորոցը}

// vուցադրման անվավեր ցուցադրման սկզբնավորում Display_init () {Display_Reset (); // վերականգնել ցուցադրման Display_Cmnd (0x21); // լրացման ռեժիմում տեղադրված հրաման Display_Cmnd (0xC0); // լարումը սահմանել ուղարկելով C0 նշանակում VOP = 5V Display_Cmnd (0x07); // սահմանել ջերմաստիճանը: գործակից 3 Display_Cmnd (0x13); // Լարման համակարգի կողմնորոշման արժեքը Display_Cmnd (0x20); // հրամանի հավաքածու հիմնական ռեժիմում Display_Cmnd (0x0C); // ցուցադրել արդյունքը նորմալ ռեժիմում}

// Մաքրել ցուցադրման դատարկությունը Display_Clear () {PORTB | = (1 << DC); // դարձնել DC քորոց տրամաբանության մեջ տվյալների գործարկման համար (int k = 0; k <= 503; k ++) {SPI_Tranceiver (0x00);} PORTB & = ~ (1 << DC]; // դարձնել DC քորոց տրամաբանությանը զրո հրամանի գործողության համար}

// սյունակը և տողը դնել LCD ցուցադրման արդյունքի ցուցադրման դիրքի վրա void Display_SetXY (unsigned char x, unsigned char y) {Display_Cmnd (0x80 | x); // սյունակ (0-83) Display_Cmnd (0x40 | y); // տող (0-5)}

// Բացասական նշանի անվավեր ցուցադրման գործառույթ Display_Neg (unsigned char neg) {Display_SetXY (41, 0); // Տեղադրեք ցուցադրման դիրքի հասցեն (int index = 0; index0) {SPDR = 0x30;} // Տեղադրեք տվյալները ցուցադրման բուֆերում (բացասական նշան ցուցադրեք) այլապես {SPDR = 0x00;} // Տեղադրեք տվյալները ցուցադրման բուֆեր (հստակ բացասական նշան) իսկ (! (SPSR & (1 << SPIF)))); // Սպասեք, մինչև փոխանցումն ավարտվի _delay_ms (100); }}

// Թվային նշանը դատարկող Off_Dig (անստորագիր char x, unsigned char y) մաքրման գործառույթ {Display_SetXY (x, y); // Տեղադրեք ցուցադրման դիրքի հասցեն (վերին տող) (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Տեղադրեք տվյալները ցուցադրման բուֆերում (թվային նշանի վերևի հատվածը ջնջեք) y ++; Display_SetXY (x, y); // Սահմանել ցուցադրման դիրքի հասցեն (ներքևի տող) ՝ (int index = 0; index <8; index ++) {SPI_Tranceiver (0);} // Տեղադրեք տվյալները ցուցադրման բուֆերում (թվային նշանի հստակ ներքևի հատված)}

// Թվային նշանի անվավեր ցուցադրման գործառույթ Display_Dig (int dig, unsigned char x, unsigned char y) {Display_SetXY (x, y); // Սահմանել ցուցադրման դիրքի հասցեն (վերին տող) հետևյալի համար (int index = 0; index <16; ցուցանիշ ++) {if (index == 8) {y ++; Display_SetXY (x, y);} // Սահմանել ցուցադրման դիրքի հասցեն (ներքևի տող) SPI_Tranceiver (font6x8 [dig] [index]); // Թվերի տվյալների զանգվածը բեռնեք ցուցադրման _delay_ms բուֆերում (10); }}

// DS18B20 անստորագիր char DS18B20_init () {DDRD | = (1 << 2); // PORTD- ի PD2 կապը սահմանել որպես ելքային PORTD & = ~ (1 << 2); // Սահմանել PD2 կապը ցածր _delay_us (490); // Նախնականացման ժամանակացույց DDRD & = ~ (1 << 2); // PORTD- ի PD2 կապը սահմանել որպես մուտքի _delay_us (68); // ingամանակը OK_Flag = (PIND & (1 << 2)); // ստանալ սենսորային զարկերակ _delay_us (422); վերադարձնել OK_Flag; // վերադարձ 0-ok սենսորը միակցիչ է, 1 սխալի տվիչը անջատված է}

// DS18B20 անստորագիր char- ից բայթ կարդալու գործառույթ read_18b20 () {unsigned char i, data = 0; համար (i = 0; i <8; i ++) {DDRD | = (1 << 2); // PORTD- ի PD2 կապը սահմանել որպես ելք _delay_us (2); // ingամկետային DDRD & = ~ (1 1; // Հաջորդ բիթ, եթե (PIND & (1 << 2)) տվյալներ | = 0x80; // բիթը դնել բայթ _delay_us (62);} տվյալների վերադարձի վրա;}

// DS18B20- ում բայթ գրելու գործառույթ void write_18b20 (անստորագիր char տվյալներ) {unsigned char i; համար (i = 0; i <8; i ++) {DDRD | = (1 << 2); // PORTD- ի PD2 կապը սահմանել որպես ելք _delay_us (2); // ingամանակը եթե (տվյալներ & 0x01) DDRD & = ~ (1 << 2); // եթե ուզում ենք գրել 1, բաց թողեք այլ տող DDRD | = (1 1; // Հաջորդ բիթ _delay_us (62); // ingամանակահատված DDRD & = ~ (1 << 2); // Սահմանեք PD2 քորոցը PORTD որպես մուտքագրում _delay_us (2);}}

// Լույսի մակարդակի ցուցադրման գործառույթ void Read_Lux () {uint16_t բուֆեր; անստորագիր int temp_int_1, temp_int_2, temp_int_3, temp_int_0; // մեկանիշ, երկնիշ, եռանիշ, քառորդ թվանշան բուֆեր = get_LightLevel (); // կարդալ անալոգային թվային արդյունքի փոխակերպման լույսի մակարդակը temp_int_0 = բուֆեր % 10000 /1000; // քառանիշ նիշ temp_int_1 = բուֆեր % 1000 /100; // եռանիշանիշ temp_int_2 = բուֆեր % 100 /10; // երկնիշ temp_int_3 = բուֆեր % 10; // միանիշ եթե (temp_int_0> 0) // եթե արդյունքը քառանիշ թիվ է {Display_Dig (temp_int_0, 32, 2); // ցուցադրել լույսի մակարդակի 1 նիշ Display_Dig (temp_int_1, 41, 2); // ցուցադրել լույսի մակարդակի 2 նիշ Display_Dig (temp_int_2, 50, 2); // ցուցադրել լուսային մակարդակի 3 նիշ Display_Dig (temp_int_3, 59, 2); // ցուցադրել լուսավորության մակարդակի 4 նիշ} else {if (temp_int_1> 0) // եթե արդյունքը եռանիշ թիվ է {Off_Dig (32, 2); // ջնջել համարի 1 նշանը Display_Dig (temp_int_1, 41, 2); // ցուցադրել լույսի մակարդակի 1 նիշ Display_Dig (temp_int_2, 50, 2); // ցուցադրել լույսի մակարդակի 2 նիշ Display_Dig (temp_int_3, 59, 2); // ցուցադրել լուսային մակարդակի 3 նիշ} else {if (temp_int_2> 0) // եթե արդյունքը երկնիշ թիվ է {Off_Dig (32, 2); // մաքրել Off_Dig համարի 1 նշանը (41, 2); // հստակ թվերի 2 նշան Display_Dig (temp_int_2, 50, 2); // ցուցադրել լույսի մակարդակի 1 նիշ Display_Dig (temp_int_3, 59, 2); // ցուցադրել լույսի մակարդակի 2 նիշ} else // եթե արդյունքը միանիշ թիվ է {Off_Dig (32, 2); // մաքրել Off_Dig համարի 1 նշանը (41, 2); // մաքրել Off_Dig համարի 2 նշանը (50, 2); // ջնջել համարի 3 նշանը Display_Dig (temp_int_3, 59, 2); // ցուցադրել լուսավորության մակարդակի 1 նիշ}}}}

// temperatureերմաստիճանի դատարկության ցուցադրման գործառույթ Read_Temp () {unsigned int buffer; անստորագիր int temp_int_1, temp_int_2, temp_int_3; // մեկանիշ, երկնիշ, եռանիշ, քառորդ նիշ unsigned char Temp_H, Temp_L, OK_Flag, temp_flag; DS18B20_init (); // DS18B20 write_18b20 (0xCC) սկզբնականացում; // Սենսորային կոդի ստուգում write_18b20 (0x44); // Սկսել ջերմաստիճանի փոխակերպում _delay_ms (1000); // Սենսորների քվեարկության հետաձգում DS18B20_init (); // DS18B20 write_18b20 (0xCC) սկզբնականացում; // Սենսորային կոդի ստուգում write_18b20 (0xBE); // Հանձնարարություն կարդալ Sensor RAM- ի բովանդակությունը Temp_L = read_18b20 (); // Կարդալ առաջին երկու բայթ Temp_H = read_18b20 (); temp_flag = 1; // 1-դրական ջերմաստիճան, 0-բացասական ջերմաստիճան // Ստացեք բացասական ջերմաստիճան, եթե (Temp_H & (1 << 3)) // Sign Bit Check (if bit is set-negative temperature) {sign int temp; temp_flag = 0; // դրոշը սահմանված է 0 - բացասական ջերմաստիճանի ջերմաստիճան = (Temp_H << 8) | Temp_L; temp = -temp; // Փոխարկել լրացուցիչ կոդը ուղղակի Temp_L = temp; Temp_H = temp >> 8; } բուֆեր = ((Temp_H 4); temp_int_1 = բուֆեր % 1000 /100; // եռանիշ թվային temp_int_2 = բուֆեր % 100 /10; // երկնիշ temp_int_3 = բուֆեր % 10; // միանիշ

// Եթե ջերմաստիճանը բացասական ցուցադրում է ջերմաստիճանը, այլապես պարզ է

եթե (temp_flag == 0) {Display_Neg (1);} այլ {Display_Neg (0);} if (temp_int_1> 0) // եթե արդյունքը եռանիշ թիվ է {Display_Dig (temp_int_1, 45, 0); // ցուցադրել ջերմաստիճանի 1 նիշ Display_Dig (temp_int_2, 54, 0); // ցուցադրել ջերմաստիճանի 2 նիշ Display_Dig (temp_int_3, 63, 0); // ցուցադրել ջերմաստիճանի 3 նիշ} else {if (temp_int_2> 0) // եթե արդյունքը երկնիշ թիվ է {Off_Dig (45, 0); // ջնջել համարի 1 նշանը Display_Dig (temp_int_2, 54, 0); // ցուցադրել ջերմաստիճանի 1 նիշ Display_Dig (temp_int_3, 63, 0); // ցուցադրել ջերմաստիճանի երկնիշ} else // եթե արդյունքը միանիշ թիվ է {Off_Dig (45, 0); // մաքրել Off_Dig համարի 1 նշանը (54, 0); // հստակ թվերի 2 նշան Display_Dig (temp_int_3, 63, 0); // ցուցադրել ջերմաստիճանի 1 նիշ}}}

// Այս ISR- ն արձակվում է ամեն անգամ, երբ համընկնում է ժամաչափի հաշվարկի հետ համեմատության արժեքով (յուրաքանչյուր 1 վայրկյանում) ISR (TIMER1_COMPA_vect) {// Ընթերցում, ջերմաստիճանի և լուսավորության մակարդակի ցուցադրում Read_Temp (); Read_Lux (); }

// «TEMP» և «LUX» բառերի ցուցադրման գործառույթ void Display_label () {// Word «TEMP» Display_SetXY (0, 0); // Տեղադրեք ցուցադրման դիրքի հասցեն (վերևի տող) ՝ (int index = 0; index <105; index ++) {if (index == 40) {Display_SetXY (0, 1);} // Սահմանեք դիրքի հասցեն ցուցադրման վրա (ներքևի տող) եթե (ինդեքս == 80) {Display_SetXY (72, 0);} // Սահմանեք ցուցադրման դիրքի հասցեն (վերևի տող), եթե (ինդեքս == 92) {Display_SetXY (72, 1); } // Սահմանել ցուցադրման դիրքի հասցեն (ներքևի տող) SPDR = TEMP_1 [ինդեքս]; // Տեղադրեք ծածկագրերի զանգվածի տվյալները ցուցադրման բուֆերում մինչ (! (SPSR & (1 << SPIF)))); // Սպասեք, մինչև փոխանցումն ավարտվի _delay_ms (10); } // Բառ "LUX" Display_SetXY (0, 2); // Տեղադրեք ցուցադրման դիրքի հասցեն (վերևի տող) (int index = 0; index <60; index ++) {if (index == 30) {Display_SetXY (0, 3);} // Սահմանեք դիրքի հասցեն ցուցադրման վրա (ներքևի տող) SPDR = TEMP_2 [ինդեքս]; // Տեղադրեք ծածկագրերի զանգվածի տվյալները ցուցադրման բուֆերում մինչ (! (SPSR & (1 << SPIF)))); // Սպասեք, մինչև փոխանցումն ավարտվի _delay_ms (10); }}

int հիմնական (անվավեր)

{Port_Init (); // Նավահանգստի սկզբնականացում ADC_init (); // ADC Initialization SPI_Init (); // SPI սկզբնականացում SPI_SS_Enable (); // Displayուցադրել Միացնել DS18B20_init (); // DS18B20 Display_init- ի սկզբնականացում (); // Displayուցադրել սկզբնականացում Display_Clear (); // clearուցադրել հստակ Display_label (); // Displayուցադրել «TEMP» և «LUX» բառերը TIMER1_init (); // erամաչափ 1 Նախաստորագրում: Սկսեք մոնիտորինգ: Պարամետրեր ստանալը ամեն վայրկյան: // Infinity loop while (1) {}}

Քայլ 3: irmրուցեք որոնվածը միկրոկոնտրոլերին

Բեռնել HEX ֆայլը միկրոկառավարիչի ֆլեշ հիշողության մեջ: Դիտեք տեսանյութը ՝ միկրոկառավարիչի ֆլեշ հիշողության այրման մանրամասն նկարագրությամբ.

Քայլ 4: Սարքի միացման մոնիտորինգ

Մոնիտորինգի սարքի միացում հավաքում
Մոնիտորինգի սարքի միացում հավաքում
Մոնիտորինգի սարքի միացում հավաքում
Մոնիտորինգի սարքի միացում հավաքում

Միացրեք բաղադրիչները սխեմատիկ սխեմայի համաձայն:

Միացրեք հոսանքը և այն աշխատում է:

Խորհուրդ ենք տալիս: