Étape 5: Le Code
Résumé : Heures de travail acharné et de frustration condensent dans un fichier texte simple. Il s’agit de la finale travaillant (principalement) esquisse, écrit spécifiquement avec un Arduino Uno à l’esprit.servoSweep() contrôle le stockage de données et analyse
tempRead() inclut toutes les absurdités i2c et récupère les données de la sonde de température
findHot() retourne le servo à la position avec la température la plus élevée
C’est ma première tentative de codification Arduino, alors si j’ai fait des choses manifestement trop compliquées ou maladroit, n’hésitez pas à me le faire savoir. La première itération fonctionne très bien, mais après que le conflit de bibliothèques Servo et i2cmaster et le servo va un peu noix. Si n’importe qui le résout, contactez-moi et je mettrai à jour le code.
** TrackFan ** / /
Code et concept par ePums
code de tempRead par Dave Eaton et 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
};
double tempVals [12] ;
int hotPos ;
void tempRead() {}
Définir la fonction pour la lecture de la température du capteur IR.
dev int = 0x5A << 1 ;
int data_low = 0 ;
int data_high = 0 ;
pec int = 0 ;
i2c_start_wait(dev+I2C_WRITE) ;
i2c_write(0x07) ;
i2c_rep_start(dev+I2C_READ) ;
data_low = i2c_readAck() ; Lu 1 octet et ensuite envoyer ack
data_high = i2c_readAck() ; Lu 1 octet et ensuite envoyer ack
PEC = i2c_readNak() ;
i2c_stop() ;
Ceci convertit haute et basse octets ensemble et traite les température, MSB est un peu d’erreur et est ignoré pour les temps
double tempFactor = 0,02 ; 0,02 degrés par LSB
double tempData = 0 x 0000 ;
int frac ;
Ce masque au large de l’erreur de bit de l’octet haut, se déplace alors il a laissé 8 bits et ajoute l’octet de poids faible.
tempData = (double) (((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 initialize!") ;
j = 0 ;
POS = 0 ;
pos de réinitialisation et indices de temp
Delay(500) ;
Serial.println("positions:") ;
revenir en position initiale servo
pour (pos = 0; pos < 130; pos += 10)
{
mrservo.Write(POS) ;
déplacer le servo 10 degrés
Delay(200) ;
permettre à capteur à régler
tempRead() ;
Serial.println(POS) ;
lire et stocker des données temporaires
Delay(300) ;
}
}
void findHot() {}
Serial.println ("findHot a commencé!") ;
trouver la température la plus élevée, déplacer le servo à la position correspondante
int i = 0 ;
index de recherche locale
q int = 0 ;
double hotTemp = tempVals [0] ;
les données de position associées à la température la plus élevée dans un champ donné
pour (i = 0; j’ai < 13 ; j’ai += 1) {}
Si (tempVals [i] > = hotTemp) {}
hotTemp = tempVals [i] ;
Serial.Print (« # » + String(i) + "chaud Temp:") ;
Serial.println(hotTemp) ;
Delay(50) ;
q = i ;
récupérer l’index pour la plus haute valeur temp dans tempVals tableau
}
}
hotPos = posVals [q] ;
Serial.println ("hotPos:") ;
Serial.Print(hotPos) ;
récupérer la valeur correspondante de pos de posVals index
Si (mrservo.attached()) {}
Serial.println ("c’est la lecture sortie dès maintenant") ;
}
Delay(1000) ;
mrservo.Detach() ;
mrservo.Attach(3) ;
mrservo.Write(hotPos) ;
Delay(1000) ;
déplacer le servo
Serial.println ("Returning to hotPos") ;
** DÉLAI ENTRE SCANS ** / / /
Delay(10000) ;
i = 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!") ;
pour (int n = 0; n < 13; n = 1) {}
Serial.println(tempVals[n]) ;
Delay(50) ;
}
findHot() ;
mrservo.Detach() ;
Delay(2000) ;
}