ATtiny45 PCF8574 LCD DS18B20 show temparature only







code:

#include <OneWire.h>
#include <TinyWireM.h>                  // I2C Master lib for ATTinys which use USI
#define PCF8574_ID 0x20                 //slave address (PCF8574):[0][1][0][0][A2][A1][A0][R/W]
#define ATcommand 0x20                  //LCD command   EN=1 ; RS=0       0010  0000
#define ATdata 0x30                     //LCD data      EN=1 ; RS=1       0011  0000

OneWire  ds(3);  // on pin 10
void PCF8574_Write(unsigned char data)
{
  TinyWireM.beginTransmission(PCF8574_ID);
  TinyWireM.send(data);                 // Access Command Register
  TinyWireM.endTransmission();          // Send to the slave
  //delayMicroseconds(16); //  minimun~16-20
}
void Write_LCD_Byte(char command_data ,int value) //bool lcd_command ,
{
  int iMSB=0;
  int iLSB=0;
  iMSB = (value & 0xF0)>>4;
  iLSB = (value & 0x0F);
  PCF8574_Write(command_data|iMSB);//0xFF
  //delayMicroseconds(1);
  PCF8574_Write(0x00|iMSB);
  PCF8574_Write(command_data|iLSB);
  //delayMicroseconds(1);
  PCF8574_Write(0x00|iLSB);
  delay(1);
}
void initial_LCD(void)
{
  //delay(50);//ให้รออย่างน้อย 15ms
  PCF8574_Write(0x00);//ให้ขา E = 0 ให้ขา RS= 0 กำหนดเป็นคำสั่ง  ให้ขา R/W = 0 เขียนข้อมูล
  ///delay(50);
  //ส่งข้อมูลค่ำสั่ง Function Set 3 ครั้ง  ข้อมูล D4-D7 จะถูกส่งไปที่ bus
  PCF8574_Write(0x23);      //1    0x20 + 0x03
  //delayMicroseconds(1);
  PCF8574_Write(0x03);
  //delay(5);                //wait 4ms
  PCF8574_Write(0x23);     //2
  //delayMicroseconds(1);
  PCF8574_Write(0x03);
  //delayMicroseconds(100);  //wait 100us
  PCF8574_Write(0x23);     //3
  //delayMicroseconds(1);
  PCF8574_Write(0x03);
  //end
  //กำหนดการทำงานของ LCD ให้เป็น 4 bit 0010xxxx
  PCF8574_Write(0x22);//Function Set (BIT5=1) [001DNF00 ],Sets buss size 4bit (D=0)ข้อมูลเฉพาะ D4-D7 จะถูกส่งออกไปที่บัส
  //delayMicroseconds(1);
  PCF8574_Write(0x02);
  //end เมื่อเป็น 4 bit ต้องส่งข้อมูลคำสั่งสองครั้งๆ ละ 4 bit
  //Function Set (BIT5=1)  0x28  กำหนด ขนาดข้อมูล,จำนวนบรรทัด, ขนาดตัวอักษร
  Write_LCD_Byte(ATcommand,0x28);// 00101000 : [001DNF00 ],Sets buss size 4bit (D=0),number of lines=2 (N=1),font size =5x7(F=0)
  //Display/Cursor (BIT3=1)  0x0C กำหนดการแสดงผล, เคอร์เซอร์
  Write_LCD_Byte(ATcommand,0x0C);//00001100 : [00001DUB] ,Display On (D=1),Cursor Off (U=0) ,blinking block cursor Off (B=0)
  //Entry Mode Set (BIT2=1) 0x06 โหมดการป้อนข้อมูล
  Write_LCD_Byte(ATcommand,0x06);//00000110 : [000001MS] , Cursor direction right (M=1);no scroll (S=0)
  //0x01 clear screen
  Write_LCD_Byte(ATcommand,0x01);
  //0x0F cursor on
  //Write_LCD_Byte(ATcommand,0x0F);
}
//--------------------------end LCD library---------------------
void setup()
{
  TinyWireM.begin();                    // initialize I2C lib
  initial_LCD();                        //initial LCD
}

void loop(void) {
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  char* int_string;
  float celsius, fahrenheit;

  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    //return;
  }
  // the first ROM byte indicates which chip
  if(addr[0]==0x10)type_s = 1;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);  
  ds.write(0xBE);         // Read Scratchpad

  for (int i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  celsius =(   ((float)data[0]/2)  - ( 0.25 + ( ((float)data[7]-(float)data[6]) / (float)data[7] ) )  );

  Write_LCD_Byte(ATcommand,0x80|0x00);// line 1 เริ่มตำแหน่ง 00
  Write_LCD_Byte(ATdata,'T');
  Write_LCD_Byte(ATdata,'e');
  Write_LCD_Byte(ATdata,'m');
  Write_LCD_Byte(ATdata,'p');
  Write_LCD_Byte(ATdata,' ');
  Write_LCD_Byte(ATdata,'=');
  Write_LCD_Byte(ATdata,' ');

  Write_LCD_Byte(ATdata,((int)celsius/10)|0x30);
  Write_LCD_Byte(ATdata,((int)celsius%10)|0x30);

  Write_LCD_Byte(ATdata,'.');

  Write_LCD_Byte(ATdata,((int)(celsius*10)%10)|0x30);
  Write_LCD_Byte(ATdata,((int)(celsius*100)%10)|0x30);

  Write_LCD_Byte(ATdata,' ');
  Write_LCD_Byte(ATdata,0xDF);
  Write_LCD_Byte(ATdata,'C');

}