Värmesökande skrivbord fläkt (med Arduino) (4 / 7 steg)
Steg 4: Kommunicera med temperaturgivare
Sammanfattning: Infraröd temperaturgivaren är en I2C komponent. Detta betyder bara ringer på några kommandon från Arduino "Tråd" biblioteket att få uppgifter, men tyvärr, denna temperatursensor krävs normalt att vissa särskilda timing justeringar som inte är möjligt med hjälp av tråd biblioteket. Koden jag använder innebär att en anpassad "i2cmaster" library, som du måste importera enligt följande steg. Göra några ytterligare forskning om du har svårt att hitta mappen Bibliotek på din särskild OS.Källa: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1214872633
1) Importera anpassad "i2cmaster" biblioteket:
A) gå till:
Homepage.hispeed.ch/peterfleury/AVR-Software.html
och ladda ner i2cmaster.zip
Gör en mapp i / {arduino root} / hardware/bibliotek och extrahera den
i2cmaster.h och twimaster.c filer. Nu byta namn på filen .c av twimaster till .cpp (göra säker att byta namn på och sätta dessa filer i THE rätt dvs IN THE bibliotek mapp av THE ARDUINO LAGERSTÄLLEKOD)
Kontrollera att du startar om du laddar ett nytt bibliotek i den så den finns när den anropas.
B) nu måste du ändra twimaster.c
Öppna den i en enkel textredigerare och ändra följande om du använder en Arduino Uno
Redigera twimaster.c för att återspegla den 16MHz klockan och ändra buss frekvensen till 50Khz genom att ändra koden i början för att:
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
/ * I2C klockan i Hz * /
#define SCL_CLOCK 50000L
2) testning temperaturgivare:
Här är några test kod som utskrifter till följetongen övervaka temperaturen i Celsius till två siffror. Om det fungerar, har du din sensor hakas upp ordentligt och biblioteket importeras korrekt.
#include
void setup()
{
Serial.BEGIN(9600);
i2c_init(); Initialisera i2c bussen
PORTC = (1 << PORTC4) | (1 << PORTC5); //enable pullups
}
void loop()
{
int dev = 0x5A << 1;
int data_low = 0;
int data_high = 0;
int pec = 0;
i2c_start_wait(dev+I2C_WRITE);
i2c_write(0x07);
i2c_rep_start(dev+I2C_READ);
data_low = i2c_readAck(); Läst 1 byte och sedan skicka ack
data_high = i2c_readAck(); Läst 1 byte och sedan skicka ack
PEC = i2c_readNak();
i2c_stop();
Detta konverterar höga och låga byte tillsammans och processer temperatur, MSB är lite fel och ignoreras för temps
Double tempFactor = 0,02; 0,02 grader per LSB
Double tempData = 0x0000;
int frac;
Denna masker av fel lite i den höga byten, flyttar sedan lämnade 8 bitar och lägger till den låga byten.
tempData = (dubbelrum) (((data_high & 0x007F) << 8) + data_low);
tempData = (tempData * tempFactor)-0.01;
tempData = tempData - 273.15;
Serial.Print((int)tempData); Skriva ut temp i grader C till seriell
Serial.Print(".");
tempData = tempData-(int) tempData;
frac = tempData * 100;
Serial.println(frac);
Delay(500);
}