Värmesökande skrivbord fläkt (med Arduino) (5 / 7 steg)
Steg 5: Koden
Sammanfattning: Timmar av hårt arbete och frustration kondenseras till en enda textfil. Detta är den sista (mestadels) arbetar skiss, speciellt med en Arduino Uno i åtanke.servoSweep() styr den scan och datalagring
tempRead() omfattar alla i2c dumheter och hämtar de data från temperaturgivare
findHot() returnerar servo till position med den hetaste temperaturen
Detta är mitt första försök på kodning Arduino, så om jag har gjort saker egregiously alltför komplicerad eller klumpig, Känn dig fri att låta mig veta. Den första iterationen fungerar bra, men efter det Servo och i2cmaster bibliotek konflikten och servo går en lite nötter. Om någon löser det, kontakta mig och jag ska uppdatera koden.
** TrackFan ** / /
Kod och koncept av ePums
tempRead koden av Dave Eaton och SensorJunkie
#include < Servo.h >
#include < i2cmaster.h >
Servo mrservo;
int j = 0;
int pos;
int posVals [] = {
0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120
};
dubbel tempVals [12].
int hotPos;
void tempRead() {
Definiera funktion för att läsa temperaturen från IR-sensorn.
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;
tempVals [j] = tempData;
j + = 1;
}
void servoSweep() {
Serial.println ("servoSweep initiera!");
j = 0;
POS = 0;
återställa pos och temp-index
Delay(500);
Serial.println("positions:");
återgå servo till första position
för (pos = 0; pos < 130; pos + = 10)
{
mrservo.write(POS);
flytta servo 10 grader
Delay(200);
låta sensorn att bosätta sig
tempRead();
Serial.println(POS);
läsa och lagra temporära data
Delay(300);
}
}
void findHot() {
Serial.println ("findHot startat!");
hitta högsta temperatur, flytta servo till motsvarande position
int jag = 0;
lokala sökindexet
int q = 0;
Double hotTemp = tempVals [0];
den positionsdata som associeras med den högsta temperaturen i en given sopa
för (jag = 0; jag < 13; jag + = 1) {
om (tempVals [i] > = hotTemp) {
hotTemp = tempVals [i];
Serial.Print ("#" + String(i) + "hot Temp:");
Serial.println(hotTemp);
Delay(50);
q = i.
Hämta index för högsta temp värde i tempVals matris
}
}
hotPos = posVals [q];
Serial.println ("hotPos:");
Serial.Print(hotPos);
Hämta motsvarande pos värdet från posVals index
om (mrservo.attached()) {
Serial.println ("detta läser utdata just nu");
}
Delay(1000);
mrservo.detach();
mrservo.attach(3);
mrservo.write(hotPos);
Delay(1000);
flytta servo
Serial.println ("återvänder till hotPos");
** FÖRDRÖJNING MELLAN SKANNINGAR ** / / /
Delay(10000);
Jag = 0;
}
void setup() {
Serial.BEGIN(9600);
i2c_init();
PORTC = (1 << PORTC4) | (1 << PORTC5);
}
void loop() {
mrservo.attach(3);
Delay(1000);
mrservo.write(0);
i2c_init();
servoSweep();
Serial.println("temperatures!");
för (int n = 0; n < 13; + n = 1) {
Serial.println(tempVals[n]);
Delay(50);
}
findHot();
mrservo.detach();
Delay(2000);
}