Le traqueur de soleil KS0530
On le trouve sur AliExpress ici.
Dans les kits qui sont un peu moins chers, il ne manque juste que quelques câbles et la batterie de lithium de 3,7 V. Impossible de trouver le schéma de cette carte sur internet et cela est bien regrettable.
-1- Installez le logiciel Arduino v2.1.1 puis mettre l’interrupteur de la carte sur le +5 V.
Brancher uniquement l'USB (câble bleu) à votre carte arduino uno de keyestudio à votre port USB 3 (ou USB 2) de votre ordinateur.
Quelques instants après voici le périphérique USB -> Arduino Uno (COM4).
OK votre driver USB installé fonctionne bien.
Le COM4 ou bien un autre COMxx, cela est défini au démarrage de votre ordinateur.
Si vous avez un port série RS232 à 9 broches, lui il sera d'office en COM1.
C'est le cas pour cet ordinateur qui possède un RS232.
Si oui, votre carte serait bien reconnue et sélectionnez là (carte arduino).
OK pour le logiciel qui est gratuit. Vous pouvez aussi utiliser flowcode v6 pour programmer votre carte arduino uno r3.
La première fois vous brancher uniquement le câble bleu USB entre la carte Arduino UNO vers l'USB 3 de votre ordinateur sans aucune autre connexion, une Led rouge s'allume et la Led rouge D3 clignote -> OK votre carte Arduino est bonne.
Il y a même déjà moyen d'envoyer (Téléverser) un programme dans votre carte Arduino UNO.
Ouvrir le logiciel pour arduino et tapez-y ce code pour éteindre la Led rouge qui clignote. Puis clic gauche sur Croquis et ensuite sur Vérifier/Compiler et si le tableau qui apparaît en bas reste noir tout est bon. Reste plus qu'à Téléverser et à attendre un peu.
Ligne 1, 2, 3 annoncent que l'on va utiliser D13 en sortie.
Ligne 5, 6, 7 annoncent une boucle sans fin, qui va éteindre la Led rouge D13 de la carte Arduino UNO.
Ligne 1, 2, 3 annoncent que l'on va utiliser D13 en sortie.
Ligne 5, 6, 7 annoncent une boucle sans fin, qui va allumer la Led rouge D13 de la carte Arduino UNO.
Remarque cette carte n'est pas exactement identique à l'Arduino UNO R3 SMD le régulateur de la tension d'entrée est un MPS213 de 2 A alors que sur la vraie carte Arduino UNO R3, il y a un régulateur 1117 M5 de 1A.
Elle est plus pratique pour commander des servos moteurs.
On pourrait faire le même travail avec la vraie carte Arduino UNO R3 en rajoutant des transistors aux périphériques.
Il y a un mini bouton poussoir pour le reset et aussi un interrupteur pour 3,3 v ou pour le 5 V.
La plupart des fils sont en groupes de trois fils, le noir, le rouge et le jaune.
Le fil noir va sur une borne bleue, le fil rouge va sur une borne rouge et le fil jaune va sur une borne jaune.
Les 2 servos moteurs bleus ont un groupe de trois fils, le brun, le rouge et le jaune.
Le fil brun va sur une borne bleue, le fil rouge va sur une borne rouge et le fil jaune va sur une borne jaune. Le servos moteur inférieur va sur D9 et l'autre sur D10.
Le connecteur LCD 1602 possède 4 bornes, un fil noir, un fil rouge, un fil bleu et un fil vert, et à l'autre extrémité, il y a 4 broches femelles qui vont à la carte arduino, le noir va sur la borne bleu A4, le rouge va sur la borne rouge A4, le fil bleu va sur la borne jaune A4 et le fil vert va sur la borne jaune A5.
Il se compose de capteurs de lumière ambiante, d'un panneau solaire, d'un module de charge batterie, d'un capteur de température et d'humidité, d'un buzzer, d'un écran LCD1602 et il est facile à construire.
Sur le panneau photovoltaïque, il y a un BH1750 FVI capteur d'intensité lumineuse avec 4 bornes, l'une est verte, l'autre est bleue, puis, rouge et encore rouge, ils vont à côté de A5 vers les 4 bornes bleues (26).
Il y a 11 projets d'étude.
Attention, sur votre kit la carte est tournée de 180° d'angle.
Attention, aux câbles des servos moteurs, ils peuvent tourner et être bloqués par la longueur de leur propre câble.
Les deux plus grandes plaques noires sont protégées par un film en papier afin d'éviter les griffes sur ses deux plaques à trous.
Insérer les 4 plaques en bois perpendiculairement à la plaque noire, c'est assez dur.
En général les connecteurs ont une borne G pour le fil noir de la masse, une borne V pour fil rouge pour +vcc et une borne s de fil jaune pour le signal série qui commande.
Le montage mécanique est terminé !
Il reste à connecter les fils.
DHT11 -> Capteur de température et d'humidité
Alimentation, le voltage: +5 V
Plage de température: de 0-50 ℃ à ± 2 ℃ près.
Humidité: de 20-90% RH ± 5% RH près.
Interface: digital port I²C. Réponse de 6 s à 30 sec.
Le bouton poussoir jaune.
Photorésistance.
Celle qui est au-dessus du LCD -> A3
Celle qui est au-dessus de la batterie -> A1
Celle qui est au-dessus de la carte arduino -> A2
Celle qui est au-dessus de la carte mini-usb -> A0
Le chargeur de batterie
Si l'interrupteur est OFF (0) le soleil va charger la batterie et si le mini-USB est raccordé, lui aussi chargera la batterie au lithium de 3,7 v.
Pour le réglage des +5 V en sortie, déconnecter le mini USB et mettre du +6,5 V à la place du panneau photovoltaïque et régler la résistance R7 pour avoir +5 V à la sortie VDD5 qui va à l'Arduino UNO r3.
Le B628 est une alimentation à hachure qui charge le condensateur C7 afin d'avoir du +5 V sur C7 alors que son entrée venant de la batterie est de +3,7 V.
Le B628 remonte la tension à +5 V.
Carte de détection intensité lumineuse BH1750 -> 16 bits et i²C
Il ne reste plus qu'à apprendre le code C pour utiliser le programme d'Arduino.
L'avantage du C est que l'on trouve beaucoup des morceaux de programme tout fait.
Vous pouvez utiliser chatGPT (L'IA) pour lui demander de faire un programme pour votre Arduino UNO R3.
Je parle en français et tu me répondras en français.
Il faut utiliser un Arduino UNO R3 SMD.
Tu me fais un programme Arduino pour allumer la led D13 de cette carte.
Si vous faites des fautes orthographiques L'IA corrigera les fautes.
On peut aussi dicter les phrases avec un micro.
Attention beaucoup de gens raccordent le connecteur LCD à l'envers cela ne cause pas de dommage, mais alors il ne sait pas fonctionner.
La librairie pour l' I²C est natif dans Arduino IDE v2.2.1
La librairie pour le LCD I²C Frank de Brabander la v1.1.2.
Librairie du capteur de lumière I2C BH1750 de Cristopher Laws la v1.3.0.
La librairie DHT11 est à placer dans le répertoire Documents\Arduino\libraries\Dht11 la v0.4.1 fourni pas keyestudio
// le pin 2 d’entrée pour le bouton jaune
// le pin 3 de sortie pour la diode LED
// le pin 6 de sortie pour le buzzer
// le pin 7 de sortie pour le DHT11
// le pin de sortie du servomoteur rotation gauche et droite est le n 9
// le pin de sortie du servomoteur haut et bas est le n 10
// le pin A0 entrée analogique pour la photorésistance situé à gauche
// le pin A1 entrée analogique pour la photorésistance situé à droite
// le pin A2 entrée analogique pour la photorésistance situé côté de la carte
// Keyestudio UNO
// le pin A3 entrée analogique pour la photorésistance côté LCD
// le pin A4 (SDA) et A5 (SCL) pour le LCD I2C
// le pin A6 bleu avec (SDA) et A5 (SCL) pour le intensité lumineuse BH1750 I2C
convertisseur analogique vers digital de 10 bit sa plage est de 1 lux à 65535 lux
/*
Keyestudio UNO suiveur solaire
lesson 11
http://www.keyestudio.com
*/
#include <Wire.h> // Librairie de l’I2C elle est natif dans la version Arduino ide v2.2.1 ou Adafruit NeoPixel v1.12.0
#include <LiquidCrystal_I2C.h> // Librairie du LCD I2C Frank de Brabander v1.1.2
LiquidCrystal_I2C lcd(0x27, 16, 2); // Type de LCD de 2 rangées à 16 caractères à l'adresse hexadécimal 27
#include <BH1750.h> // Librairie du capteur de lumière I2C de Cristopher Laws v1.3.0
BH1750 lightMeter; // Initialisation du capteur de lumière
#include <dht11.h> // Librairie du capteur de température et d'humidité DHT11 v0.4.1
dht11 DHT; // Initialisation du capteur de température et d'humidité DHT11
#define DHT11_PIN 7 // Défini le DHT11 à la pin 7
#include <Servo.h> // Librairie des servomoteurs
Servo lr_servo; // Défini le nom du servomoteur de rotation droite et gauche
Servo ud_servo; // Défini le nom du servomoteur bas et haut
const byte interruptPin = 2; // définir la pin du bouton pour l’interruption
int lr_angle = 90; // Initialise l'angle de 90 degrés
int ud_angle = 10; // Initialise l'angle de 10 degrés; maintenir le panneau solaire vertical pour détecter la lumière la plus intense.
int l_state = A0; // Défini la borne de voltage analogique d'entrée pour la photorésistance de gauche
int r_state = A1; // Défini la borne de voltage analogique d'entrée pour la photorésistance de droite
int u_state = A2; // Défini la borne de voltage analogique d'entrée pour la photorésistance de l'arrière
int d_state = A3; // Défini la borne de voltage analogique d'entrée pour la photorésistance de l'avant
const byte buzzer = 6; // Donne la valeur entière 6 à la variable fixe buzzer pour la sortie du pin n 6
const byte lr_servopin = 9; // Donne la valeur entière 9 à la variable fixe lr_servopin pour le pin n 9 SCL servomoteur de rotation
const byte ud_servopin = 10; // Donne la valeur entière 10 à la variable fixe up_servopin pour le pin n 10 SCL servomoteur haut et bas
unsigned int light; // light est une variable entière sans signe pour le capteur de luminosité BH1750
byte error = 15; // Défini la variable error avec l'entier 15 afin d'éviter les vibrations
byte m_speed = 10; // Défini la variable m_speed avec l'entier 10 pour la durée (vitesse)
byte resolution = 1; // Donne la valeur entière 1 à la variable resolution qui sera l'angle minimum de rotation du servomoteur
int temperature; // temperature est une variable entière
int humidity; // humidity est une variable entière
void setup()
{
Serial.begin(9600); // Défini la vitesse du mode série
// Initialise le I2C bus pour la librairie BH1750
Wire.begin(); // Initialise le bus I2C
lightMeter.begin(); // Initialise le capteur BH1750
lr_servo.attach(lr_servopin); // donne le pin du servomoteur (9) de rotation gauche et droite
ud_servo.attach(ud_servopin); // donne le pin du servomoteur (10) du haut et du bas
pinMode(l_state, INPUT); // on lit les entrées analogique des photorésistances (A0)
pinMode(r_state, INPUT); // on lit les entrées analogique des photorésistances (A1)
pinMode(u_state, INPUT); // on lit les entrées analogique des photorésistances (A2)
pinMode(d_state, INPUT); // on lit les entrées analogique des photorésistances (A3)
pinMode(interruptPin, INPUT_PULLUP); // la pin d’entrée du bouton est définie en mode pull-up
attachInterrupt(digitalPinToInterrupt(interruptPin), adjust_resolution, FALLING); // le type de déclenchement externe est sur le front descendant; ajuster la résolution en fonction du service d’interruption ISR
lcd.init(); // Initialise le LCD
lcd.init(); // Initialise le LCD
lcd.backlight(); //allumer le rétro éclairage du LCD
lr_servo.write(lr_angle); // revenir à l’angle initial gauche et droite
delay(1000); // delai de 1 s
ud_servo.write(ud_angle); // on fait tourner le servomoteur à 10 degrés vers le haut
delay(1000); // delai de 1 s
}
void loop()
// commence la boucle à l’infini
{
ServoAction(); // Le servo effectue l’action
read_light(); // Lire l’intensité lumineuse du capteur BH1750
read_dht11(); // Lire la valeur de température et d’humidité
LcdShowValue(); // le LCD affiche les valeurs intensité lumineuse, température et humidité.
// serial monitor displays the resistance of the photoresistor and the angle of servo
/*
Serial.print(" L ");
Serial.print(L);
Serial.print(" R ");
Serial.print(R);
Serial.print(" U ");
Serial.print(U);
Serial.print(" D ");
Serial.print(D);
Serial.print(" ud_angle ");
Serial.print(ud_angle);
Serial.print(" lr_angle ");
Serial.println(lr_angle);
*/
/*
// delay(1000);
// During the test, the serial port data is received too fast, and it can be adjusted by adding delay time
*/
}
/*
*********La routine du servomoteur***********
*/
void ServoAction() // routine servomoteur
{
int L = analogRead(l_state); // lire la valeur photorésistance de gauche de 0-1023
int R = analogRead(r_state); // lire la valeur photorésistance de droite de 0-1023
int U = analogRead(u_state); // lire la valeur photorésistance du haut de 0-1023
int D = analogRead(d_state); // lire la valeur photorésistance du bas de 0-1023
/*
*********************système gauche et droite*********************
*/
// abs() is the absolute value function
if (abs(L - R) > error && L > R) { // Détermine si l’erreur est dans la plage acceptable , si non il ajuste le servomoteur
lr_angle -= resolution; // réduire l’angle
// lr_servo.attach(lr_servopin); // connect servo
if (lr_angle < 0) { // limite l’angle de rotation du servomoteur
lr_angle = 0;
}
lr_servo.write(lr_angle); // sortir l’angle de rotation du servomoteur
delay(m_speed); // délai vitesse mouvement
}
else if (abs(L - R) > error && L < R) { // Détermine si l’erreur est dans la plage acceptable , si non il ajuste le servomoteur
lr_angle += resolution; // augmenter l’angle
// lr_servo.attach(lr_servopin); // connect servo
if (lr_angle > 180) { // limiter l’angle de rotation du servomoteur
lr_angle = 180;
}
lr_servo.write(lr_angle); // sortir l’angle de rotation du servomoteur
delay(m_speed); // délai vitesse du mouvement
}
else if (abs(L - R) <= error) { // Détermine si l’erreur est dans la plage acceptable , si non il ajuste le servomoteur
// lr_servo.detach(); //release the pin of servo
lr_servo.write(lr_angle); // sortir l’angle de rotation du servomoteur
}
/*
*********************ajustement servomoteur haut et bas*********************
*/
if (abs(U - D) > error && U >= D) { // Détermine si l’erreur est dans la plage acceptable , si non il ajuste le servomoteur
ud_angle -= resolution; // réduire l’angle
// ud_servo.attach(ud_servopin); // connect servo
if (ud_angle < 10) { // limiter l’angle de rotation du servomoteur
ud_angle = 10;
}
ud_servo.write(ud_angle); // sortir l’angle de rotation du servomoteur
delay(m_speed); // délai de vitesse du mouvement
}
else if (abs(U - D) > error && U < D) { // Détermine si l’erreur est dans la plage acceptable , si non il ajuste le servomoteur
ud_angle += resolution; // réduire l'angle
// ud_servo.attach(ud_servopin); // connect servo
if (ud_angle > 90) { // limiter l'angle de rotation du servomoteur
ud_angle = 90;
}
ud_servo.write(ud_angle); // sortir l’angle de rotation du servomoteur
delay(m_speed);
}
else if (abs(U - D) <= error) { // Détermine si l’erreur est dans la plage acceptable , si non il ajuste le servomoteur
// ud_servo.detach(); // libérer la pin du servomoteur
ud_servo.write(ud_angle); // sortir l’angle de rotation du servomoteur
}
}
void LcdShowValue() // routine LCD
{
char str1[5];
char str2[2];
char str3[2];
dtostrf(light, -5, 0, str1); // Formater les données de la valeur lumineuse sous la forme d'une chaîne, alignées à gauche
dtostrf(temperature, -2, 0, str2);
dtostrf(humidity, -2, 0, str3);
// LCD1602 display
// afficher la valeur de l'intensité lumineuse
lcd.setCursor(0, 0); // curseur point 1e caractère de la 1eme rangée
lcd.print("Light:"); // marque le mot Light
lcd.setCursor(6, 0); // curseur point 7e caractère de la 1eme rangée
lcd.print(str1);
lcd.setCursor(11, 0); // curseur point 12e caractère de la 1eme rangée
lcd.print("lux"); // marque le mot lux
// LCD pour les valeurs température et humidité
lcd.setCursor(0, 1); // curseur point 1e caractère de la 2eme rangée
lcd.print(temperature); // marque le mot temperature
lcd.setCursor(2, 1); // curseur point 3e caractère de la 2eme rangée
lcd.print("C"); // marque le mot C
lcd.setCursor(5, 1); // curseur point 6e caractère de la 2eme rangée
lcd.print(humidity); // marque le mot humidity
lcd.setCursor(7, 1); // curseur point 8e caractère de la 2eme rangée
lcd.print("%"); // marque le mot % (l’afficheur ne sait pas l’indiquer)
// Montrer la précision de la rotation
lcd.setCursor(11, 1); // curseur point 12e caractère de la 2eme rangée
lcd.print("res:"); // marque le mot res:
lcd.setCursor(15, 1); // curseur point 16e caractère de la 2eme rangée
lcd.print(resolution); // marque le mot resolution
/*
if (light < 10) {
lcd.setCursor(7, 0);
lcd.print(" ");
lcd.setCursor(6, 0);
lcd.print(light);
} else if (light < 100) {
lcd.setCursor(8, 0);
lcd.print(" ");
lcd.setCursor(6, 0);
lcd.print(light);
} else if (light < 1000) {
lcd.setCursor(9, 0);
lcd.print(" ");
lcd.setCursor(6, 0);
lcd.print(light);
} else if (light < 10000) {
lcd.setCursor(9, 0);
lcd.print(" ");
lcd.setCursor(6, 0);
lcd.print(light);
} else if (light < 100000) {
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(6, 0);
lcd.print(light);
}
*/
}
void read_light() // routine intensité lumineuse
{
light = lightMeter.readLightLevel(); // Lire l'intensité lumineuse du capteur BH1750
}
void read_dht11() // routine capteur température DHT11
{
int chk;
chk = DHT.read(DHT11_PIN); // lire les données
switch (chk) {
case DHTLIB_OK:
break;
case DHTLIB_ERROR_CHECKSUM: // Vérifie et retourne l'erreur
break;
case DHTLIB_ERROR_TIMEOUT: // Hors temporisation et retourne l'erreur
default:
break;
}
temperature = DHT.temperature;
humidity = DHT.humidity;
}
/*
********la routine de perturbation du service*************
*/
void adjust_resolution() // routine de résolution
{
tone(buzzer, 800, 100);
delay(10); // Délai d'élimination de vibrations
if (!digitalRead(interruptPin)){
if(resolution < 5){
resolution++;
}else
{
resolution = 1;
}
}
}