Operácie

Senzor teploty a vlhkosti SHT31: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
Riadok 71: Riadok 71:
sprintf(str, "\fTeplota:%d.%d C\r", temp_int / 10, temp_int % 10); // Formatovanie teploty s jednym desatinnym miestom
sprintf(str, "\fTeplota:%d.%d C\r", temp_int / 10, temp_int % 10); // Formatovanie teploty s jednym desatinnym miestom
lcd_puts(str);   // Vypis teploty na displej
lcd_puts(str);   // Vypis teploty na displej
printf("Teplota: %d.%d\r\n", temp_int / 10, temp_int % 10);
printf("Teplota: %d.%d C\r\n", temp_int / 10, temp_int % 10);


int humi_int = (int)(humidity * 10); // Prevod na cele cislo s jednym desatinnym miestom
int humi_int = (int)(humidity * 10); // Prevod na cele cislo s jednym desatinnym miestom
sprintf(str, "Vlhkost:%d.%d %%", humi_int / 10, humi_int % 10); // Formatovanie vlhkosti s jednym desatinnym miestom
sprintf(str, "Vlhkost:%d.%d %%", humi_int / 10, humi_int % 10); // Formatovanie vlhkosti s jednym desatinnym miestom
lcd_puts(str); // Vypis vlhkosti na displej
lcd_puts(str); // Vypis vlhkosti na displej
printf("Vlhkost: %d.%d\r\n", humi_int / 10, humi_int % 10);
printf("Vlhkost: %d.%d %%\r\n", humi_int / 10, humi_int % 10);
}
}



Verzia z 19:36, 22. apríl 2024

Záverečný projekt predmetu MIPS / LS2024 - Marián Sušina


Zadanie

Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie

Mojou úlohou v tomto zadaní bolo zapojiť, naprogramovať a overiť funkčnosť senzoru teploty a vlhkosti SHT31. Výpis informácii v o teplote a vlhkosti som pri mojom riešení realizoval pomocou LCD displeja a aj pomocou výpisu na obrazovku.

Arduino NANO.
Senzor teploty a vlhkosti SHT31.

Literatúra:

Analýza a opis riešenia

Na začiatok si môžeme podľa priložených schém pripojiť senzor SHT31 k mikroprocesoru. Na jeho správne používanie musíme použiť pri SCL (časovom kanále) a SDA (dátovom kanále) pull up rezistory.

Schéma zapojenia sensoru SHT31.

Po pripojení senzoru si môžeme pripojiť k mikroprocesoru aj LCD displej, ktorý zapojíme podľa priloženej schémy zapojenia.

Schéma zapojenia LCD displeja.

Ak sa nám už správne podarilo pripojiť senzor aj displej, hardvérová časť nášho zadania je hotová. Ďalej nasleduje programová časť. Pri tejto časti budeme používať datasheety, priložené vyššie. Ak chceme aby náš senzor vypisoval informácie na displej, budeme potrebovať knižnicu pre LCD displej. Pre výpis cez sériový kanál na obrazovku budeme potrebovať knižnicu UART. A pre použitie samotného senzora budeme ešte potrebovať používať knižnicu pre I2C zbernicu, ktorá slúži na prenos dát zo senzoru a na ich čítanie. Samotný program budeme písať podľa datasheetu, kde si naštudujeme ako náš senzor komunikuje s mikroprocesorom a ako z neho čítať dáta. Na to nám slúži obrázok priloženy nižšie z datasheetu, ktorý opisuje ako správne komunikovať a vyčítavať informácie zo senzoru.

Algoritmus čítania dát zo senzoru.

Na začiatku začneme posielať I2C adresu a hodnotu, ktorou nastavíme, že chceme zapisovať dáta. Po prijatí ACK (acknowledge), nastavíme MSB (most significant bit) a s ním si pre jednoduchosť vypneme Clock stretching. Ďalej nastavíme LSB (least significant bit), ktorým si volíme repeatebility. Ďalej pošleme informáciu o adrese a hodnote a počkáme na ACK, inak posielanie opakujeme v cykle až kým nedostaneme odpoveď. Keď odpoveď dostaneme, môžeme si do bufferu vyčítať dáta ktoré nám prišli zo senzoru. Tieto dáta nám prídu v dvoch častiach. Jedna nám hovorí o teplote a druhá o vlhkosti. Pomocou vzorčekov, ktoré si nájdeme v datasheete si údaje zo senzoru prepočítame a za pomoci nami vytvorenej funkcie na výpočet a výpis ich môžeme vypísať na displej ale aj cez sériovú linku na obrazovku.

Algoritmus a program

Algoritmus programu spočíva v prijímaní informácii zo senzoru, ktoré prekonvertujeme na požadované veličiny (Pre nás stupne Celzia pre teplotu a % pre vlhkosť), a následne ich vypíšeme aby sme si mohli pozrieť, čo sa nám podarilo odmerať a či nám všetko správne funguje.


/*
	SHT31D_projekt.c
	Autor: Marián Sušina
*/

/* hlavickove subory pre komunikaciu s UART, LCD displejom a I2C zbernicou */
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include "uart.h"
#include "lcd_ch.h"
#include "i2cmaster.h"

/* Inicializacia funkcie printf() cez UART */
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);

/* Adresa senzora v I2C zbernici */
#define SHT31 0x44

/* Funkcia na zobrazenie teploty a vlhkosti na LCD displeji a do Terminalu. Teplota a vlhkost sa formatuje s jednym desatinnym miestom */
void display_temperature_humidity(float temperature, float humidity)
{
	char str[20];

	int temp_int = (int)(temperature * 10);							   // Prevod na cele cislo s jednym desatinnym miestom
	sprintf(str, "\fTeplota:%d.%d C\r", temp_int / 10, temp_int % 10); // Formatovanie teploty s jednym desatinnym miestom
	lcd_puts(str);													   // Vypis teploty na displej
	printf("Teplota: %d.%d C\r\n", temp_int / 10, temp_int % 10);

	int humi_int = (int)(humidity * 10);							// Prevod na cele cislo s jednym desatinnym miestom
	sprintf(str, "Vlhkost:%d.%d %%", humi_int / 10, humi_int % 10); // Formatovanie vlhkosti s jednym desatinnym miestom
	lcd_puts(str);													// Vypis vlhkosti na displej
	printf("Vlhkost: %d.%d %%\r\n", humi_int / 10, humi_int % 10);
}

/* Funkcia na meranie teploty a vlhkosti */
void measure()
{
	uint8_t buf[6];
	i2c_start_wait(SHT31 << 1 | I2C_WRITE); // posiela I2C adresu a hodnotu na zapis a caka na potvrdenie ACK
	i2c_write(0x24);						// nastavenie MSB -> vypneme s nim Clock stretching
	i2c_write(0x0B);						// nastavenie LSB -> nastavyme si repeatebility na medium
	i2c_stop();

	_delay_ms(1); // pauza 1ms po prikaze (podla datasheetu)

	while (i2c_start(SHT31 << 1 | I2C_READ)) // posleme adresu a hodnotu na citanie a pockame na ACK
	{
		i2c_stop(); // ak prisiel NAK posleme STOP
	}

	for (uint8_t i = 0; i < 6; i++) // precitame 6 bajtov zo snimaca
	{
		buf[i] = i2c_read(i != 5); // zapiseme hodnoty zo snimaca do bufferu
	}
	i2c_stop();

	uint16_t T_RAW = buf[0] << 8 | buf[1];	// hodnota teploty
	uint16_t RH_RAW = buf[3] << 8 | buf[4]; // hodnota vlhkosti
	float T = 175.0 * T_RAW / 0xFFFF - 45;	// prepocet na stupne C
	float RH = RH_RAW * 100.0 / 0xFFFF;		// prepocet na %

	display_temperature_humidity(T, RH); // spustenie funkcie na vypis teploty a vlhkosti na displeji a v terminale
}

int main(void)
{

	/* inicializacia portov - vstupy / vystupy */

	DDRD |= (1 << LCD_EN_pin); // Pin D4 (Enable)  PORTD  output
	DDRD |= (1 << LCD_RW_pin); // Pin D3 (RW)      PORTD  output
	DDRD |= (1 << LCD_RS_pin); // Pin D2 (RS)      PORTD  output

	LCD_DATA_PORT |= (1 << LCD_D4_pin) | (1 << LCD_D5_pin) | (1 << LCD_D6_pin) | (1 << LCD_D7_pin); // Piny 1,2,3,4, PORTB ako output (Data pre display)

	/* inicializacia I2C, UARTu a LCD displeja */
	i2c_init();
	uart_init();
	lcd_init();

	stdout = &mystdout; // funkcia printf();

	lcd_puts("Start");
	_delay_ms(500);
	
	while (1)
	{
		measure();
		_delay_ms(1000);
	}

	return (0);
}

Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip


Overenie

Po pripojení senzora SHT31 a LCD displeja si vieme overiť funkčnosť programu. Po jeho spustení sa nám začne na LCD displeji ale aj na obrazovke zobrazovať teplota a vlhkosť v intervaloch jendej sekundy.

Zapojenie v realite.

Video: overenie funkčnosti

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.