728x90

728x90

Showing posts with label temperature sensor. Show all posts
Showing posts with label temperature sensor. Show all posts

Wednesday, December 27, 2023

PIC16F887 DHT-11 LCD Example Using XC8

DHT11 converts the surrounding temperature and humidity to serial digital data for any micro-processor. It uses only one serial data wire. It able to convert between 0 and 50 degree Celsius in temperature, and 0 to 90RH for humidity. It's suitable for air conditioning system, agricultural application, etc.

PIC16F887 DHT-11 LCD Example Using XC8
DHT-11 Sensor

PIC16F887 DHT-11 LCD Example Using XC8
Prototyping Board

It contains 5 bytes (40 bits) of digital data. They are 1 byte of humidity, 1 byte of temperature, and 1 byte of check sum. For more information about decoding its data byte please check this post.

PIC16F887 DHT-11 LCD Example Using XC8
DTH-11 Sensor

 
PIC16F887 DHT-11 LCD Example Using XC8
TC1604A-01 16x4 Character LCD Module

In this example, I use an 8-bit PIC micro-controller PIC16F887, a DHT-11 sensor module, and a 16x2 character LCD to read and display the environmental data. I use the Microchip MPLABX IDE v6.15 and its XC8 C compiler v2.36 (free version).

  1. /*
  2.  * File: main.c
  3.  * Author: Admin
  4.  *
  5.  * Created on December 26, 2023, 9:03 PM
  6.  * PIC16F887 DHT-11 Sensor and LCD Example
  7.  * MPLABX IDE v6.15 XC8 v2.36
  8.  */
  9.  
  10. #include <xc.h>
  11. #include "config.h"
  12. #include "LCD4Bits.h"
  13. #include <stdio.h>
  14.  
  15. #define _XTAL_FREQ 8000000UL
  16.  
  17. #define DATA_PIN RD0
  18. #define DATA_DIR TRISD0
  19.  
  20. uint8_t data[5];
  21. void readDHT11(void){
  22. for(uint8_t i=0;i<5;i++) data[i]=0;
  23. DATA_DIR=0;
  24. DATA_PIN=1;
  25. __delay_ms(10);
  26. DATA_PIN=0;
  27. __delay_ms(18);
  28. DATA_PIN=1;
  29. __delay_us(30);
  30. DATA_PIN=0;
  31. DATA_DIR=1;
  32. __delay_us(10);
  33. while(DATA_PIN==0);
  34. __delay_us(10);
  35. while(DATA_PIN==1);
  36. __delay_us(10);
  37.  
  38. //Start of Transmission
  39. for(uint8_t i=0;i<5;i++) {
  40. for(uint8_t j=0;j<8;j++){
  41. __delay_us(5);
  42. while(DATA_PIN==0);
  43. __delay_us(50);
  44. if(DATA_PIN==1) { data[i]|=(1<<7-j); while(DATA_PIN==1);}
  45. }
  46. __delay_us(10);
  47. }
  48. /*CRC Calculation - the last byte data[4] is check sum*/
  49. uint8_t crc = data[0]+data[1]+data[2]+data[3];
  50. if(crc!=data[4]) {for(uint8_t i=0;i<4;i++) data[i]=0; return;}
  51. __delay_us(10);
  52. }
  53.  
  54.  
  55. void main(void) {
  56. OSCCONbits.IRCF=7;
  57. char msg[8];
  58. PORTA=0;
  59. TRISA=0;
  60. lcdInit();
  61. lcdString("Temperature:");
  62. __delay_ms(1000);
  63. while(1){
  64. readDHT11();
  65. sprintf(msg,"%2dRH",data[0]);
  66. lcdXY(1,2); lcdString(msg);
  67. sprintf(msg,"%2d%cC",data[2],223);
  68. lcdXY(8,2); lcdString(msg);
  69. __delay_ms(500);
  70. }
  71. return;
  72. }
  73.  

I use its 8MHz internal oscillator clock source leaving the XTAL1 and XTAL2 pin opened.

PIC16F887 DHT-11 LCD Example Using XC8

Dashboard

PIC16F887 DHT-11 LCD Example Using XC8

Running Program



PIC16F887 DHT-11 LCD Example Using XC8

Running Program

 

PIC16F887 DHT-11 LCD Example Using XC8

Simulating Program


Proteus VSM can be used for circuit design and simulation. Click here to download its source file.



Sunday, December 24, 2023

PIC16F887 DS18B20 LCD Example Using XC8

Overview

For a micro-controller that doesn't have a analog to digital converter module, the designer can choose any others temperature sensor that use any communication method, I2C, SPI, or even 1-Wire serial communication interface. A 1-Wire digital thermometer is very popular due to its low cost, multiples device communication, low pins count (a few wires).

PIC16F887 DS18B20 LCD Example Using XC8
Prototype Board Test

DS18X20 temperature sensor is in common now. Using only one data pin the controller able to control up to 127 DS18X20 devices on a single bus with distinct device unique ID (ROM). Here I use a DS18B20 temperature sensor to interface with a Microchip PIC16F887 micro-controller. I don't write any more details here you check it in previous post.

PIC16F887 DS18B20 LCD Example Using XC8
DS18B20 Pin Configurations

This device requires only three wires GND, DQ, and VDD, or ever two wires mode (parasitic power supply). These three wires will share with other 1-Wire devices for multiple device connections. 

MPLABX IDE and XC8 Programming

Arduino platform has various libraries for this sensor. Other C compilers such as MikroC, CCS PICC also has their own libraries for this device. However I write my own libraries follow the original application note created by the device manufacture. 

MPLABX IDE and XC8 C compiler for 8-bit PIC micro-controller is free to use (without code optimization). 

In this example, I use my own 8-bit PIC Prototyping Board to test this program. It has an on-board 16x2 LCD module (TINSHARP TC1604A-01).

PIC16F887 DS18B20 LCD Example Using XC8
TC1604A-01 Front

PIC16F887 DS18B20 LCD Example Using XC8
TC1604A-01 Back View

PIC16F887 doesn't require an external crystal oscillator. It's operated by its internal RC oscillator with a selected 8MHz clock frequency.

  1. /*
  2.  * File: main.c
  3.  * Author: Admin
  4.  *
  5.  * Created on December 24, 2023, 5:56 PM
  6.  * PIC16F887 DS18B20 and LCD Example
  7.  * MPLABX IDE v6.15
  8.  * XC8 v2.36
  9.  */
  10.  
  11.  
  12. #include <xc.h>
  13. #include "config.h"
  14. #include "lcd.h"
  15. #include "ds18b20.h"
  16.  
  17. #define _XTAL_FREQ 8000000UL
  18.  
  19. unsigned char byte[10];
  20. unsigned char TH=0,TL=0;
  21.  
  22. void sensorRead(void){
  23. ow_reset();
  24. writeByte(0xCC);
  25. writeByte(0x44);
  26. __delay_us(104);
  27. ow_reset();
  28. writeByte(0xCC);
  29. writeByte(0xBE);
  30. for(int i=0;i<9;i++) byte[i]=readByte();
  31. TH=byte[1];
  32. TL=byte[0];
  33. __delay_ms(10);
  34. }
  35.  
  36. void main(void) {
  37. OSCCONbits.IRCF=7;
  38. PORTD=0;
  39. TRISD=0;
  40. lcdInit(); lcdString("PIC16F887 LCD");
  41. lcdXY(1,2); lcdString("DS18B20 1-Wire");
  42. lcdXY(1,3); lcdString("Programming With");
  43. lcdXY(1,4); lcdString("MPLABX IDE XC8");
  44. __delay_ms(2500);
  45. lcdCommand(0x0C);
  46. lcdCommand(0x01);
  47. __delay_ms(5);
  48. lcdXY(3,1); lcdString("Temperature:");
  49. lcdXY(1,3); lcdString("DS18B20 Connects");
  50. lcdXY(1,4); lcdString("Pin RD7.");
  51. int temp=0, fraction=0;
  52. while(1){
  53. sensorRead();
  54. temp=(TH<<8)+TL;
  55. TH=temp>>4;
  56. lcdXY(1,2); lcdString("1Wire: ");
  57. if(temp&0x8000){
  58. temp=~temp+1;
  59. TH=temp>>4;
  60. TH&=0x7F;
  61. lcdData('-');
  62. lcdData(48+TH/10);
  63. lcdData(48+TH%10);
  64. }else{
  65. lcdData((TH>=100)?(48+TH/100):' ');
  66. lcdData((TH>=10)?(48+(TH%100)/10):' ');
  67. lcdData(48+TH%10);
  68. }
  69. fraction=temp&0x000F;
  70. fraction*=625;
  71. lcdData('.');
  72. lcdData(48+fraction/1000);
  73. lcdData(48+(fraction%1000)/100);
  74. lcdData(223);
  75. lcdData('C');
  76. __delay_ms(500);
  77. }
  78. return;
  79. }
  80.  

Without using C floating point and sprintf() function, it saves ROM and RAM usage. 

PIC16F887 DS18B20 LCD Example Using XC8
MPLABX IDE Dashboard
 

Proteus can be used for schematic design, or even circuit simulation.

PIC16F887 DS18B20 LCD Example Using XC8
Initialization

 
PIC16F887 DS18B20 LCD Example Using XC8
Temperature Reading In Simulator

Click here to download its source file. I use MPLABX IDE v6.15 and XC8 C compiler v2.36 free edition.

PIC16F887 DS18B20 LCD Example Using XC8

 
PIC16F887 DS18B20 LCD Example Using XC8
Temperature Reading

This old DIY prototyping board works well easing component placement board breadboard.




Saturday, December 23, 2023

PIC16F887 LM35 and LCD Interfacing Example Using XC8

LM35 is an analog temperature sensor that can convert environment temperature between -55 to 150 degree Celsius. It need a stable DC supply voltage between 4 and 30V. It generates a linear analog output voltage that's 10mV per degree Celsius. We can interpret this analog signal with an ICL7107 analog to BCD seven-segment display converter, or even a micro-controller's analog to digital converter (ADC).

PIC16F887 LM35 and LCD Interfacing Example Using XC8
On-board LM35 16x2 LCD and PIC16F887 micro-controller

Using a micro-controller with ADC module is common we can select any output display type, a seven segment display or character or graphical LCD. In this example I use a PIC16F887 micro-controller and a 16x4 character LCD from Tinsharp.

I use the internal ADC module of PIC16F887. It has 10-bit resolution. Its voltage reference pins are wired internally by software to GND and VDD (+5VDC). LM35 connects to RA5(AN4) pin of PIC16F887.

The LCD operates in 4-bit data transfer mode. I connect the on-board LCD as follow,

  • RS -> RB5
  • RW-> RB6
  • EN -> RB7
  • DB4...DB7 -> RD0...RD3

PORTB has an alternative analog inputs function. So we have to clear ANSELH SFR first.

  1. /*
  2.  * File: main.c
  3.  * Author: Admin
  4.  *
  5.  * Created on December 22, 2023, 2:59 PM
  6.  */
  7.  
  8.  
  9. #include <xc.h>
  10. #include "config.h"
  11.  
  12. #define _XTAL_FREQ 8000000UL
  13.  
  14. #include "lcd.h"
  15. #include <stdio.h>
  16.  
  17. void main(void) {
  18. /*8MHz Internal OSC*/
  19. OSCCONbits.IRCF=7;
  20. /*Internal ADC FOSC*/
  21. ADCON0bits.ADCS=3;
  22. /*Select AN4*/
  23. ADCON0bits.CHS=4;
  24. __delay_ms(10);
  25. /*Turn On ADC*/
  26. ADCON0bits.ADON=1;
  27. /*Right Justify*/
  28. ADCON1bits.ADFM=1;
  29. /*VDD and VSS VFRE*/
  30. ADCON1bits.VCFG1=0;
  31. ADCON1bits.VCFG0=0;
  32.  
  33. lcdInit();
  34. PORTA=0;
  35. TRISA5=1;
  36. lcdString("Temperature:");
  37. double temp=0;
  38. char message[16];
  39. lcdCommand(0x0C);
  40. __delay_ms(1000);
  41. while(1){
  42. ADCON0bits.GO=1;
  43. while(ADCON0bits.GO==0);
  44. temp=((ADRESH<<8)+ADRESL);
  45. temp=100*(5.0*temp/1023);
  46. sprintf(message,"%3.2f%cC ",temp,223);
  47. lcdXY(1,2); lcdString(message);
  48. lcdXY(1,3); lcdString("On-Board LM35DZ");
  49. lcdXY(1,4); lcdString("Connects To RA5");
  50. __delay_ms(250);
  51. }
  52. return;
  53. }
  54.   

I use MPLABX IDE v6.15 and XC8 C compiler v2.36 free edition without code optimization. So it requires a lot of program memory space up to 91% due to C floating point and sprintf function usage.

PIC16F887 LM35 and LCD Interfacing Example Using XC8
MPLABX IDE v6.15 and XC8 v2.36 free edition resource usage

Proteus is popular for most of electronics hobbyist here but we have to pay for license.

PIC16F887 LM35 and LCD Interfacing Example Using XC8
Proteus Simulation

Click here to download its source file.

PIC16F887 LM35 and LCD Interfacing Example Using XC8
PIC16F887 Prototyping Board



320x50

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (57) AVR (58) CCS PICC (28) DAC (1) DHT11 (2) Display (106) Distance Sensor (3) DS18B20 (3) dsPIC (3) dsPIC30F1010 (3) dsPIC30F2010 (1) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (68) Interrupt (19) Keil (5) Keypad (10) LCD (48) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (73) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (10) PCD8544 (3) PCF8574 (5) PIC (108) PIC12F (3) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (12) PICKit2 (1) PWM (11) RTC (9) Sensor (11) SH1106 (1) Shift Register (11) Shift Registers (3) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (31) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)

tyro-728x90