Vai al contenuto
PLC Forum


Arduino-sensore dht11 e motore dc


Ivan037

Messaggi consigliati

Buongiorno a tutti,sono alla prime armi con arduino e ho un problema con uno sketch.Devo fare in modo che se il sensore dht11 rilevi una temperatura al di sopra di una certa soglia lo scriva sul serial monitor e mi faccia partire il buzzer 3 secondi prima di far partire il motore dc.Il problema che si presenta è che quando finisce di suonare il buzzer il motore non fa neanche il tempo di partire che riparte il tutto e mi fa risuonare il buzzer

 if(temperatura>20){
  
    Serial.println("La temperatura è superiore a 30°");
    digitalWrite(buzzerPin, HIGH);
  Serial.print("Umidità: ");
  Serial.println(umidita);
  Serial.println("%");
  Serial.print("Temperatura: ");
  Serial.println(temperatura);
  Serial.println("°C ");
    delay(3000);
    digitalWrite(buzzerPin, LOW);
    digitalWrite(enablePin, HIGH);
    digitalWrite(motor1APin, HIGH);
    digitalWrite(motor2APin, LOW);

Questa è la parte che mi da problemi,ringrazio tutti quelli che mi aiuteranno

Link al commento
Condividi su altri siti


Devi pubblicare tutto la funzione "void loop()" e specificare cosa comandano i 2 pins motor1APin e motor2APin.

 

Credo di aver intuito il motivo del difetto che lamenti, ma per averne certezza devo leggere l'intera funzione.

Link al commento
Condividi su altri siti

void loop() {
  
  delay(2000);
 
  float umidita = dht.readHumidity();
  

  float temperatura = dht.readTemperature();
 

    if (isnan(umidita) || isnan(temperatura)) { 
    Serial.println("Impossibile leggere la temperatura,verifica il collegamenti");
    return;
  }
  if(temperatura>20){
  
    Serial.println("La temperatura è superiore a 20°");
    digitalWrite(buzzerPin, HIGH);
  Serial.print("Umidità: ");
  Serial.println(umidita);
  Serial.println("%");
  Serial.print("Temperatura: ");
  Serial.println(temperatura);
  Serial.println("°C ");
    delay(3000);
    digitalWrite(buzzerPin, LOW);
    digitalWrite(enablePin, HIGH);
    digitalWrite(motor1APin, HIGH);
    digitalWrite(motor2APin, LOW);
    
  }
  else {
  Serial.print("Umidità: ");
  Serial.println(umidita);
  Serial.println("%");
  Serial.print("Temperatura: ");
  Serial.println(temperatura);
  Serial.println("°C ");
    digitalWrite(enablePin, HIGH);
    digitalWrite(motor1APin, LOW);
    digitalWrite(motor2APin, LOW);
    }

I pin motor1APin e motor2APin servono per pilotare il motore,in questo caso non è importante il senso di rotazione.L'integrato che sto usando è L293D

Link al commento
Condividi su altri siti

E come avevo immaginato.

Non può che fare in quel modo, visto che ripete il ciclo continuamente.

Devi arrangiare diversamente, qualche cosa come questo.

 do
  {
    digitalWrite(enablePin, HIGH);
    digitalWrite(motor1APin, HIGH);
    digitalWrite(motor2APin, LOW);
   } while (flg_motor_run == HIGH); 

 

Non farlo così pari pari perchè rischi di non uscirne più, ma il senso è quello: una volta che il motore gira non devi più metterlo nella sequenza.

Io farei il test di temperatura ad ogni ciclo, poi attiverei il buzzer solo solo al primo superamento della soglia, poi, quando il vaslore di temperatura scende nuovamente sotto la soglia abiliterei nuovamente le condizioni per far suonare i cicalino.

 

Non ti scrivo il codice, perchè devi provarci tu

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...