Starter Kit Lampe d'ambiance

Je pense que tu te fais des nœuds au cerveau.
Tu es ici typiquement dans un problème algorithmique et non dans un problème de codage.

  • Tu as un capteur analogique.
    • Tu lis sa valeur, représentée par un nombre compris entre 0 et 1023 que retourne analogRead()
  • Tu dois faire une visualisation par une LED.
    • Pour faire la visualisation avec la LED, tu as la fonction analogWrite(), qui attend un paramètre entre 0 et 255
  • La solution consiste donc à diviser par 4 la valeur retournée par analogRead() pour la fournir à analogWrite().
    • Tu réalises une fonction intensité_LED = niveau_capteur / 4

Maintenant, partant de la même structure de programme, tu veux "inverser" le fonctionnement.
Donc cela veut dire que pour une valeur croissante en entrée il faut fournir une valeur décroissante en sortie.
Il y a souvent différentes manières de résoudre un problème. Ici, typiquement, tu as:

  • une solution purement matérielle, en agissant directement sur le capteur (la proposition de @jef59). Cela implique de comprendre comment se fait la mise en œuvre de la LDR et le fonctionnement d'un pont diviseur de tension.
  • une solution logicielle en agissant sur la valeur d'entrée (la proposition que j'ai faite de manipuler la sortie de analogRead()). On convertit les valeurs 0 à 1023 retournées par analogRead() en utilisant
    redSensorValue = 1023 - analogRead(redSensorPin).
  • une solution logicielle en agissant sur la valeur de sortie (la proposition de @jpbbricole ). On "inverse" le paramètre, compris entre 0 255, passé à analogWrite() en faisant
    redValue = 255 - redSensorValue/4;

Différentes solutions pour un seul problème. Il faut juste choisir laquelle on veut utiliser et c'est tout. Et surtout ne pas les appliquer toutes en même temps :wink:

Il faut dans un premier temps exprimer le besoin logiquement en se demandant quoi faire pour arriver a realiser ce que l on veut sans se preoccuper du codage.

Ensuite on code.

Certains on besoin d une phase papier ou on ecris ou on dessine un debut de solution.
D autres le font dans la tête et il ont tres rarement ou pas du tout besoin d ecrire.

Edit. Le temps d ecrire la solution est donnee

Encore une autre solution, avec les outils Arduino comme map()
remplacer ces 3 lignes:

redValue = redSensorValue/4;
greenValue = greenSensorValue/4;
blueValue = blueSensorValue/4;

par

redValue = map(redSensorValue, 0, 1023, 255, 0);
greenValue = map(greenSensorValue, 0, 1023, 255, 0);
blueValue = map(blueSensorValue, 0, 1023, 255, 0);

A+
Cordialement
jpbbricole

Bonjour,

Je ne prétend pas être l'as des as en codage, mais je me débrouille avec la plateforme Arduino.

Par contre, scratch, je ne connais pas, si je raisonne comme toi je dirais que c'est parce que je n'ai pas le bon level!

Alors que je crois que c'est juste une autre façon de voir les choses.
Il ne faut pas se sous estimer et penser que c'est une question de level.

Là c'est pas de chance, tu as plein d'info qui viennent d'un coup, donc je ne fais que rajouter de l'info, desolé.

Sans aucun doute que

Est une excellente approche avant de s'intéresser au code.
Et ici on répondra à tes questions.

Maintenant si tu veux une solution toute faite, en modifiant le code, utilise les conseils de @jpbbricole ou @fdufnews ca marchera aussi trés bien je crois pour réaliser ton projet

"Je voulais juste inverser la petite lampe pour l'associer à un projet de photophore fait avec une découpeuse."

Merci pour toutes vos explications, les choses sont plus claires dans le principe.
Après ça reste encore compliqué.

J'ai essayé deux méthodes et cette fois la led reste allumée en permanence jour et nuit.
Quand je remets le code de base ça fonctionne comme avant...

Méthode 1

const int greenLEDPin = 9;
const int redLEDPin = 10;
const int blueLEDPin = 11;

const int redSensorPin = A0;
const int greenSensorPin = A1;
const int blueSensorPin = A2;

int redValue = 0;
int greenValue = 0;
int blueValue = 0;

int redSensorValue = 0;
int greenSensorValue = 0;
int blueSensorValue = 0;


void setup() {
Serial.begin(9600);
pinMode(greenLEDPin,OUTPUT);
pinMode(redLEDPin,OUTPUT);
pinMode(blueLEDPin,OUTPUT);
}


void loop() {
  redSensorValue = analogRead(redSensorPin); // Lecture de la valeur sur le capteur A0
  delay(5);
  greenSensorValue = analogRead(greenSensorPin); // Lecture de la valeur sur le capteur A1
  delay(5);
    blueSensorValue = analogRead(blueSensorPin); // Lecture de la valeur sur le capteur A2

   Serial.print ("Données brut du capteur \t Red : ");
   Serial.print(redSensorValue);
   Serial.print("\t Green : ");
   Serial.print(greenSensorValue);
   Serial.print("\t Blue : ");
   Serial.print(blueSensorValue);

   redValue = 255 - redSensorValue/4;
   greenValue = 255 - greenSensorValue/4;
   blueValue = 255 - blueSensorValue/4;

   Serial.print("Valeurs recalculées \t Rouge : ");
   Serial.print(redValue);
   Serial.print("\t Vert : ");
   Serial.print(greenValue);
   Serial.print("\t Bleu : ");
   Serial.print(blueValue);

   analogWrite(redLEDPin, redValue);
   analogWrite(greenLEDPin, greenValue);
   analogWrite(blueLEDPin, blueValue);
}

Méthode 2

const int greenLEDPin = 9;
const int redLEDPin = 10;
const int blueLEDPin = 11;

const int redSensorPin = A0;
const int greenSensorPin = A1;
const int blueSensorPin = A2;

int redValue = 0;
int greenValue = 0;
int blueValue = 0;

int redSensorValue = 0;
int greenSensorValue = 0;
int blueSensorValue = 0;


void setup() {
Serial.begin(9600);
pinMode(greenLEDPin,OUTPUT);
pinMode(redLEDPin,OUTPUT);
pinMode(blueLEDPin,OUTPUT);
}


void loop() {
  redSensorValue = analogRead(redSensorPin); // Lecture de la valeur sur le capteur A0
  delay(5);
  greenSensorValue = analogRead(greenSensorPin); // Lecture de la valeur sur le capteur A1
  delay(5);
    blueSensorValue = analogRead(blueSensorPin); // Lecture de la valeur sur le capteur A2

   Serial.print ("Données brut du capteur \t Red : ");
   Serial.print(redSensorValue);
   Serial.print("\t Green : ");
   Serial.print(greenSensorValue);
   Serial.print("\t Blue : ");
   Serial.print(blueSensorValue);

   redValue = map(redSensorValue, 0, 1023, 255, 0);
   greenValue = map(greenSensorValue, 0, 1023, 255, 0);
   blueValue = map(blueSensorValue, 0, 1023, 255, 0);

   Serial.print("Valeurs recalculées \t Rouge : ");
   Serial.print(redValue);
   Serial.print("\t Vert : ");
   Serial.print(greenValue);
   Serial.print("\t Bleu : ");
   Serial.print(blueValue);

   analogWrite(redLEDPin, redValue);
   analogWrite(greenLEDPin, greenValue);
   analogWrite(blueLEDPin, blueValue);
}

Avec une nouvelle problématique : ma carte n'est plus détectée automatiquement sur l'IDE.
Dans outils le port reste grisé alors que Arduino Uno est bien sélectionné.

Je n'ai jamais eu de soucis.
Je viens de changer de PC et passer sous windows 11, un problème de drivers, de prériphérique ou autres.

De temps en temps la connexion sur com3 se fait pourtant.
J'ai réussi à téléverser mais galère.

Bon tout ça pour dire que ma petite lampe n'est pas encore opérationnelle :sweat_smile:

Bonjour steffy1

J'ai essayé la méthode 2 et le PWM fonctionne très bien.

A+
Cordialement
jpbbricole

Pourtant mon branchement est bon et si le code est bon, je ne comprends pas.
Et pas un problème de téléversement avec ma carte qui n'est pas ou très mal reconnue ?

Fais une photo en gros plan de ton montage.


Bonsoir steffy1
Je t'ai fait une simulation ici
image

A+
Cordialement
jpbbricole

Bonsoir steffy1
Si tu charges ce code:

const int greenLEDPin = 9;
const int redLEDPin = 10;
const int blueLEDPin = 11;

const int redSensorPin = A0;
const int greenSensorPin = A1;
const int blueSensorPin = A2;

int redValue = 0;
int greenValue = 0;
int blueValue = 0;

int redSensorValue = 0;
int greenSensorValue = 0;
int blueSensorValue = 0;


void setup() {
	Serial.begin(9600);
	pinMode(greenLEDPin,OUTPUT);
	pinMode(redLEDPin,OUTPUT);
	pinMode(blueLEDPin,OUTPUT);
}


void loop() {
	redSensorValue = analogRead(redSensorPin); // Lecture de la valeur sur le capteur A0
	delay(5);
	greenSensorValue = analogRead(greenSensorPin); // Lecture de la valeur sur le capteur A1
	delay(5);
	blueSensorValue = analogRead(blueSensorPin); // Lecture de la valeur sur le capteur A2

	redValue = map(redSensorValue, 0, 1023, 255, 0);
	greenValue = map(greenSensorValue, 0, 1023, 255, 0);
	blueValue = map(blueSensorValue, 0, 1023, 255, 0);

	Serial.print("Rouge\t" + String(redSensorValue) + " = " + String(redValue));
	Serial.print("\tVert\t" + String(greenSensorValue) + " = " + String(greenValue));
	Serial.println("\tBleu\t" + String(blueSensorValue) + " = " + String(blueValue));

	analogWrite(redLEDPin, redValue);
	analogWrite(greenLEDPin, greenValue);
	analogWrite(blueLEDPin, blueValue);
}

Qu'est ce qui s'affiche dans le moniteur quand tu fais varier la lumière?

A+
jpbbricole

Ok merci je vais essayer.
Je reviens dès que c'est fait.

Le code va avec le nouveau montage, ce n'est pas un essai pour celui que j'ai fait ?

Bonjour steffy1

C'est le programme Méthode 2 avec un peu moins d'affichage dans le moniteur, ça s'affiche ainsi:

Rouge	578 = 111	Vert	563 = 115	Bleu	546 = 119

Bonne journée
jpbbricole

Bonjour,

Si je cache pour mettre de l'obscurité les valeurs changent, elles augmentent mais la lumière reste allumée en permanence dans le jour et la nuit.

La simulation est un tout autre projet où on oublie les phototransistors ?
ça ne s'allume plus en fonction de la lumière mais avec la rotation des boutons.
Ou alors je comprends rien du tout.

Les potentiomètres "stimulent" les phototransistors. La "mécanique" est la même.

Quels sont les valeurs extrêmes que tu arrives à atteindre dans la lumière et dans l'obscurité ?

Bonne piste.

Peut être que les valeurs de ces résistances sont incorrectes?


(Trop grandes ou erronées par rapport aux valeurs suggerées?).

Oui, il doit y avoir un problème du genre mais là c'est trop technique pour moi.
On va attendre que je progresse un peu :wink: