c'est un peu dommage de consommer du courant pour lutter contre la gravité alors qu'un simple blocage physique suffit.
Pensez à comment fonctionne une porte à l'intérieur de votre maison: vous devez abaisser la poignée pour ouvrir la porte parce que si vous tirez la partie plate du pen de la serrure tape contre le dormant et ça ne peut pas s'ouvrir, mais une fois la porte ouverte, si vous la poussez sans même baisser la poignée, elle va venir se verrouiller parce que le pen est monté sur ressort et a un biseau qui fait que la force que vous exercez en poussant la porte emmène le pen à se rétracter puis reprendre sa position de verrou une fois l'encoche enclenchée.
Donc au lieu de prendre un électro-aimant je suggère de prendre une gâche électrique

vous n'avez qu'à donner une impulsion électrique disons d'une seconde pour que la gâche s'ouvre si le contre poids et suffisant la porte montera et pas besoin de gérer le retour en activité. Quand le soir vous redescendez la porte manuellement, grace au biseau ça va simplement pousser le pen de la gâche qui s'enclenchera sur votre porte et bloquera le tout.
Bien sûr il ne faut pas que le contre poids soit super fort sinon vous allez appliquer une force sur le pen en permanence que peut le coincer - le contre poids doit être choisi pour juste dépasser l'équilibre de la porte
enfin - c'est comme ça que je verrai le truc dans votre cas...
le code d'exemple cité plus haut vous montre comment gérer la détection lumineuse, la seule chose à faire avec mon approche c'est d'envoyer l'impulsion.
Attention on ne pilote pas directement un électroaimant depuis la pin d'un arduino, il faut passer par votre relai bien sûr (en espérant qu'il est protégé correctement - à vérifier )
j'ai rapidement modifié le code de l'exemple ci dessous - juste à titre d'illustration je ne sais pas si ça compile - tapé à la va vite ici
/*
Code d'exemple pour une photorésistance.
*/
const unsigned int seuil = 300; // à régler en fonction de la luminosité voulue
const byte pinPhotoResistance = A0;
const byte pinGacheElectrique = 3; // pilote la gâche à travers un relai
// Fonction setup(), appelée au démarrage de la carte Arduino
void setup() {
Serial.begin(115200); // Initialise la communication avec le PC
pinMode(pinGacheElectrique, OUTPUT);
digitalWrite(pinGacheElectrique, LOW); // en supposant que HIGH déclenche le relai
}
// Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
void loop() {
// Mesure la tension sur la broche A0
int valeur = analogRead(pinPhotoResistance);
if (valeur > seuil) {
digitalWrite(pinGacheElectrique, HIGH); // on déclenche le relai de la gâche
delay(1000); // on attend une seconde que la porte commence à bouger
digitalWrite(pinGacheElectrique, LOW); // on re-vérouille le relai de la gâche
delay(2 * 60 * 60 * 1000ul); // On attend 2 heures avant d'aller re-vérifier pour ne pas redéclencher intempestivement
}
}