/* * File: main.c * Author: clement * * Created on July 14, 2025, 3:54 PM */ #include #include #include // Configuration bits #pragma config FOSC = INTOSC // Oscillator Selection bits (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config LVP = OFF #pragma config DEBUG = ON #pragma config PLLEN = 0 #define DHT22_PIN_DIR TRISAbits.TRISA4 #define DHT22_DATA PORTAbits.RA4 #define CTRL_1 PORTAbits.RA5 #define CTRL_2 PORTAbits.RA2 #define _XTAL_FREQ 8000000 void startSignal() { __delay_ms(5); // Attendre 5 ms pour stabiliser. Durée trame = 4ms // Signal de départ : bas pendant au moins 1 ms DHT22_PIN_DIR = 0; // 0 = sortie donc à 0 __delay_ms(1); // Attendre 1 ms // Signal de départ : haut pendant 20-40 µs DHT22_PIN_DIR = 1; // 1 = entrée donc haut grace au pullup __delay_us(30); // Attendre 30 µs } // Fonction pour lire un octet du DHT22 uint8_t readByte(int n) { uint8_t byte = 0; for (uint8_t i = 0; i < 8; i++) { TMR1H = 0; // Réinitialise le Timer1 TMR1L = 0; while (!DHT22_DATA); CTRL_1 = 1; //T1CONbits.TMR1ON = 1; TMR0 = 0; while (DHT22_DATA); //T1CONbits.TMR1ON = 0; CTRL_1 = 0; //uint16_t pulseWidth = (uint16_t) (TMR1H << 8) | (uint16_t) TMR1L; // Lit la valeur du Timer1 //byte <<= 1; // Décale le byte de 1 bit à gauche if (TMR0 > 50) { // Si l'impulsion est supérieure à 50 µs, c'est un 1 byte |= 1; } } return byte; } // Fonction pour lire l'humidité et la température uint8_t lire(signed char* humidite, signed char* temp) { startSignal(); uint8_t humidityHigh = readByte(1); uint8_t humidityLow = readByte(2); uint8_t temperatureHigh = readByte(3); uint8_t temperatureLow = readByte(4); uint8_t checksum = readByte(5); if (checksum != (humidityHigh + humidityLow + temperatureHigh + temperatureLow)) { return 1; // Erreur de checksum } uint16_t humidity = (uint16_t) (humidityHigh << 8) | (uint16_t) humidityLow; *humidite = (signed char)(humidity / 10); uint16_t temperature = (uint16_t) (temperatureHigh << 8) | (uint16_t) temperatureLow; if (temperature & 0x8000) { // Si le bit de signe est à 1, la température est négative temperature = -(temperature & 0x7FFF); } *temp = (signed char)(temperature / 10); return 0; // Lecture réussie } void main() { // Configuration de l'horloge interne à 1MHz OSCCON = 0b01110000; // Configuration des broches APFCONbits.T1GSEL = 0b0; // Timer1 sur RA4 TRISA = 0b11011011; // Configure RA2 et RA5 en sortie 0 = sortie ANSELA = 0b00000011; // Configure les broches utiles digital I/O WPUA = 0b00010000; // Active la résistance de pull-up sur RA4 LATAbits.LATA4 = 0b0; // RA4 est en sortie // Configuration du Timer1 T1CON = 0b00000000; // Timer1 est éteint initialement T1CONbits.TMR1CS = 0b01; // Source d'horloge est Fosc => 1MHz T1CONbits.T1CKPS = 0b11; // Pas de division de l'horloge T1GCONbits.T1GSS = 0b00; // Timer1 gate pin T1G T1GCONbits.T1GPOL = 0b1; // Polarité du gate control est active haut T1GCONbits.T1GTM = 0b0; // Mode du gate toggle désactivé T1GCONbits.T1GSPM = 0b1; // Single gate désactivé T1GCONbits.TMR1GE = 0; // Pas de gate control T1CONbits.TMR1ON = 0; // Démarrage du Timer1 PIR1bits.TMR1GIF = 0; // Efface le flag d'interruption du gate control OPTION_REGbits.PSA = 0; // Prescaler pour T0 // Boucle principale while (1) { signed char humidite = 0; signed char temperature = 0; lire(&humidite, &temperature); int x = 0; __delay_ms(100); } }