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)
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
// 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();
}
Hier im Nachbar-Thread Arduino Forum 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.
#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
}
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.
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.