Étape 22 : capteurs ! Partie 4: Étalonnage (tout en boucles)
Pour résoudre ce problème, nous faisons ce qu’on appelle étalonnage ! Lorsque nous calibrons la photocellule, nous recherchons la valeur la plus élevée qu’il voit et la valeur la plus basse il voit et puis définissez le milieu entre ces deux valeurs. Nous allons pour calibrer la valeur pendant environ 5 secondes.
Pour ce faire, nous allons utiliser un certain nombre de figures différentes !
Tout d’abord, nous allons en savoir plus sur le temps. L’Arduino garde trace de combien de temps il a été depuis l’Arduino a été mis en marche. Nous pouvons regarder quoi de cette valeur.
Vous pouvez le faire en utilisant le
millis
fonction.Un exemple de cela est :
unsigned long current_time = millis();
où je stocke la valeur du temps dans la variablecurrent_time
.
Ce qui est un unsigned long
? A long
est comme un entier, mais plus gros ! Une longue passe de-2,147,483,648 à 2 147 483 647. Le mot unsigned
signifie qu’au lieu d’aller de-2,147,483,648 à 2 147 483 647, il va de 0 à 4 294 967 295. Étant donné que le temps n’est jamais négatif, nous utilisons un unsigned
pour elle !
Plus de détails ici : http://arduino.cc/en/Reference/Long
et ici : http://arduino.cc/en/Reference/UnsignedLong
Ensuite nous allons utiliser ce qu’on appelle un while
boucle ! A while
boucle ressemble à un if
déclaration, tandis que la condition prévue est true
, il s’exécute. La différence entre un if
déclaration et une while
instruction est que le while
déclaration continue l’exécution jusqu'à ce que la condition est false
--tout comme la façon dont le loop
fonction s’exécute jusqu'à ce que vous éteignez votre Arduino. Assurez-vous que votre end_time est également est un unsigned long.
Un exemple de cela est :
while(current_time < end_time)
{
// do something
// now update the current time
current_time = millis();
}
Le code que vous mettez dans la zone de « faire quelque chose » va continuer jusqu'à ce que le temps va passé end_time
Après cela, ce que nous devons faire est de rechercher les plus élevés et les valeurs les plus basses qui voit la photocellule et stocker ces valeurs.
Vous pouvez le faire par la valeur élevée à démarrer d’abord
0
et la faible valeur à1023
.
sensor_low = 1023;
sensor_high = 0;
Ensuite, chaque fois que nous passons par le tout en boucle, nous allons étudier pour voir si la valeur de la sonde est inférieure à la valeur la plus basse on voit, dans l’affirmative, étant donné que cette nouvelle valeur est inférieure, nous allons définir la valeur faible à celle plutôt.
Un exemple de cela est :
if(sensor_value < sensor_low)
{
sensor_low = sensor_value
}De même avec la valeur haute, si le capteur voit une valeur plus élevée, nous allons affectez-lui la valeur plus élevée !
Un exemple de cela est :
if(sensor_value > sensor_high)
{
sensor_high = sensor_value
}
Après les 5 secondes de calibrage, nous aller de l’avant et la valeur sensor_mid à la moyenne des valeurs basses et élevées.
Maintenant essayez vous-même :
int SENSOR_PIN=A0;
int sensor_mid = 511;
int GREEN = 2;
int YELLOW = 7;
int RED = 12;
int STREET_LIGHTS = 13;voidsetup()
{
pinMode(GREEN, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(RED, OUTPUT);
pinMode(STREET_LIGHTS, OUTPUT);calibrate();
}voidloop()
{
int sensor_value = analogRead(SENSOR_PIN);
Serial.println(sensor_value);if(sensor_value < sensor_mid)
{
green_light();
}
else
{
red_light();
}
}void calibrate()
{
int sensor_high = 0;
int sensor_low = 1023;
int current_time = millis();
int end_time = current_time + 5000;
// we have to calibrate this in the first five seconds
while (current_time < end_time)
{
// now update the current time
current_time = millis();
// update sensor value here!
// your code here
// record the minimum sensor value
if (sensor_value < sensor_low)
{
//your code here
}// record the maximum sensor value
if//your code here
{
sensor_high = sensor_value;
}
}
//set mid to be the MIDDLE! :)
sensor_mid = (sensor_high + sensor_low)/2;
}void all_LEDs_off()
{
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(RED, LOW);
digitalWrite(STREET_LIGHTS, LOW);}
void green_light()
{
all_LEDs_off();
digitalWrite(GREEN, HIGH);
}void yellow_light()
{
all_LEDs_off();
digitalWrite(YELLOW, HIGH);
}void red_light()
{
all_LEDs_off();
digitalWrite(RED, HIGH);
digitalWrite(STREET_LIGHTS, HIGH);
}