Բովանդակություն:
- Քայլ 1: Նկարագրություն Բաղադրիչներ
- Քայլ 2: Microcontroller որոնվածի ծածկագիր
- Քայլ 3: irmրուցեք որոնվածը միկրոկոնտրոլերին
- Քայլ 4: Սարքի միացման մոնիտորինգ
Video: Temերմաստիճանի և լուսավորության մակարդակի մոնիտոր `LCD NOKIA 5110: 4 քայլ ցուցադրմամբ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:48
Ողջույն բոլորին!
Այս բաժնում մենք պատրաստում ենք պարզ էլեկտրոնային սարք `ջերմաստիճանը և լուսավորության մակարդակը վերահսկելու համար: Այս պարամետրերի չափումները ցուցադրվում են LCD NOKIA 5110 -ով: Սարքը հիմնված է AVR ATMEGA328P միկրոկառավարիչի վրա: Մոնիտորինգի սարքը հագեցած է DS18B20 թվային ջերմաչափով և ֆոտոռեզիստորով `լուսավորման մակարդակը չափելու համար:
Քայլ 1: Նկարագրություն Բաղադրիչներ
Մոնիտորինգի սարքի հիմնական բաղադրիչները.
- Միկրոկոնտրոլեր AVR «ATMEGA328P»
- Մոնոխրոմ գրաֆիկական LCD «NOKIA 5110»
- Mրագրավորվող բանաձևով 1-լարային թվային ջերմաչափ «DS18B20»
- Լույսից կախված դիմադրություն
- Լարերը
Միկրոկոնտրոլեր AVR «ATMEGA328P»
Մոնիտորինգի սարքն օգտագործում է միկրոկառավարիչի հետևյալ ծայրամասային առանձնահատկությունները.
- 16-բիթ ժամաչափ/հաշվիչի ընդհատում
- 8-ալիքային 10-բիթանոց ADC
- Վարպետ/ստրուկ SPI սերիական ինտերֆեյս
Մոնոխրոմ գրաֆիկական LCD «NOKIA 5110»
Տեխնիկական պայմաններ.
- 48 x 84 կետանոց LCD էկրան
- Սերիական ավտոբուսի միջերես ՝ առավելագույն արագությամբ 4 Մբիթ/վ արագությամբ
- Ներքին վերահսկիչ/վարորդ «PCD8544»
- LED հետևի լույս
- Աշխատեք 2.7-5 վոլտ լարման վրա
- Powerածր էներգիայի սպառումը; այն հարմար է մարտկոցների կիրառման համար
- Temերմաստիճանը `-25˚C- ից +70˚C
- Աջակցման ազդանշանի 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-Wire® ինտերֆեյսը կապի համար պահանջում է միայն մեկ նավահանգիստ
- Կրճատեք բաղադրիչների քանակը ինտեգրված ջերմաստիճանի տվիչով և EEPROM- ով
- Չափում է ջերմաստիճանը -55 ° C- ից +125 ° C (-67 ° F- ից +257 ° F)
- ± 0.5 ° C uracyշգրտություն -10 ° C- ից +85 ° C
- Mրագրավորվող լուծում ՝ 9 բիթից մինչև 12 բիթ
- Արտաքին բաղադրիչներ չեն պահանջվում
- Պարազիտային էներգիայի ռեժիմը շահագործման համար պահանջում է ընդամենը 2 կապում (DQ և GND)
- Պարզեցնում է բաշխված ջերմաստիճանի զգացողության ծրագրերը ՝ բազմակի անկման հնարավորությամբ
- Յուրաքանչյուր սարք ունի 64-բիթանոց սերիական եզակի ծածկագիր, որը պահվում է ներկառուցված ROM- ում
- Userկուն օգտագործողի կողմից սահմանվող ոչ անկայուն (NV) rmարթուցիչի կարգավորումներ rmարթուցիչի որոնման հրամանով ifiesրագրավորված սահմաններից դուրս ջերմաստիճան ունեցող սարքերի նույնականացում
Դիմումներ:
- Թերմոստատիկ հսկողություն
- Արդյունաբերական համակարգեր
- Սպառողական ապրանքներ
- Երմաչափեր
- 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: Սարքի միացման մոնիտորինգ
Միացրեք բաղադրիչները սխեմատիկ սխեմայի համաձայն:
Միացրեք հոսանքը և այն աշխատում է:
Խորհուրդ ենք տալիս:
Temերմաստիճանի, խոնավության մոնիտոր - Arduino Mega + Ethernet W5100: 5 քայլ
Peratերմաստիճանի, խոնավության մոնիտոր - Arduino Mega + Ethernet W5100. Մոդուլ 1 - FLAT - սարքավորում ՝ Arduino Mega 2560 Wiznet W5100 Ethernet վահան 8x DS18B20 ջերմաստիճանի տվիչ OneWire ավտոբուսի վրա ՝ բաժանված 4 OneWire ավտոբուսների (2,4,1,1) 2x թվային ջերմաստիճանի: և խոնավության տվիչ DHT22 (AM2302) 1x ջերմաստիճան և խոնավություն
Sofրի մեղմացուցիչ աղի մակարդակի մոնիտոր `7 քայլ
Sofրի մեղմացուցիչ աղի մակարդակի մոնիտոր. Waterրի մեղմացուցիչներն աշխատում են իոնափոխանակություն կոչվող գործընթացի միջոցով, որի ընթացքում կոշտ ջրից կալցիումի և մագնեզիումի իոնները հատուկ խեժի միջոցով փոխանակվում են նատրիումի քլորիդի (աղի) հետ: Theուրը մտնում է ճնշման անոթ, որտեղ այն շարժվում է խեժի ուլունքների միջով
Temերմաստիճանի եւ խոնավության մոնիտոր `7 քայլ
Temերմաստիճանի և խոնավության մոնիտոր. Ձեր բույսերը արագորեն ոչնչացնելու երկու հստակ եղանակ կա: Առաջին ճանապարհն այն է, որ դրանք թխվեն կամ սառեցվեն մինչև ջերմաստիճանի ծայրահեղությունները: Այլապես, դրանց տակ կամ դրա ավելորդ ջրելը կհանգեցնի նրանց չորացման կամ արմատների փտման: Իհարկե այնտեղ
PC- ի ապարատային մոնիտոր Arduino- ով և Nokia 5110 LCD- ով ՝ 3 քայլ
Arduino- ի և Nokia 5110 LCD- ի հետ համակարգչային ապարատային մոնիտոր. Arduino- ի վրա հիմնված համակարգչի մոնիտոր, որը ցուցադրում է պրոցեսորի ջերմաստիճանը, բեռը, ժամացույցը և օգտագործված RAMCPU- ի բեռը կամ ժամացույցի արժեքները կարող են նաև գծագրվել որպես գրաֆիկ: Մասեր. Arduino Nano կամ Arduino Pro Mini USB սերիական ադապտեր Nokia 5110 84x48 LCD
Temերմաստիճանի եւ խոնավության մոնիտոր `6 քայլ (նկարներով)
Peratերմաստիճանի և խոնավության մոնիտոր Սարքը նաև WiFi հնարավորություններ ունի ՝ տվյալները հեռավոր սերվերի վրա (օրինակ ՝ Raspberry Pi) մուտքագրելու և