Go Down

Topic: digitalWrite(led, HIGH); não funciona no código. (Read 177 times) previous topic - next topic

alessandrocm

Preciso que um led acenda quando a temperatura ultrapassar um determinado valor mas não sei no que estou errando no código abaixo. 
No monitor serial vejo a temperatura passar do limite para acender o LED mas não acontece nada.
Isso só acontece com o código que está lendo a temperatura, testei o mesmo pino com o código de exemplo abaixo e funcionou perfeitamente :


Código que funcionou o LED :

int led = 13;
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
delay(500);
}




Código que NÃO funcionou o LED :

Include <DHT.h>

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT dht(DHTPIN, DHTTYPE);

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x00, 0x23, 0x36
}; //MAC address found on the back of your ethernet shield.
IPAddress ip(192, 168, 1, 111); // IP address dependent upon your network addresses.

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

// Setando pino do LED
int led = 13; //Pino onde esta ligado o led.

void setup() {
  pinMode(led, OUTPUT); //define o pino 13 como saída
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  dht.begin();

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
 
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  //Acende o LED
  if (t > 25)
  {
    Serial.println("Temperatura Alta");
    digitalWrite(led, HIGH);
    delay(3000);
  }

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
  }

  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");

          // output the value of the DHT-11
          client.println("<H2>");
          client.print("Humidity: ");
          client.println("</H2>");
          client.println("<p />");
          client.println("<H1>");
          client.print(h);
          client.print(" %\t");
          client.println("</H1>");
          client.println("<p />");
          client.println("<H2>");
          client.print("Temperature: ");
          client.println("</H2>");
          client.println("<H1>");
          client.print(t * 1.8 + 32);
          client.println(" °");
          client.println("F");
          client.println("</H1>");



          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

bubulindo

#1
Nov 04, 2015, 04:28 pm Last Edit: Nov 04, 2015, 04:31 pm by bubulindo
Tens aqui vários problemas...

Um deles é o uso do delay. Apaga delays com um valor superior a 10 porque não deviam lá estar a podem causar problemas que não entendes.

Depois, o teu código para acender o led assume que a medição da temperatura é correcta... no entanto, só após tentares ligar o LED é que vês se a temperatura  foi correctamente lida.

Isto:

Code: [Select]
  //Acende o LED
  if (t > 25)
  {
    Serial.println("Temperatura Alta");
    digitalWrite(led, HIGH);
    delay(3000);
  }

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
  }


Devia ser isto:

Code: [Select]
  //Acende o LED
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
    if (t > 25.0)
      {
       Serial.println("Temperatura Alta");
       digitalWrite(led, HIGH);
       }
  }


O teu problema é que tu tens um shield Ethernet ligado no Arduino... shield esse que faz uso do protocolo SPI.
Se fores ver o esquemático do Arduino vais reparar que os pinos SPI são usados para comunicar com o shield Ethernet e como tal não podes usar o LED ligado nesse pino.

Assim de repente, sempre que alguma coisa conecta ao teu arduino via Ethernet, deves ver o led a piscar, julgo eu...

Muda para um pino que não esteja a ser usado (o pino 2, por exemplo) e liga um LED exterior e vais ver que funciona.

Por último, não tens código para detectar que a temperatura voltou ao normal e desligar o LED...
This... is a hobby.

alessandrocm

Obrigado meu amigo.
Só vou poder testar a noite.
Posto o resultado aqui.
Abraço.

alessandrocm

Obrigado pela ajuda meu amigo, funcionou perfeitamente !

Desconhecia que não podia utilizar alguns pinos quando é utilizado algum shield.
Pesquisei e agora estou mais preparado, sou iniciante ainda.

O código ficou assim :


 // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 float h = dht.readHumidity();
 float t = dht.readTemperature();


 // check if returns are valid, if they are NaN (not a number) then something went wrong!
 if (isnan(t) || isnan(h)) {
   Serial.println("Failed to read from DHT");
 } else {
   Serial.print("Humidity: ");
   Serial.print(h);
   Serial.print(" %\t");
   Serial.print("Temperature: ");
   Serial.print(t);
   Serial.println(" *C");

   //Acende o LED
   if (t > 25)
   {
     Serial.println("Temperatura Alta");
     digitalWrite(led, HIGH);
   } else {
     digitalWrite(led, LOW);
   }

 }

bubulindo

This... is a hobby.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy