Stap 5: De Code
Samenvatting: Uren van hard werk en frustratie gecondenseerd tot een enkel tekstbestand. Dit is de laatste (meestal) werkt schets, geschreven specifiek met een Arduino Uno in het achterhoofd.servoSweep() bepaalt de scan en data-opslag
tempRead() bevat alle de i2c onzin en haalt de gegevens uit de temperatuursensor
findHot() keert terug van de servo naar de positie met de heetste temperatuur
Dit is mijn eerste poging om de codering van de Arduino, dus als ik heb dingen flagrant gecompliceerd of onhandig, voel je vrij om te laten me weten. De eerste iteratie werkt groot, maar na dat de Servo en i2cmaster bibliotheken conflict en de servo gaat een kleine noten. Als iedereen het oplost, contact met mij en ik zal het bijwerken van de code.
** TrackFan ** / /
Code en concept van ePums
de code van de tempRead door Dave Eaton en 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
};
dubbele tempVals [12];
int hotPos;
ongeldig tempRead() {}
Functie voor het lezen van de temperatuur van de IR-Sensor definiëren.
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;
tempVals [j] = tempData;
j += 1;
}
ongeldig servoSweep() {}
Serial.println ("servoSweep initialiseren!");
j = 0;
POS = 0;
Reset pos en temp indices
delay(500);
Serial.println("positions:");
servo eerste positie herstellen
voor (pos = 0; pos < 130; pos += 10)
{
mrservo.write(POS);
bewegen servo 10 graden
delay(200);
toestaan van de sensor te regelen
tempRead();
Serial.println(POS);
lezen en temp gegevensopslag
delay(300);
}
}
ongeldig findHot() {}
Serial.println ("findHot begonnen!");
vinden van de hoogste temperatuur, servo naar overeenkomstige positie verplaatsen
int i = 0;
lokale zoekindex
int q = 0;
dubbele hotTemp = tempVals [0];
de positiegegevens die is gekoppeld aan de hoogste temperatuur in een bepaalde sweep
voor (ik = 0; ik < 13; ik += 1) {}
Als (tempVals [i] > = hotTemp) {}
hotTemp = tempVals [i];
Serial.Print ("#" + String(i) + "hot Temp:");
Serial.println(hotTemp);
delay(50);
q = i;
index voor hoogste temp waarde in tempVals matrix ophalen
}
}
hotPos = posVals [q];
Serial.println ("hotPos:");
Serial.Print(hotPos);
de overeenkomstige waarde van pos uit posVals index ophalen
Als (mrservo.attached()) {}
Serial.println ("Dit is het lezen output right now");
}
delay(1000);
mrservo.Detach();
mrservo.attach(3);
mrservo.write(hotPos);
delay(1000);
verplaatsen van de servo
Serial.println ("terugkerende te hotPos");
** VERTRAGING TUSSEN SCANS ** / / /
delay(10000);
Ik = 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!");
voor (int n = 0; n < 13; n += 1) {}
Serial.println(tempVals[n]);
delay(50);
}
findHot();
mrservo.Detach();
delay(2000);
}