0% found this document useful (0 votes)
139 views28 pages

AEMC Proiect

The document describes a project for a microcontroller that reads temperature, humidity and light intensity from various sensors. It includes code to initialize ports and interrupts, read sensor data, and display it on an LCD screen. The data can be cycled through by pressing a button.

Uploaded by

Antohi Oana
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
139 views28 pages

AEMC Proiect

The document describes a project for a microcontroller that reads temperature, humidity and light intensity from various sensors. It includes code to initialize ports and interrupts, read sensor data, and display it on an LCD screen. The data can be cycled through by pressing a button.

Uploaded by

Antohi Oana
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 28

Grupa 5301

Tantari Dumitru

Lisnic Colea

Antohi Oana

Proiect AEMC 2022

Imagini simulari proteus:


/*Template Proiect AEMC - ETTI Iasi*/

#include <xc.h>

#pragma config CONFIG1 = 0x2CD4

#pragma config CONFIG2 = 0x0700

#define _XTAL_FREQ 16000000

#define LED1 RB0

#define LED2 RB1

#define DHT11_PIN RB0


#define DHT11_PIN_DIR TRISB0

char *logo1 = (char *) "AEMC-Proiect";

char *logo2 = (char *) "Lisinic Nicolae";

char *logo3 = (char *) "Antohi Oana";

char *logo4 = (char *) "linia_4";

char Temperature[] = "Temp = 00.0 C ";

char Luminozitate[] = "Lumin = 00.0 % ";

char Temperature_prev[] = "" ;

char Humidity_prev[] = "";

char Humidity[] = "RH = 00.0 % ";

unsigned char T_Byte1, T_Byte2, RH_Byte1, RH_Byte2, CheckSum ;

unsigned char ref_voltage = 5;

char butt_state;

char temp_an;

uint16_t RH_an;

uint16_t Lux_an;

void init_uC(void);

void interrupt etti(void); // functie de intreruperi globala ptr. TOATE intreruperile de pe un

void Start_Signal(void);

__bit Check_Response();

__bit Read_Data(unsigned char* dht_data);


void init_LCD(void);

void lcd_goto(unsigned char pos);

void lcd_puts(char * s);

void lcd_putch(char c);

void lcd_clear(void);

void afisare_diacritice(unsigned char diacritic_afisat, unsigned char linia);

void DHT_read(void);

float get_lm35(void);

float Read_ADC(void);

void Init_ADC(void);

void main(void)

init_uC();

init_LCD();

Init_ADC();

char butt_state = 1;

lcd_goto(0x80);

lcd_puts(logo1);

lcd_goto(0xC0);

afisare_diacritice(7, 0xC0);

afisare_diacritice(2, 0xC1);

lcd_puts("n");

afisare_diacritice(4, 0xC3);

lcd_puts("ari Dumitru");
lcd_goto(0x94);

lcd_puts(logo2);

lcd_goto(0xD4);

lcd_puts(logo3);

__delay_ms(2000);

lcd_clear();

while (1)

while(butt_state == 1 )

Start_Signal(); // send start signal to the sensor

DHT_read();

if (RC0 ==1)

__delay_ms(100);

if (RC0 ==1)

butt_state++;

lcd_clear();

while(butt_state == 2 )

ADCON0bits.CHS = 0x00;

temp_an = get_lm35();
ADCON0bits.CHS = 0x01;

RH_an = ( Read_ADC() /1023)*100 ;

Temperature[7] = temp_an / 10 + '0';

Temperature[8] = temp_an % 10 + '0';

Temperature[11] = 223; // put degree symbol (°)

if(RH_an >=100)

Humidity[6] = RH_an / 100 + '0';

}else Humidity[6] = 32;

if(RH_an < 100)

Humidity[7] = RH_an / 10 + '0';

}else Humidity[7] = '0' ;

Humidity[8] = RH_an % 10 + '0';

lcd_goto(0x80);

lcd_puts("Senzori Analogici");

lcd_goto(0xC0);

lcd_puts(Temperature);

lcd_goto(0x94);

lcd_puts(Humidity);

if (RC0 ==1)

__delay_ms(100);
if (RC0 ==1)

butt_state++;

lcd_clear();

while(butt_state == 3 )

ADCON0bits.CHS = 0x02;

Lux_an = ( Read_ADC() /980)*100 ;

Luminozitate[8] = Lux_an / 10 + '0';

Luminozitate[9] = Lux_an % 10 + '0';

lcd_goto(0x80);

lcd_puts("Senzor lumina");

lcd_goto(0xC0);

lcd_puts(Luminozitate);

if (RC0 ==1)

__delay_ms(100);

if (RC0 ==1)
{

butt_state=1;

float get_lm35(void)

int adc_value = Read_ADC();

float voltage = (float)(ref_voltage*adc_value)/1024;

float temp = voltage/0.01;

return temp;

float Read_ADC(void)

__delay_us(50);

GO = 1;
while(GO_DONE);

return (ADRESH<<8)+ADRESL;

void Init_ADC(void)

TRISA = 0xff;

ADCON0bits.ADCS = 0b00;

ADCON0bits.CHS = 0b0000;

ADCON0bits.ADON = 1;

ADCON1bits.ADFM = 1;

ADCON1bits.VCFG1 = 0;

ADCON1bits.VCFG0= 0;

void DHT_read(void)

if(Check_Response()) // check if there is a response from sensor (If OK start reading humidity and
temperature data)

// read (and save) data from the DHT11 sensor and check time out errors

if(Read_Data(&RH_Byte1) || Read_Data(&RH_Byte2) || Read_Data(&T_Byte1) ||


Read_Data(&T_Byte2) || Read_Data(&CheckSum))

lcd_clear();

lcd_goto(0x80);

lcd_puts("Time Out"); // display "Time out!"

}
else // if there is no time out error

if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))

{ // if there is no checksum error

Temperature[7] = T_Byte1 / 10 + '0';

Temperature[8] = T_Byte1 % 10 + '0';

Temperature[10] = T_Byte2 / 10 + '0';

Humidity[7] = RH_Byte1 / 10 + '0';

Humidity[8] = RH_Byte1 % 10 + '0';

Humidity[10] = RH_Byte2 / 10 + '0';

Temperature[11] = 223; // put degree symbol (°)

// if ((Temperature != Temperature_prev) & (Humidity_prev != Humidity))

// {

lcd_goto(0x80);

lcd_puts("Senzori Digitali");

lcd_goto(0xC0);

lcd_puts(Temperature);

lcd_goto(0x94);

lcd_puts(Humidity);

/*

for (int i = 0; i < sizeof(Temperature); i++)

Temperature_prev[i] =Temperature[i] ;

for (int i = 0; i < sizeof(Humidity); i++)

Humidity_prev[i] = Humidity[i];

*/
}

// if there is a checksum error

else

lcd_clear();

lcd_goto(0x80);

lcd_puts("Checksum Error!");

// if there is a response (from the sensor) problem

else

lcd_clear();

lcd_goto(0xC5);

lcd_puts("No response");

lcd_goto(0x94);

lcd_puts("from the sensor");

void init_uC (void)

OSCCON = 0X70; // set internal oscillator to 8MHz


ANSELH = 0; // configure all PORTB pins as digital

T1CON = 0x10; // set Timer1 clock source to internal with 1:2 prescaler (Timer1 clock =
1MHz)

TMR1H = 0; // reset Timer1

TMR1L = 0;

TRISB = 0b00000000; // tot Portul B este de iesire

TRISD = 0b00000000; // tot Portul D este de iesire

RC0 =1;

PORTB = 0b00000000; // initializez PORTB cu valori de 0 logic

OPTION_REG = 0b00000111;// Frecv. intrare T0 = Frecv. Osc./4 (=8MHz/4) = 2MHz

GIE = 1; // activez Global intreruperile

void interrupt etti(void) // ajung aici la fiecare 78*128us=~10ms

if(TMR0IF) // daca flagul TMR0IF=1

TMR0IF = 0; // obligatoriu - sterg flagul Timerului care a generat


intreruperea

TMR0 = 178; //

LED2 = !LED2; //

void Start_Signal(void) {
DHT11_PIN_DIR = 0; // configure DHT11_PIN as output

DHT11_PIN = 0; // clear DHT11_PIN output (logic 0)

__delay_ms(25); // wait 25 ms

DHT11_PIN = 1; // set DHT11_PIN output (logic 1)

__delay_us(30); // wait 30 us

DHT11_PIN_DIR = 1; // configure DHT11_PIN as input

// Check sensor response

__bit Check_Response() {

TMR1H = 0; // reset Timer1

TMR1L = 0;

TMR1ON = 1; // enable Timer1 module

while(!DHT11_PIN && TMR1L < 100); // wait until DHT11_PIN becomes high (checking of 80µs low
time response)

if(TMR1L > 99) // if response time > 99µS ==> Response error

return 0; // return 0 (Device has a problem with response)

else

TMR1H = 0; // reset Timer1

TMR1L = 0;

while(DHT11_PIN && TMR1L < 100); // wait until DHT11_PIN becomes low (checking of 80µs high
time response)
if(TMR1L > 99) // if response time > 99µS ==> Response error

return 0; // return 0 (Device has a problem with response)

else

return 1; // return 1 (response OK)

// Data read function

__bit Read_Data(unsigned char* dht_data)

*dht_data = 0;

for(char i = 0; i < 8; i++)

TMR1H = 0; // reset Timer1

TMR1L = 0;

while(!DHT11_PIN) // wait until DHT11_PIN becomes high

if(TMR1L > 100) { // if low time > 100 ==> Time out error (Normally it takes 50µs)

return 1;

TMR1H = 0; // reset Timer1

TMR1L = 0;

while(DHT11_PIN) // wait until DHT11_PIN becomes low


if(TMR1L > 100) { // if high time > 100 ==> Time out error (Normally it takes 26-28µs for 0 and
70µs for 1)

return 1; // return 1 (timeout error)

if(TMR1L > 50) // if high time > 50 ==> Sensor sent 1

*dht_data |= (1 << (7 - i)); // set bit (7 - i)

return 0; // return 0 (data read OK)

//cod LCD

#include <xc.h>

#define LCD_RS RD4

#define LCD_EN RD5

#define LCD_DATA PORTD

#define LCD_STROBE() ((LCD_EN = 1), delay_LCD(1), (LCD_EN=0))

char GRADE = 0xDF; //codul ASCII pentru simbolul "°" (grade)

char MICRO = 0xE4; //codul ASCII pentru simbolul "µ" (micro)

char ALPHA = 0xE0; //codul ASCII pentru simbolul "a" (alfa)

char BETA = 0xE2; //codul ASCII pentru simbolul "Я" (beta)

char EPSILON = 0xE3; //codul ASCII pentru simbolul "e" (epsilon)

char THETA = 0xF2; //codul ASCII pentru simbolul "? " (theta)

char MIU = 0xE4; //codul ASCII pentru simbolul "µ" (miu)


char OMEGA = 0xF4; //codul ASCII pentru simbolul "O" (omega)

char SIGMAm = 0xE5; //codul ASCII pentru simbolul "s" (sigma mic)

char RO = 0xE6; //codul ASCII pentru simbolul "?" (ro)

char SIGMAM = 0xF6; //codul ASCII pentru simbolul "S" (sigma mare)

char PI = 0xF7; //codul ASCII pentru simbolul "p" (pi)

char RADICAL = 0xE8; //codul ASCII pentru simbolul "radical"

char MINUS1 = 0xE9; //codul ASCII pentru simbolul "-1" (putere -1)

char INFINIT = 0xF3; //codul ASCII pentru simbolul "infinit"

char NEGRU = 0xFF; //codul ASCII pentru simbolul "celula neagra"

char ALB = 0xFE; //codul ASCII pentru simbolul "celula alba"

char ms1[8]={0x00,0x00,0x0F,0x10,0x0E,0x01,0x1E,0x04}; //litera "s,"

char ma1[8]={0x0A,0x04,0x0E,0x01,0x0F,0x11,0x0F,0x00}; //litera "a~"

char ma2[8]={0x04,0x0A,0x0E,0x01,0x0F,0x11,0x0F,0x00}; //litera "a^"

char mi1[8]={0x04,0x0A,0x00,0x0C,0x04,0x04,0x0E,0x00}; //litera "i^"

char mt1[8]={0x04, 0x04, 0x0E, 0x04, 0x04, 0x05, 0x06, 0x02}; //litera "t,"

char mL1[8]={0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}; //caracter " |"

char mL2[8]={0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03}; //caracter " ||"

char mL3[8]={0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07}; //caracter " |||"

char mL4[8]={0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F}; //caracter "||||"

char Mt1[8] ={0x1F,0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04};

unsigned char a1, a2, i1, s1, t1, L1, L2, L3, L4,T1; //denumirile acestor variabile se aleg

//pentru a descrie caracterul diacritic sau grafic definit de

//utilizator in cazul de fata este vorba de diacriticile "a~", "a^", "i^",

//"s,","t," si de simbolurile grafice" |"," ||"," ||",“ |||";

void init_LCD(void);

void lcd_write(unsigned char c);


void lcd_clear(void);

void lcd_goto(unsigned char pos);

void lcd_puts(char * s);

void lcd_putch(char c);

void delay_LCD(unsigned long t);

void initializare_diacritice(void);

void scrie_diacritice_in_CGRAM(char matrice[8], unsigned char pozitie_DDRAM,unsigned char


*diacritic);

void afisare_diacritice(unsigned char diacritic_afisat, unsigned char linia);

void init_LCD(void)

//delay_LCD(2000);

//lcd_write(0x2C);

delay_LCD(100);

lcd_clear();

delay_LCD(3000);

lcd_write(0x02);

delay_LCD(2000);

lcd_write(0x06);

delay_LCD(100);

lcd_write(0x0C);

delay_LCD(100);

lcd_write(0x10);

delay_LCD(100);

lcd_write(0x2C);

delay_LCD(100);

initializare_diacritice();
}

void lcd_write(unsigned char c)

LCD_DATA = (LCD_DATA & 0xF0) | (c >> 4);

LCD_STROBE();

LCD_DATA = (LCD_DATA & 0xF0) | ( c & 0x0F );

LCD_STROBE();

void lcd_clear(void)

LCD_RS = 0;

lcd_write(0x01);

void lcd_puts( char * s)

LCD_RS = 1; // write characters

while(*s)

lcd_write(*s++);

void lcd_putch(char c)

LCD_RS = 1; // write characters

lcd_write( c );

void lcd_goto(unsigned char pos)

LCD_RS = 0;

lcd_write(pos);
}

void delay_LCD(unsigned long t)

unsigned long var;

for(var=0; var < t>>6; var++);

void initializare_diacritice(void)

scrie_diacritice_in_CGRAM(ma1,0,&a1); //litera "a~"

scrie_diacritice_in_CGRAM(ma2,1,&a2); //litera "a^"

scrie_diacritice_in_CGRAM(mi1,2,&i1); //litera "i^"

scrie_diacritice_in_CGRAM(ms1,3,&s1); //litera "s,"

scrie_diacritice_in_CGRAM(mt1,4,&t1); //litera "t,"

scrie_diacritice_in_CGRAM(mL1,5,&L1); //simbol grafic " |"

scrie_diacritice_in_CGRAM(mL2,6,&L2); //simbol grafic " ||"

scrie_diacritice_in_CGRAM(Mt1,7,&T1); //simbol grafic " |||"

void scrie_diacritice_in_CGRAM(char matrice[8], unsigned char pozitie_DDRAM, unsigned char


*diacritic)

char i;

*diacritic = pozitie_DDRAM;

for (i=0; i<8; i++)

lcd_goto(0x40+(pozitie_DDRAM*8)+i);

delay_LCD(100);

lcd_putch(matrice[i]);

delay_LCD(100);
}

void afisare_diacritice(unsigned char diacritic_afisat, unsigned char linia)

lcd_goto(linia);

lcd_putch(diacritic_afisat);

Partea de PCB:

You might also like