Stap 4: Communicatie met de temperatuursensor
Samenvatting: De infrarood temperatuursensor is een I2C-component. Normaal gesproken vereist alleen daardoor opgeroepen een paar commando's uit de Arduino "Draad" bibliotheek te krijgen van de gegevens, maar helaas, deze temperatuursensor enkele specifieke timing aanpassingen die niet mogelijk met behulp van de draad bibliotheek. De code die ik gebruik impliceert een bibliotheek van aangepaste "i2cmaster", die u moet importeren volgens de volgende stappen uit. Doe wat meer onderzoek als u problemen ondervindt bij het vinden van de omslag van de bibliotheken op uw specifieke OS.Bron: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1214872633
1) importeren de aangepaste "i2cmaster"-bibliotheek:
A) Ga naar:
Homepage.Hispeed.ch/peterfleury/AVR-software.html
en download de i2cmaster.zip
Maak een map in / {arduino root} / hardware/bibliotheken en haal de
i2cmaster.h en twimaster.c bestanden. Hernoem nu het .c bestand van twimaster naar .cpp (maken zeker te hernoemen en zet deze bestanden IN de recht D.W.Z. IN de Bibliotheken map van THE ARDUINO vestiging)
Zorg ervoor dat u opnieuw opstart als u een nieuwe bibliotheek in het laadt zodat het kan worden gevonden wanneer deze wordt aangeroepen.
B) nu moet je twimaster.c wijzigen
Open de tabel in een eenvoudige tekst-editor en verander het volgende als u van een Arduino Uno gebruikmaakt
De twimaster.c zodat de 16MHz klok bewerken en wijzigt u de frequentie van de bus tot 50Khz door het veranderen van de code aan het begin aan:
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
/ * I2C klok in Hz * /
#define SCL_CLOCK 50000L
2) test de temperatuursensor:
Hier is sommige test code welke prenten aan de serial monitor de temperatuur in Celsius tot twee-cijfers. Als het werkt, hebt u uw sensor goed vastgehaakt en de bibliotheek correct geïmporteerd.
#include
VOID Setup
{
Serial.begin(9600);
i2c_init(); Initialiseren van de i2c-bus
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(); Lezen van 1 byte en vervolgens verzenden ack
data_high = i2c_readAck(); Lezen van 1 byte en vervolgens verzenden ack
PEC = i2c_readNak();
i2c_stop();
Zo converteert u hoge en lage bytes samen en temperatuur verwerkt, MSB is een beetje fout en wordt genegeerd voor temps
dubbele tempFactor = 0,02; 0,02 graden per LSB
dubbele tempData = 0x0000;
int de frac;
Vervolgens wordt deze maskers uit de bits van de fout van de hoge byte, verplaatst het 8 bits links en voegt de lage byte.
tempData = (Tweepersoons) (((data_high & 0x007F) << 8) + data_low);
tempData = (tempData * tempFactor)-0.01;
tempData = tempData - 273.15;
Serial.Print((int)tempData); Temp in graden C naar seriële afdrukken
Serial.Print(".");
tempData = tempData-(int) tempData;
FRAC = tempData * 100;
Serial.println(FRAC);
delay(500);
}