You are on page 1of 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