Moteur + capteur de température - besoin d'aide

Je ne sais pas, mais personnellement je ne me reposerais pas uniquement sur un booléen et des delay() pour gérer l'ouverture/fermeture de mes volets.
T'aurais pas envie de mettre des fins de course??

J-M-L:
:o :o Non.... sinon je n'aurais pas mis du rouge...

AH oui :confused: :slight_smile:

(cela dit vous pouvez faire simple puisqu'un booléen est conceptuellement une valeur de vérité, vous pouvez juste écrire juste if (voletsOuverts) {...} et c'est tout à fait correct et lisible)

Je vais essayer cela plutôt

Voilà j'ai fait un test de code :

int val;
int tempPin = 1;
boolean voletsOuverts;

void setup()
{
 pinMode(12, OUTPUT); //Initiates Motor Channel A pin
 pinMode(9, OUTPUT); //Initiates Brake Channel A pin
Serial.begin(9600);

}
void loop()
{
  val = analogRead(tempPin);
float mv = ( val/1024.0)*5000;
float cel = mv/10;
float farh = (cel*9)/5 + 32;

Serial.print("TEMPRATURE = ");
Serial.print(cel);
Serial.print("*C");
Serial.println();
delay(1000);
if ((cel >= 8) && (voletsOuverts == false))
{
  digitalWrite(12, HIGH); //Establishes backward direction of Channel A
  digitalWrite(9, HIGH);   //Disengage the Brake for Channel A
  analogWrite(3, 123);   //Spins the motor on Channel A at half speed
  delay(5000);
  analogWrite(3, 0);   //Spins the motor on Channel A at half speed
  voletsOuverts = !voletsOuverts;
  Serial.println("voletferme");
}
if ((cel <= 9) && (voletsOuverts == true))
{
  digitalWrite(12, LOW); //Establishes backward direction of Channel A
  digitalWrite(9, LOW);   //Disengage the Brake for Channel A
  analogWrite(3, 123);   //Spins the motor on Channel A at half speed
  delay(5000);
  analogWrite(3, 0);   //Spins the motor on Channel A at half speed
  voletsOuverts = !voletsOuverts;
  Serial.println("voletouvert");
}
}

Voilà ce que j'ai dans le moniteur série :

TEMPRATURE = 8.79*C
voletferme
voletouvert
TEMPRATURE = 9.28*C
voletferme
TEMPRATURE = 8.30*C
voletouvert
TEMPRATURE = 9.77*C
voletferme
TEMPRATURE = 8.79*C

Mon moteur tourne de manière "aléatoire".

Je pense que tu devrais étudier tes conditions d'un peu plus près. Quand tu es entre 8 et 9 que se passe-t-il?

Cette ligne est surprenante

  voletsOuverts = !voletsOuverts;

si tu es là tu dois savoir dans quel état devrait être ton booléen alors fixe le explicitement.

fdufnews:
Cette ligne est surprenante

  voletsOuverts = !voletsOuverts;

si tu es là tu dois savoir dans quel état devrait être ton booléen alors fixe le explicitement.

c vrai que je pourrais mettre voletOuverts = false /voletOuverts =true. Tu as raison.

Je pense que tu devrais étudier tes conditions d'un peu plus près. Quand tu es entre 8 et 9 que se passe-t-il?

Heu je n'ai pas compris ce que tu voulais dire ?

LoadzFire:
Heu je n'ai pas compris ce que tu voulais dire ?

Bonjour,

Entre 8 et 9 degrés les deux tests sont vrais, donc les volets vont s'ouvrir et se fermer continuellement (comme on le voit dans ton premier test dans l'affichage sur le moniteur).

LoadzFire:
je n'ai pas compris ce que tu voulais dire ?

C'est pourtant facile, déroule à la main le code de la boucle loop en prenant une température comprise entre 8 et 9°. Tu comprendras le problème.

Ok merci !
Mais pourquoi mon moniteur affiche 8 degrès alors qu'il fait 23 degrès dans ma pièce (avant il affichait 23 degrès !)

C'est quoi votre capteur de Température??

J-M-L:
C'est quoi votre capteur de Température??

un LM35

Il existe plusieurs sortes Le LM35DZ, ( 0 à 100°C), LM35CZ (-40 à 110°C), LM35CAZ -(40 à 110°C mais plus précis +/- 1°C aux extrêmes) - les plus communs sont les DZ quand il n'a rien de marqué donc attention aux températures négatives qui nécessitent d'ailleurs une attention particulière pour l'alimentation)

Souvent il est conseillé de metttre un condensateur de découplage de 100nF entre les broches VCC et GND du capteur (le plus près possible du capteur) - l'avez vous fait ?

Et votre Arduino c'est lequel? Le capteur LM35 ne fonctionne pas en dessous de 4 volts Donc il lui faut une alim dédiée (au moins 5v pour être tranquille) si votre arduino est en 3.3V

Si tout ça est correct, sur un UNO en 5V, sans modification de l'analogRef, Le code suivant dans la loop()doit vous donner la T° en Celsius toute les secondes (bien sûr avec un Serial.begin dans le setup())

int v = analogRead(A0);
float celcius = v * (500.0 / 1023.0);
Serial.println(celcius);
delay(1000);

L'idéal vu la calibration du capteur et la plage de sortie en tension et la précision du CAN sur arduino, est de changer l'analogRef en utilisant dans le setup() un appel à analogReference(INTERNAL); pour un Arduino UNO ou analogReference(INTERNAL1V1); pour un Arduino Mega2560 et bien sûr en adaptant alors la formule en utilisant 110.0 au lieu de 500.0

LoadzFire:
Mais pourquoi mon moniteur affiche 8 degrès alors qu'il fait 23 degrès dans ma pièce (avant il affichait 23 degrès !)

Il y a quatre choses à faire

  1. Vérifies ton câblage, en particulier les faux contacts, composants mal insérés si c'est une breadboard
  2. Vérifies ton câblage
  3. Vérifies ton cablage
  4. Changes de LM35 si tu en as un autre

kamill:
Il y a quatre choses à faire

  1. Vérifies ton câblage, en particulier les faux contacts, composants mal insérés si c'est une breadboard
  2. Vérifies ton câblage
  3. Vérifies ton cablage
  4. Changes de LM35 si tu en as un autre

Ok je vais vérifier mon cablage
Merci JML pour toute ces nformation mon LM35 est un LM35DZ