/*! * \file main.c * \author Patrick Taling * \date 31/03/2017 * \version 1.0 * * \brief * Simple I2C SHT2x library to measure relative humidity and temperature and write it to an I2C LCD with the ATxmega256a3u. * Rights are owned by the original authors (Atmel, w.e.dolman, Noel200 (Elektroda) and Sensirion) * * \Hardware * # 1602 I2c HD44780 LCD from HobbyElectronica https://www.hobbyelectronica.nl/product/1602-lcd-i2c-blauw-backlight/ * # HvA Xmega-bord (ATxmega256a3u with programmer/ USB-RS232-interface ATxmega32a4u) * # 3.3V - 5V levelshifter with two BS170 N-channel MOSFET * # Humidity/ temperature sensor module (EBM016) https://www.elektor.nl/humidity-sensor-module-ebm016 * * \development * # Atmel Studio 7 (version: 7.0.118) * # OS Version: Microsoft Windows NT 6.2.9200.0 (Platform: Win32NT) * # Atmel Gallary (7.8) * * \details * #The file main.c is the main to write text to a I2C lcd (PCF8574T adress 0x27) with the ATxmega256a3u. * #For the use of the main code you need the i2c library from w.e.dolman (w.e.dolman@hva.nl) * #For i2c.c use code 21.8 from "de taal C en de Xmega tweede druk" http://dolman-wim.nl/xmega/book/index.php * #For i2c.h use code 21.9 from "de taal C en de Xmega tweede druk" http://dolman-wim.nl/xmega/book/index.php * * #The main code needs some parts of the i2c_lcd library from Noel200 from http://www.elektroda.pl/rtvforum/topic2756081.html. * #The library can be downloaded from: http://www.elektroda.pl/rtvforum/login.php?redirect=download.php&id=670533. * #Go to LCD_PCF8574T/lcd_pcf/ and use i2c_lcd.c and i2c_lcd.h from the pakkage * * #The libraby needs some parts of the the SHT2x library from SENIRION from https://www.sensirion.com/en/products/humidity-sensors/humidity-temperature-sensor-sht2x-digital-i2c-accurate/ * #The libraby can be download from: https://www.sensirion.com/en/products/all-documents-of-sensirions-humidity-sensors-for-download/ * # Go to SHT2x/ Sample Code SHT21 and download the zip file Sensirion_Humidity_Sensors_SHT21_Sample_Code_C-file * \note the following files aren't fully used. Most parts are used in other .c of .h files or disabled. * DisplayDip204.C, DisplayDip204.h, * I2C_HAL.c, I2C_HAL.h, * System.c, System.h and * io70f3740.h. * \note for the use of two SHT2X you should use different IOs for SDA or additional hardware such as I2C multiplexer. * The adress of the SHT2x can’t be changed. * * \verbatim * #include * #include * #include \endverbatim * \par * * \note An AVR-project can use multiple I2C's. One shoud take care that * in different source files there are no multiple i2c_init * definitions for the same I2C. */ #define F_CPU 2000000UL #include #include #include #include #include #define BAUD_100K 100000UL #include "I2C_SHT2x.h" #include "Typedefs.h" #include "i2c_lcd.h" //============================================================================== int main() //============================================================================== { // variables uint8_t error = 0; uint8_t userRegister; int endOfBattery; nt16 sRH; float humidityRH = 0; nt16 sT; float temperatureC = 0; uint8_t SerialNumber_SHT2x[8]; char buffer[20]; uint16_t h; i2c_init(&TWIE, TWI_BAUD(F_CPU, BAUD_100K)); PORTE.DIRSET = PIN1_bm|PIN0_bm; //SDA 0 SCL 1 i2c_lcd_init(); i2c_lcd_led_on(); i2c_lcd_set_cursor(0,0); _delay_ms(15); //initialization powerUp SHT2x (15ms) i2c_lcd_clear(); _delay_us(1500); //initialization powerUp LCD (1.5ms) i2c_lcd_set_cursor(0,0); i2c_lcd_write_text("T :"); i2c_lcd_write_text("--.-- C"); i2c_lcd_set_cursor(0,1); i2c_lcd_write_text("RH:"); i2c_lcd_write_text("--.-- %"); while(1) { error = 0; // reset error status //===================================================== // --- Reset sensor by command --- //===================================================== error |= i2c_SHT2x_SoftReset(); //===================================================== // --- Read the sensors serial number (64bit) --- //===================================================== error |= i2c_SHT2x_GetSerialNumber(SerialNumber_SHT2x); //===================================================== // --- Set Resolution e.g. RH 10bit, Temp 13bit --- //===================================================== error |= i2c_SHT2x_ReadUserRegister(&userRegister); userRegister = (userRegister & ~SHT2x_RES_MASK) | SHT2x_RES_10_13BIT; error |= i2c_SHT2x_WriteUserRegister(&userRegister); //===================================================== // --- measure humidity with "Hold Master Mode (HM)" --- //===================================================== error |= i2c_SHT2x_MeasureHM(TEMP, &sT); error |= i2c_SHT2x_MeasureHM(HUMIDITY, &sRH); //===================================================== // --- measure temperature with "Polling Mode" (no hold master) --- // --- Disabled due to error in TEMP ---- //===================================================== //error |= i2c_SHT2x_MeasurePoll(HUMIDITY, &sRH); //works fine //error |= i2c_SHT2x_MeasurePoll(TEMP, &sT); // Has an error in reading measuring //===================================================== //-- calculate humidity and temperature -- //===================================================== temperatureC = i2c_SHT2x_CalcTemperatureC(sT.u16); humidityRH = i2c_SHT2x_CalcRH(sRH.u16); //===================================================== // --- check end of battery status (eob)--- //===================================================== error |= i2c_SHT2x_ReadUserRegister(&userRegister); //get actual user reg if( (userRegister & SHT2x_EOB_MASK) == SHT2x_EOB_ON ) endOfBattery = TRUE; else endOfBattery = FALSE; //===================================================== //-- write humidity, temperature or error values on LCD -- //===================================================== if(error != 0){ i2c_lcd_clear(); _delay_us(1500); i2c_lcd_write_text("An ERROR"); i2c_lcd_set_cursor(0,1); i2c_lcd_write_text("has occurred"); } else if (endOfBattery){ i2c_lcd_clear(); _delay_us(1500); i2c_lcd_write_text("LOW BATTERY"); } else{ i2c_lcd_clear(); _delay_us(1500); i2c_lcd_set_cursor(0,0); h= temperatureC; i2c_lcd_write_text("T :"); utoa(temperatureC, buffer, 10); i2c_lcd_write_text(buffer); i2c_lcd_write_text("."); utoa((temperatureC-h)*100, buffer, 10); i2c_lcd_write_text(buffer); i2c_lcd_write_text(" C"); i2c_lcd_set_cursor(0,1); h= humidityRH; i2c_lcd_write_text("RH:"); utoa(humidityRH, buffer, 10); i2c_lcd_write_text(buffer); i2c_lcd_write_text("."); utoa((humidityRH-h)*100, buffer, 10); i2c_lcd_write_text(buffer); i2c_lcd_write_text(" %"); } _delay_ms(300); // wait 3s for next measurement } }