Slim Bushalte Architectuurmodel met Automatische Zonwering
Onderdelen en benodigdheden
| Arduino Nano R3 | Aantal: 1 | Klein, makkelijk te verbergen in architectuurmodel |
| Servo MG995 | Aantal: 1 | Zware servo voor zwaardere zonwering |
| Fotoweerstand (LDR) | Aantal: 2 | Eén naar het oosten, één naar het westen gericht |
| Regensensor | Aantal: 1 | |
| Hoog-briljante witte LED | Aantal: 6 | |
| Weerstand 220 Ω | Aantal: 3 | |
| Breadboard (algemeen) | Aantal: 1 | |
| Man/Man jumperdrade | Aantal: 27 | |
| Schroefklemmen | Aantal: 2 | |
| 9V-batterijklem | Aantal: 2 | |
| 9V-batterij (algemeen) | Aantal: 1 | |
| 4xAA batterijhouder | Aantal: 1 |
Over dit project
Dit is een upgrade van het vorige project (V1.0).
Hoofdwijzigingen ten opzichte van V1.0:
- Afmetingen: Architectuurmodel van 1,5 m × 1 m
- Gewicht zonwering: SG90 microservo vervangen door MG995
- Externe voeding: Toegevoegd voor de MG995
- Twee mechanismen getest: Eén verworven (zie 2e video), één gekozen (zie 3e video)
- Code:
VarSpeedServo-bibliotheek gebruikt voor soepelere beweging - Bugfix: Logicafout in één van de zonwering-statussen opgelost (dankzij Gurneet1928)
V1.0 vind je hier.
Code
De 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; // Zet op TRUE voor seriële debug-uitvoer
void setup() {
pinMode(A4, OUTPUT); // Interieurverlichting bushalte
pinMode(A5, OUTPUT); // Straatverlichting
pinMode(A1, INPUT); // Westelijke lichtsensor
pinMode(A2, INPUT); // Oostelijke lichtsensor
pinMode(A3, INPUT); // Regensensor (analog)
pinMode(2, INPUT); // Regensensor (digitaal)
servo.attach(A0); // Servo
servo.write(sunshadeContracted, servoSpeed, true); // Start positie
if (debugging) {
Serial.begin(9600);
Serial.println("*** DEBUGGING GESTART ***");
Serial.println("-------------------------");
}
}
void oya_mydebug(String text, int value = NULL) {
// 'oya_' prefix om naamconflicten met bibliotheken te voorkomen (Oya = 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) { // Zonsopgang
oya_mydebug("Het is zonsopgang");
if (sunshadePosition != sunshadeExpanded) {
servo.write(sunshadeExpanded, servoSpeed, true);
oya_mydebug("Zonwering uitgeklapt");
}
}
if (easternLight > westernLight) { // Zonsondergang
oya_mydebug("Zon gaat onder");
if (sunshadePosition != sunshadeContracted) {
servo.write(sunshadeContracted, servoSpeed, true);
oya_mydebug("Zonwering ingeklapt");
}
}
}
void loop() {
// Sensoren uitlezen
easternLight = analogRead(A2);
westernLight = analogRead(A1);
rainSensed = analogRead(A3);
sunshadePosition = servo.read();
ambientLighting = (easternLight + westernLight) / 2; // Gemiddelde helderheid
oya_mydebug("easternLight", easternLight);
oya_mydebug("westernLight", westernLight);
oya_mydebug("rainSensed", rainSensed);
oya_mydebug("sunshadePosition", sunshadePosition);
oya_mydebug("ambientLighting", ambientLighting);
// Regen detectie
if (rainSensed < rainThreshold) { // Het regent
oya_mydebug("Het regent...");
if (sunshadePosition != sunshadeExpanded) {
servo.write(sunshadeExpanded, servoSpeed, true);
oya_mydebug("Zonwering uitgeklapt");
}
} else { // Geen regen
oya_mydebug("Het regent niet...");
if (ambientLighting <= turnOnLightsOn) { // Donker wordend
oya_mydebug("Het wordt donker, lichten aan");
ledPower = (turnOnLightsOn - ambientLighting) * 4;
oya_mydebug("ledPower", ledPower);
analogWrite(A5, ledPower); // Straatlicht
analogWrite(A4, ledPower); // Interieur
expand_collapse(easternLight, westernLight);
} else { // Veel zonlicht
oya_mydebug("Veel zonlicht, lichten uit");
analogWrite(A5, 0);
analogWrite(A4, 0);
expand_collapse(easternLight, westernLight);
}
}
if (debugging) {
Serial.println("********************");
Serial.println(" ");
delay(5000);
} else {
delay(100);
}
}
Schema

Productieproces
- Lionel modeltreinen: Geschiedenis, productie en toekomst
- Recycling Sorteerrobot Aangedreven door Google Coral Edge TPU
- DIY Automatische Treinbesturing met Arduino – Eenvoudig, Betrouwbaar en Aanpasbaar
- Servo-gestuurde obstakelvermijdende robot: Bouw met Arduino & HC-SR04
- Arduino-gestuurd automatische plantenwateringssysteem
- Servopers Fundamenten: Vermogen, Precisie en Efficiëntie Uitgelegd
- Servomotoren Uitgelegd: Hoe Ze Werken en Waarom Ze Belangrijk Zijn
- Precisie maximaliseren: Tandwielkoppels koppelen aan servomotoren
- ECS G86 Boorcyclus met Spindle Stop Functie
- SPRINT 20 Lineaire Draaibank: Snelle, Geautomatiseerde Draaiing voor Hoogprecisie Onderdelen
- Recurrente omzet maximaliseren met slimme verbruiksartikelen: een game-changer voor machinebouwers