Pages: [1]   Go Down
Author Topic: Temperatur & Feuchtigkeitssensor DHT11: digital vs. analog PIN  (Read 1665 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Servus zusammen,

ich blick da noch nicht durch: ich habe den o.g. digitalen Sensor DHT11.
Unter ladyada gibt es eine Class für das Auslesen am digitalen PIN.
Leider hat mein IBOARD Ethernet nur analoge PIN's zur Verfügung (bzw. bin ich noch auf der Suche im IBOARD-Forum, ob nicht doch digitale Pins zur Verfügung stehen).

Allerdings gibt es einen Sketch, der auch an analogen PIN's das Auslesen ermöglicht. Fkt. prima.
Leider ist dieser Sketch (für den analog PIN) noch nicht in einer CLASS und bevor ich diese jetzt erstellen würde kurz gefragt:
An welchen Stellen müßte ich an der Class für den digitalen PIN "schrauben", um an analogen PIN's einsetzen zu können.
Generell daher die Frage: Welche Themen (Programierbefehle, etc.) müssen hier berücksichtigt werden, damit ich evtl. weiter googeln kann.

Danke vorab (noch sehr frisch in der Arduino-Szene)


Hier die Class für den digitalen PIN: http://www.ladyada.net/learn/sensors/dht.html
Hier der Sketch am analogen PIN: http://www.hotcar.de/tag/dht11/  (gibt diesbzgl. noch weitere Quellen)
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du kannst auch die analogen Pins als digitale verwenden, damit sollte das eigentlich kein Problem sein.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


naja, evtl. stelle ich mir das zu trivial vor, aber ändere ich die Zeile im Hinblick auf meine PIN-Belegung, erhalte ich keine Werte.
Lass ich es es mit gleicher PIN-Belegung mit den Sketch für analogen Pins laufen, erhalte ich Ergebnisse.
#define DHTPIN 2     // what pin we're connected to


Code:
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

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

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11


DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");
 
  dht.begin();
}


Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Laut http://arduino.cc/en/Reference/PinMode
Quote
The analog input pins can be used as digital pins, referred to as A0, A1, etc.
solltest Du die Pins wiefolgt verwenden können:
Code:
#define DHTPIN A1
Das wäre dann der zweite analoge Pin (A0 ist der erste).
Mario.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke Mario für den Link & Infos. Habe ich jetzt nachgelesen.

Wie oben gesagt,ich hab ein IBOARD und das hat nur analoge Inputs (so habe ich es zumindest im DS und im Forum verstanden).
IBoard Ethernet http://iteadstudio.com/store/images/produce/Platform/ArduinoCom/IBoard/iBoard_DS.pdf

Hier im Nachbar-Thread http://arduino.cc/forum/index.php?topic=50698.0 wird/wurde auch diskutiert, daß der DHT11 kein analoges Interface hat.
Um so mehr bin ich ja erstaunt, daß der Sketch unten sehr wohl läuft und explizit auf analogen PIN eingeht.
Ich würd gern den Lösungsansatz wissen / verstehen. Allein diese Zeile versteh ich nicht.
    while(!(PINC & _BV(DHT11_PIN)))
Okay..gerade gegoogelt..PINC "bedeutet" bedeutet "direct port reading". Und hier würde mir der Hintergrund bzgl. PINC evtl. weiterhelfen, um diese Thematik digital vs. analog zu verstehen.

Code:
#define DHT11_PIN 0      // define anlog  port 0
 
byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    while(!(PINC & _BV(DHT11_PIN)))
    {};  // wait  forever until anlog input port 0 is '1'   (NOTICE: PINC reads all the analog input ports 
    //and  _BV(X) is the macro operation which pull up positon 'X'to '1' and the rest positions to '0'. it is equivalent to 1<<X.) 
    delayMicroseconds(30);
    if(PINC & _BV(DHT11_PIN))  //if analog input port 0 is still '1' after 30 us
      result |=(1<<(7-i));     //this position is 1
    while((PINC & _BV(DHT11_PIN)));  // wait '1' finish
    }
    return result;
}
 
 
void setup()
{
  DDRC |= _BV(DHT11_PIN);   //let analog port 0 be output port 
  PORTC |= _BV(DHT11_PIN);  //let the initial value of this port be '1'
  Serial.begin(9600);
  Serial.println("Ready");
}
     
void loop()     
{
  byte dht11_dat[5];     
  byte dht11_in;
  byte i;// start condition
       
  PORTC &= ~_BV(DHT11_PIN);    // 1. pull-down i/o pin for 18ms
  delay(18);
  PORTC |= _BV(DHT11_PIN);     // 2. pull-up i/o pin for 40us
  delayMicroseconds(1);
  DDRC &= ~_BV(DHT11_PIN);     //let analog port 0 be input port 
  delayMicroseconds(40);       
   
  dht11_in = PINC & _BV(DHT11_PIN);  // read only the input port 0
  if(dht11_in)
  {
    Serial.println("dht11 start condition 1 not met"); // wait for DHT response signal: LOW
    delay(1000);
    return;
  }
  delayMicroseconds(80);
  dht11_in = PINC & _BV(DHT11_PIN); //   
  if(!dht11_in)
  {
    Serial.println("dht11 start condition 2 not met");  //wair for second response signal:HIGH
    return;
  }
   
  delayMicroseconds(80);// now ready for data reception
  for (i=0; i<5; i++)
  {  dht11_dat[i] = read_dht11_dat();}  //recieved 40 bits data. Details are described in datasheet
   
  DDRC |= _BV(DHT11_PIN);      //let analog port 0 be output port after all the data have been received
  PORTC |= _BV(DHT11_PIN);     //let the  value of this port be '1' after all the data have been received
  byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];// check check_sum
  if(dht11_dat[4]!= dht11_check_sum)
  {
    Serial.println("DHT11 checksum error");
  }
  Serial.print("Current humdity = ");
  Serial.print(dht11_dat[0], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[1], DEC);
  Serial.print("%  ");
  Serial.print("temperature = ");
  Serial.print(dht11_dat[2], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[3], DEC);
  Serial.println("C  ");
  delay(2000);  //fresh time
}

Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn das Board Arduino kompatibel ist, wie Du sagst, dann sind die Ports A0 bis A5 auf der Stiftleiste nach außen geführt. A0 bis A5 sind die "normalen" analog-Pins, mit denen man analoge Signale 0-5V digitalisieren kann (ADC). Allerdings können diese 6 Pins auch als digitale IO-Pins verwendet werden und die Arduino-IDE, von der ich vermute das Du sie verwendest, denn von Deiner Programmierumgebung hast Du leider bisher noch nichts geschrieben, trägt auch Sorge dafür, das die Pins wenn Sie mit einem digitalWrite(), pinMode() und digitalRead() verwendet werden, richtig angesteuert werden.
Hast Du denn mal versucht das Pin "A1" (2. analoges Pin) mit dem Arduino-DHT11 Sketch zu verwenden? Also statt
#define DHTPIN 2
ein
#define DHTPIN A1
zu setzen?
@All: erinnere ich mich richtig, das man bei der Verwendung der analog-Pins als digitale IO-Pins einfach nach der "13" mit der Nummerierung weiter macht? Also "14" für A0, 15 für A1 usw.? Ich bin der Meinung das war so.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sehr gut. Danke Mario. Ich bin jetzt einen Schritt weiter.
Mit #define DHTPIN A1 werden nun Daten angezeigt. Sind allerdings noch falsch; völlig zu hoch. Muss hier noch weitersuchen warum.
Also der entscheidene Tip war A1.

Genau, ich nutze die Arduino 1.0 IDE.
Logged

Pages: [1]   Go Up
Jump to: