Programme pour LDR

Bonjour

Qui peut m'aider à comprendre ce programme

[code]#define LED2	3
#define LED4	5
#define LDR	A1

void setup()
{
	Serial.begin(9600);
        pinMode(LED2, OUTPUT);
	digitalWrite(LED2, LOW);
	pinMode(LED4, OUTPUT);
	digitalWrite(LED4, LOW);
        pinMode(LDR, INPUT);
	
}
void loop()
{
	/*The brighter the ambient light intensity, the darker the LED*/
	uint8_t light_level,duty_cycle;
	light_level = getLightLevel();//should be 0~7
	duty_cycle = light_level*30;  //the duty_cycle of the PWM should be 0~210
	
	/*The LED that is controled by PWM pin should be LED2 or LED4.*/
	/*The greater the duty_cycle,the brighter the LED.*/
	analogWrite(LED2,duty_cycle);
	delay(500);
}

/****************************************************************/
/*Function:Get the ambient light level.							*/
/*Parameter:void												*/
/*Return:	uint8_t,range from 0 to 7,0 = brightest,7 = darkest */
uint8_t getLightLevel()
{
	uint16_t resistance;
	uint8_t light_level;
	resistance = (uint16_t)getLightIntensity();
	Serial.print("resistance = ");
	Serial.println(resistance);
	if(resistance < 10) light_level = 0;
	else if(resistance < 50)light_level = 1;
	else if(resistance < 80)light_level = 2;
	else if(resistance < 110)light_level = 3;
	else if(resistance < 140)light_level = 4;
	else if(resistance < 170)light_level = 5;
	else if(resistance < 200)light_level = 6;
	else light_level = 7;
	return light_level;
}
/*********************************************************************/
/*Function:Get the resistance of the light sensor					 */
/*Parameter:void													 */
/*Return:	float,the resistance of the light sensor,its unit is kohm */
/*			The brighter the ambient light intensity,the smaller the */
/*			resistance.												 */
float getLightIntensity()
{
	int sensorValue = analogRead(LDR);
	float rsensor;
	rsensor=(float)(1023-sensorValue)*10/sensorValue;
	return rsensor;
}

[/code]

pourquoi un sous programme commence par uint_8 ?

uint8_t est un type, c'est la même chose que byte sur votre arduino --> Un nombre non signé tenant sur 8 bits.

Donc cette définition

 uint8_t getLightLevel()
{
 ....
}

c'est une fonction qui s'appelle getLightLevel qui ne prend pas de paramètres et qui retourne un octet non signé.

Par exemple la fonction suivante

 float getLightIntensity()
{
   ...
}

elle s'appelle getLightIntensity, ne prend pas de paramètres et va retourner un nombre à virgule codé sur un float (codé sur 4 octets)

(en C++ on ne parle pas de sous programme, mais dans ce cas là d'une fonction)

Bonjour et merci pour vos réponses toujours très précieuses

Je vais essayer de comprendre ce programme

cordialement

Bonjour

Dans la fonctions uint_8 getLightLevel() je ne comprens pas très bien le retur light_level

Ainsi que le return rsensor dans la fonction float getLightIntensity().

Par contre si j'ai bien compris le programme celui modifie la luminosité de la del en fonction de l'éclairement de la ldr

J'ai donc fait ce petit programme qui je pense fait la même chose mais beaucoup plus simple pour moi je pense

Si qq peut me donner son avis merci

//Clé Arduino TickShield LdrCCC

const int led = 3; // la LED est liée à la broche digitale 2


void setup() 
{
  pinMode(led, OUTPUT); // configurer la broche comme sortie
  Serial.begin(9600);
}

void loop() 
{
  int lecture = analogRead(A1); // la LDR est liée à la broche analogique 0
  Serial.println(lecture,DEC);

  lecture = map(lecture,0,1023,0,255);
  analogWrite(led,lecture);
  Serial.println(lecture);
  delay (2000);
  
 }

Cordialement chriss62

quelques commentaires:

int lecture = analogRead([color=red]A1[/color]); // la LDR est liée à la [color=red]broche analogique 0[/color]

--> serait bon de s'assurer que le commentaire reflète le vrai câblage et ce que vous lisez :slight_smile:


votre code va fonctionner à l'envers par rapport à ce que fait l'autre programme

Une LDR (Light Dependent Resistor = résistance dépendant de la lumière) ou photo-résistance est un est un capteur résistif, donc passif, dont la résistivité (la valeur en Ω du composant) varie en fonction de la quantité de lumière incidente à laquelle il est exposé. Par exemple vous aurez 1MΩ dans l'obscurité et ~12kΩ (pleine lumière).

Je suppose que votre montage est ainsi:

5V ----> PhotoResistance [color=green]R[sub]1[/sub][/color] ---> [color=green]R[sub]2[/sub][/color]=10kΩ ---> GND
                             |
                             |
                             |
                            A1

ce que l'on mesure c'est la tension résultante d'un diviseur de tension:

V[sub]out[/sub] = V[sub]in[/sub] * ([color=green]R[sub]2[/sub][/color] / ([color=green]R[sub]1[/sub][/color] + [color=green]R[sub]2[/sub][/color]))

--> soit V[sub]out[/sub] = 5v (10000/([color=green]R[sub]1[/sub][/color]+10000))

on voit donc que quand la lumière augmente, la résistance diminue, donc Vout augmente, donc votre analogRead(A1) retournera une plus grande valeur.

ce qui veut dire que votre fonction lecture = map(lecture,0,1023,0,255); attribue une luminosité à la diode d'autant plus forte qu'il fait jour. généralement on veut le contraire, plus il fait nuit, plus on veut de lumière pour y voir quelque chose :slight_smile:


Bon à savoir:

  • Le capteur n'a pas de linéarité de la réponse en fonction du flux - donc c'est pour cela que dans le code d'origine il calcule des seuils en fonction de la résistance.

  • une photorésistance est sensible à la chaleur et réagit différemment en fonction des couleurs. La mesure sera donc légèrement différente s'il fait très chaud ou très froid. De même, la valeur mesurée sera différente en fonction de la couleur de la lumière. donc le calcul ci dessus est très approximatif - c'est pour cela que définir que quelques seuils pour la luminosité n'est pas plus mal.

  • Les photorésistances sont principalement utilisées pour détecter la présence (ou l'absence) de lumière. Pour faire de véritable mesure de luminosité (en lux, avec une précision fixe qu'importent la température et la couleur), il existe des capteurs spécialisés pour cela comme le capteur TSL2561.

voilà j'espère que ça vous aide un peu - bonne fêtes de fin d'année!

Bonjour et encore merci J-M-L

Oui touts vos messages me sont d'une très grande utilité
J'apprends un petit truc à chaque fois

Oui j ai bien vu que mon programme fonctionnait à l'envers c'est à dire que plus j'ai de lumière plus la diode éclaire.

Je vais essayer de trouver une astuce pour que l'effet inverse se produise

Est ce déjà possible par programmation ?

J'utilise le TickShield de chez easyEda et la ldr est cablée comme sur votre shéma

Cordialement

Solution matérielle, échanger la LDR et la résistance de 10k

Solution logicielle, au lieu de mettre

analogWrite(led,lecture);

mettre plutôt

analogWrite(led,255 - lecture);

Bonjour et merci fdunews

Matériellement je ne peux pas inverser car c'est un shield

Je tente donc la solution logiciel

Cordialement chris62

Merci ça marche

Bonne année et merci pour tous vos précieux conseils