Modèle Architectural d'Abus Intelligent avec Pare-Soleil Automatique
Composants et Fournitures
| Composant | Description | Quantité |
|---|---|---|
| Arduino Nano R3 | Petit, facile à cacher dans le modèle architectural | 1 |
| Servo MG995 | Servo robuste pour le pare-soleil lourd | 1 |
| Photorésistance | Une face Est, une face Ouest | 2 |
| Capteur de Pluie | Détection pluie | 1 |
| LED Blanche Haute Luminosité | Éclairage abri bus / réverbère | 6 |
| Résistance 220 Ω | Pour LEDs | 3 |
| Plaque d'essai (Breadboard) | Genérique | 1 |
| Fils de liaison Mâle/Mâle | Câblage | 27 |
| Borniers à vis | Connexions sécurisées | 2 |
| Connecteur Pile 9V | 2 | |
| Pile 9V (générique) | 1 | |
| Support 4 piles AA | Alimentation externe pour servo MG995 | 1 |
À Propos de ce Projet
C'est une mise à jour du projet précédent (V 1.0).
Les principaux changements par rapport à la V1.0 :
- La taille du modèle architectural : 1,5 m × 1 m
- Le poids du pare-soleil, d'où le remplacement du micro servo SG99 par le MG995
- Ajout d'une source d'alimentation externe pour que le MG995 fonctionne
- Deux mécanismes différents testés pour déployer/rentrer le pare-soleil. Celui rejeté est montré dans la 2e vidéo. Celui retenu dans la 3e.
- Modification du sketch pour utiliser la bibliothèque
VarSpeedServo - Correction d'une petite erreur logique dans un des états du pare-soleil (merci à Gurneet1928)
La version 1.0 est disponible ici : Model Version 1.0
LES VIDÉOS :
- Fabrication du circuit
- Fabrication du modèle architectural
Code
Le Code (C/C++)
#include <VarSpeedServo.h>
VarSpeedServo servo;
int easternLight = 0;
int westernLight = 0;
int rainSensed = 0;
int sunshadePosition = 0;
int rainThreshold = 512;
int sunshadeExpanded = 120;
int sunshadeContracted = 60;
int ambientLighting = 0;
int turnOnLightsOn = 150;
int ledIntensity = 0;
int ledPower = 0;
int servoSpeed = 20;
bool debugging = false; // Mettre à TRUE pour activer le debug sur Console Série
void setup() {
pinMode(A4, OUTPUT); // Éclairage intérieur abri bus
pinMode(A5, OUTPUT); // Réverbère
pinMode(A1, INPUT); // Lumière Ouest
pinMode(A2, INPUT); // Lumière Est
pinMode(A3, INPUT); // Capteur pluie analogique
pinMode(2, INPUT); // Capteur pluie numérique
servo.attach(A0); // Servo
servo.write(sunshadeContracted, servoSpeed, true);
if (debugging){
Serial.begin(9600);
Serial.println("*** DEBUGGING STARTED ***");
Serial.println("-------------------------");
}
}
void oya_mydebug(String text, int value = NULL) {
// 'oya_' ajouté pour éviter un crash avec toute fonction de debug
// d'une bibliothèque externe. Oya = abréviation de mon entreprise OfficeYA
if (debugging){
Serial.print(text);
if (value){
Serial.print(" = ");
Serial.println(value);
} else {
Serial.println(" ");
}
}
}
void expand_collapse(int easternLight, int westernLight) {
if (easternLight <= westernLight) {
// C'est le lever du soleil
oya_mydebug("It's sunrise");
if (sunshadePosition != sunshadeExpanded) {
servo.write(sunshadeExpanded, servoSpeed, true);
oya_mydebug("Sunshade expanded");
}
}
if (easternLight > westernLight) {
// Le soleil descend
oya_mydebug("Sun is going down");
if (sunshadePosition != sunshadeContracted) {
servo.write(sunshadeContracted, servoSpeed, true);
oya_mydebug("Sunshade contracted");
}
}
}
void loop() {
// Lecture capteurs
easternLight = analogRead(A2);
westernLight = analogRead(A1);
rainSensed = analogRead(A3);
sunshadePosition = servo.read();
ambientLighting = ((easternLight + westernLight) / 2); // Moyenne luminosité est/ouest
oya_mydebug("easternLight", easternLight);
oya_mydebug("westernLight", westernLight);
oya_mydebug("rainSensed", rainSensed);
oya_mydebug("sunshadePosition", sunshadePosition);
oya_mydebug("ambientLighting", ambientLighting);
// Est-ce qu'il pleut ?
if (rainSensed < rainThreshold) {
// Il pleut
oya_mydebug("It's raining...");
if (sunshadePosition != sunshadeExpanded) {
servo.write(sunshadeExpanded, servoSpeed, true);
oya_mydebug("Sunshade expanded");
}
} else {
// Il ne pleut pas
oya_mydebug("It is not raining...");
if (ambientLighting <= turnOnLightsOn) {
// Il fait sombre, allumer les lumières
oya_mydebug("It's getting dark, turning on the lights");
ledPower = ((turnOnLightsOn - ambientLighting) * 4);
oya_mydebug("ledPower", ledPower);
analogWrite(A5, ledPower);
analogWrite(A4, ledPower);
expand_collapse(easternLight, westernLight);
} else {
// Beaucoup de soleil
oya_mydebug("A lot of sunshine, turn off lights");
analogWrite(A5, 0);
analogWrite(A4, 0);
expand_collapse(easternLight, westernLight);
}
}
if (debugging){
Serial.println("********************");
Serial.println(" ");
delay(5000);
} else {
delay(100);
}
}
Schémas

Processus de fabrication
- Trains miniatures Lionel : histoire, fabrication et avenir
- Robot de tri de recyclage propulsé par Google Coral Edge TPU
- Maximiser les revenus récurrents avec les consommables intelligents : Un game-changer pour les constructeurs de machines
- Contrôle Automatique de Train Miniature Arduino – Simple, Fiable et Personnalisable
- Tour linéaire SPRINT 20 : Tournage automatisé rapide pour pièces de haute précision
- Principes des presses servo : puissance, précision et efficacité expliquées
- Servomoteurs expliqués : fonctionnement et importance
- Maximiser la précision : associer réducteurs et servomoteurs
- ECS G86 Cycle alésage avec fonction arrêt broche