This is an old revision of the document!


1-wire temperatuuriandur

Vajalikud teadmised: [HW] Andurite moodul, [HW] Kasutajaliidese moodul, [HW] Kontrollermoodul, [LIB] Sisend-väljundviigud, [LIB] Graafiline LCD, [LIB] Andurid

Teooria

1-wire protokoll

Praktika

 

#include <avr/io.h>
#include <string.h>
#include <stdio.h>
 
 
#include "onewire.h"
#include "ds18x20.h"
 
#include <homelab/module/lcd_gfx.h>
#include <homelab/delay.h>
#include <homelab/pin.h>
 
//
// Muutuja, mis on defineeritud mujal. Sellesse salvestatakse
// iga anduri järjekorra number ja anduri kood, mis on igal anduril unikaalne.
//
extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE];
 
int main( void )
{
	uint8_t nSensors, i;
	int16_t decicelsius;
	uint8_t error;
	char s[10];
	char sensor_nr[1];
 
	// Anduriplaadi multiplexeri viigu seadistamine.
	pin multiplexer_pin = PIN(G, 0);
 
	// LCD ekraani algseadistamine
	lcd_gfx_init();
 
	// Ekraani puhastamine
	lcd_gfx_clear();
 
	// Taustavalgustuse tööle lülitamine
	lcd_gfx_backlight(true);	
 
 	// Multiplexeri viigu seadmine väljundiks ja seejärel toimub selle ümber 
	// lülitamine, et välised andurite pordid kontrolleriga ühendada.
	pin_setup_output(multiplexer_pin);
	pin_set(multiplexer_pin); 
 
	// 1-Wire siini seadistamine. Anduriplaadil vastab viigule F3 ADC3 tähistusega pistik.
	ow_set_bus(&PINF,&PORTF,&DDRF,PF3);
 
	// Andurite otsimine. Muutujale nSensor omistatakse kõikide leitud
	// andurite arv.
	nSensors = search_sensors();
 
	while(1) 
	{   
 
		error = 0;
 
		// Kui andureid ei leita, siis seatakse püsti vealipp.
		if ( nSensors == 0 ) 
		{
			error++;
		}
 
		// Kõikide andurite temperatuuride kuvamine vaheldumisi alates tagumisest andurist.
		for ( i = nSensors; i > 0; i-- ) 
		{
			// Mõõtmise tegemine. Vea korral seatakse vealipp.
			if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, &gSensorIDs[i-1][0] ) == DS18X20_OK ) 
			{
				sw_delay_ms( 750 );
 
				// Anduri väärtuse lugemine muutujasse decicelsius. Vea korral seatakse vealippp.
				if ( DS18X20_read_decicelsius( &gSensorIDs[i-1][0], &decicelsius) == DS18X20_OK ) 
				{
 
					// Sõna "TEMP" kuvamine.
					lcd_gfx_goto_char_xy(2, 1);
					lcd_gfx_write_string("TEMP");
 
					// Kraadi tähise kuvamine
					lcd_gfx_goto_char_xy(13, 1);
					lcd_gfx_write_string("C");
 
					// Lugemi stringiks teisendamine ühe komakohaga ja lisaks +/- lisamine.
					DS18X20_format_from_decicelsius( decicelsius, s, 10 );
 
					// Kui on vaja maksimaalset täpsust, kasutada järgmist funktsiooni:
					   // DS18X20_format_from_maxres( tval, s, 10 );
 
					// Temperatuuri ekraanile kuvamine
					lcd_gfx_goto_char_xy(7, 1);					
					lcd_gfx_write_string(s);
 
					// Anduri numbri kuvamine. Eelnevalt teisendatakse see stringiks.
					lcd_gfx_goto_char_xy(0, 1);
					sprintf(sensor_nr, "%d", i);
					lcd_gfx_write_string(sensor_nr);
				} 
				else 
				{
					// CRC viga (Ühendus on maas)
					error++;
				}
 
			}
			else 
			{
				// Mõõtmine ebaõnnestus võibolla on siinil lühis
				error++;
			}
		}
 
 
		// Veateate kuvamine.
		if ( error ) 
		{
			lcd_gfx_goto_char_xy(1, 3);
			lcd_gfx_write_string("ERROR!");
			error = 0;
		}
		else
		{
			lcd_gfx_goto_char_xy(1, 3);
			lcd_gfx_write_string("        ");
		}
 
		sw_delay_ms(500);
	}
}

1-wire temperatuurianduri näitekood

et/examples/sensor/1-wire.1327268889.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0