Bonjour,
Je cherche à réaliser une imitation de 'panneau solaire' à l'aide d'un servomoteur et d'un capteur de luminosité. Pour cela je dois m'aider des deux montages d'un livret dont je joins les photos. Le but étant de faire varier la position du servomoteur selon la luminosité avec une position à 0° pour la plus petite luminosité et une position à 180° pour la plus forte luminosité.
J'ai tenté de combiner les codes des deux montages et j'ai donc écrit le code suivant. Avec ce code la partie LED fonctionne (moins il y a de luminosité, plus il y a de LED allumées). Le problème est que le servomoteur ne bouge pas et je n'arrive pas à savoir ce qui ne va pas dans le code, alors si vous avez une petite idée pour m'aider
#include <Servo.h> //importation de la librairie Servo
Servo monservo; // création de l'objet 'monservo'
const int LED1=4; // déclaration des broches
const int LED2=5;
const int LED3=6;
const int LED4=7;
const int LED5=8;
const int LDR=A0;
int valeur;
int valeurcal = 0;
int val;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
monservo.attach(3); //indication de la broche de raccord du servomoteur
}
void loop() {
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
valeur = analogRead(LDR); //on lit la valeur du capteur de lumière
valeurcal = map(valeur, 10, 295, 0, 1000); //on ajuste l'échelle
val = map(valeurcal, 0, 1000, 0, 180);
monservo.write(val); // on envoie la valeur en degrés sur le servomoteur
if (valeurcal < 800) {digitalWrite(LED2, HIGH);} //on allume les led en fonction de la luminosité
if (valeurcal < 600) {digitalWrite(LED3, HIGH);}
if (valeurcal < 400) {digitalWrite(LED4, HIGH);}
if (valeurcal < 200) {digitalWrite(LED5, HIGH);}
delay(30);
}
Quel position demande tu as ton servos ?
C'est normal que tu fasse deux mises à l'échelle consécutive, les deux mises à l'échelle ne devrait pas être indépendante l'une de l'autre?
Je n'ai pas demandé de position en particulier, dans les montages à partir desquels je dois écrire le code je n'ai pas trouvé de texte le permettant, ou alors je suis passée à côté...
Pour les mises à l'échelle, la première me permet de faire fonctionner les LED selon la luminosité mais finalement je ne suis pas sûre que la deuxième soit vraiment nécessaire. Elle était censé ajuster l'échelle pour avoir un angle entre 0 et 180° mais je ne pense pas que ça puisse fonctionner car ce n'est pas le même type de variable. Et elle ne sera, je pense, pas nécessaire si j'arrive à demander une position au servomoteur d'une autre façon.
Tu ajoutes Serial.begin(115200); dans setup() et un print de val juste avant le write du servo et tu verra, dans le moniteur (à 115200), quelle valeur tu envoies au servo
Serial.println(val);
monservo.write(val); // on envoie la valeur en degrés sur le servomoteur
valeur = analogRead(LDR); //on lit la valeur du capteur de lumière
val = map(valeur, 10, 295, 0, 180);
monservo.write(val); // on envoie la valeur en degrés sur le servomoteur
Merci pour vos réponses ! J'ai finalement résolu le problème qui venait, en fait, de mon montage (il me manquait un câble de connexion pour le servomoteur)