#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');
}