DHT11 Sensor am Attiny44 statt Arduino

OP #3722905
Lesenswert?

Hi, folks.

I have a problem.

First what is working:
I have a DHT11 sensor working on an Arduino Uno v3. Via serial I can 
read out the correct values of humidity and temperature. So far no 
problem.

What is not working:
Instead of an Arduino Uno I wanna use an Attiny44 or Attiny84. So I 
connected everything in the correct manner and programmed the Attiny 
with the Arduino Uno, which worked out fine.
However The humidity readings always give out the value "1". I dont use 
serial or software serial but only a green LED to give the value. Thus, 
I know that the readings are not correct.

I use the Attiny with 8MHz clock, so the DHT library should work. I use 
the standard DHT library from the arduino.cc page.

Can anyone think of what's the problem?

Thanks in advance guys!
OP #3722987
Lesenswert?

I did at least expect a non-sarcastic answer, or a more polite way of 
requesting more information.

Anyway,

here is the kind of code that I use. The humidity check does not work, 
since the value humidity read out is "1" and not the correct value:

I am using that code on the Attiny setup:
1
 #include <dht11.h>
2
dht11 DHT11;
3
#define DHT11PIN 0     
4
 
5
const int buttonPin = (4);
6
int tempPin = (A1);
7

8
int ledRot = (3); //onboard LED
9
//int ledGruen = (3);
10
float val1;  //Temperatur LM35
11
float val4;  //Luftfeuchtigkeit DHT11
12

13
byte foilPower = 0; //Leistungswert der PWM
14
int buttonState = 0; //Knopfdruckvariable
15
int old_buttonState = 0; //Alte Knopfdruckvariable
16

17
int val2 = 0; //Hilfsvariable
18

19
void setup()
20
{
21
  analogReference(INTERNAL);
22
  pinMode(1, OUTPUT);
23
  pinMode(buttonPin, INPUT);
24
  pinMode(ledRot,OUTPUT);
25
  //pinMode(ledGruen,OUTPUT);
26

27
} 
28

29
void loop()
30
{
31
  
32
//1) 
33
//Ein-Ausschalter:  
34
    buttonState = digitalRead(buttonPin);
35
    
36
    if((buttonState==HIGH) && (old_buttonState==LOW)) {
37
      
38
      val2 = 1-val2;
39
      delay(10);
40
      }
41
    old_buttonState = buttonState;
42

43
//2)
44
//start if    
45
    if (foilPower != 119) {    
46
      if (val2==1) {
47
      foilPower = 255;
48
    }
49
    else {
50
      foilPower = 0;
51
    }
52
    }
53
//end if    
54

55
//3)
56
//start id
57
    if (val2==0) {
58
      foilPower = 0;
59
    }   
60
//end if
61

62
//4)
63
//Temperaturauslesung LM35 inkl. Umrechnung:    
64
    val1=(analogRead(tempPin)/9.31);
65

66
//6)   
67
//Luftfeuchtigkeitsauslesung DHT11:
68
    val4=DHT11.humidity;
69
  
70
//7)    
71
//Temperaturabhängige Leistungsregulation. Soll-Temperatur: 60° C:    
72
    if (foilPower >0) {
73
      if (val1>60) {
74
        foilPower = 119;
75
      }
76
      else (foilPower = 255);
77
    }
78
    analogWrite(1,foilPower);
79
/*
80
//8)
81
//Abschaltautomatik wenn Luftfeuchtigkeit <=60.
82
    if (val1 >55) {
83
      if (val4 <= 60) {
84
        foilPower = 0;
85
        val2 = 0;
86
        
87
      }
88
    }
89
*/    
90
//LED rot
91
 if (val4 = 1) {
92
  digitalWrite(ledRot,HIGH);
93
 }
94
 else {
95
  digitalWrite(ledRot,LOW); 
96
 }
97
}


I am using that code on the Aduino setup
1
#include "DHT.h" //von ladyada: https://github.com/adafruit/DHT-sensor-library
2

3
#define DHTPIN 4     // benutzter ARDUINO-Pin
4
#define DHTTYPE DHT11   // unser Sensor: DHT11
5

6
DHT dht(DHTPIN, DHTTYPE);
7

8
const int buttonPin = 2;
9
int tempPin = (A0);
10

11
int LED = 13; //onboard LED
12
float val1;  //Temperatur LM35
13
float val3;  //Temperatur DHT11
14
float val4;  //Luftfeuchtigkeit DHT11
15
//float dhtEinzelWerte[20];
16

17
byte foilPower = 0; //Leistungswert der PWM
18
int buttonState = 0; //Knopfdruckvariable
19
int old_buttonState = 0; //Alte Knopfdruckvariable
20

21
int val2 = 0; //Hilfsvariable
22

23

24

25
void setup()
26
{
27
  Serial.begin(9600);
28
  analogReference(INTERNAL);
29
  pinMode(3, OUTPUT);
30
  pinMode(buttonPin, INPUT);
31
  pinMode(LED,OUTPUT);
32
  dht.begin(); 
33
} 
34

35
void loop()
36
{
37
  
38
//1) 
39
//Ein-Ausschalter:  
40
    buttonState = digitalRead(buttonPin);
41
    
42
    if((buttonState==HIGH) && (old_buttonState==LOW)) {
43
      
44
      val2 = 1-val2;
45
      delay(10);
46
      }
47
    old_buttonState = buttonState;
48

49
//2)
50
//start if    
51
    if (foilPower != 119) {    
52
      if (val2==1) {
53
      foilPower = 255;
54
    }
55
    else {
56
      foilPower = 0;
57
    }
58
    }
59
//end if    
60

61
//3)
62
//start id
63
    if (val2==0) {
64
      foilPower = 0;
65
    }   
66
//end if
67

68
//4)
69
//Temperaturauslesung LM35 inkl. Umrechnung:    
70
    val1=(analogRead(tempPin)/9.31);
71

72
//5)        
73
//Temperaturauslesung DHT11:
74
    val3=dht.readTemperature();    
75

76
//6)    
77
//Luftfeuchtigkeitsauslesung DHT11:
78
    val4=dht.readHumidity();;
79
 
80
    
81
// Ausgabe der Daten seriell:
82
    Serial.print(val1,1);  //Temperatur LM35
83
    Serial.print(" ");
84
    //Serial.print(val3,1);  //Temperatur DHT11
85
    //Serial.print(" ");
86
    Serial.print(val4,1);    //Luftfeuchtigkeit DHT11
87
    Serial.print("\n");   
88
    delay(50);
89
    
90
//7)    
91
//Temperaturabhängige Leistungsregulation. Soll-Temperatur: 60° C:    
92
    if (foilPower >0) {
93
      if (val1>60) {
94
        foilPower = 119;
95
      }
96
      else (foilPower = 255);
97
    }
98
    analogWrite(3,foilPower);
99

100
//8)
101
//Abschaltautomatik wenn Luftfeuchtigkeit <=60.
102
    if (val1 >55) {
103
      if (val4 <= 60) {
104
        foilPower = 0;
105
        val2 = 0;
106
      }
107
    }
108
    
109
//LED 13
110
 if (foilPower >0) {
111
  digitalWrite(LED,HIGH);
112
 }
113
 else {
114
  digitalWrite(LED,LOW); 
115
 }
116
}

Do you think that the lack of serial usage in the first code is the 
error?

If you need any more information please let me know.
#3723094
Lesenswert?

Eine ganz andere, dumme Frage: Aus den deutschen Kommentaren schließe 
ich, dass Deutsch deine Muttersprache ist. Warum schreibst du dann in 
einem deutschen Forum deine Fragen in Englisch?

Im Arduino funktioniert alles (sagst du). Wenn du einen anderen CPU Typ 
nimmst, funktioniert nur die Temperatur und nicht die Feuchte (so 
interpretiere ich deine Fehlermeldung).
Daraus würde ich schließen, dass der Fehler in der DHT11-Lib liegt, dass 
dort etwas sehr CPU spezifisch geschrieben ist.

Andererseits ist diese Zeile
 val4=DHT11.humidity;
verdächtig. Denn in der Arduino Version liest sie sich als
 val4=DHT11.humidity();

Und dein Compiler gibt dir keine Warnung? Du machst aus einer 
Funktionsadresse offenbar einen Float Wert. Seltsam. Aber Arduino ist 
nicht so ganz meine Welt.
OP #3723167
Lesenswert?

@Georg:

Wenn man "Neuer Beitrag" anklickt, erscheint ein Hinweis, dass, wenn man 
den Beitrag auf Englisch schriebe, eine größere Zielgruppe angesprochen 
würde. Habe aber verpeilt, dass ich dafür das andere Forum bzw. den Link 
hätte anklicken müssen ;). Daher war der Beitrag auf Englisch.

Ich vermute auch, dass die Funktionsweise CPU-spezifisch ist. Ich kriege 
stets den Wert "1" bei den Attiny44, 84 und 85 raus. Einen Atmel habe 
ich nicht zur Hand, vermute aber, dass es, wie beim Arduino, 
funktionieren würde.

Danke für den Hinweis. Der Unterschied im Befehl "()" liegt daran, dass 
ich im Code beim Arduino setup eine andere DHT lib verwende als für das 
Attiny setup. Ich habe aber beide libs bei beiden setups ausprobiert. 
Immer das gleiche Problem.

Ich vermute, dass es was mit der seriellen Kommunikation zu tun hat. Das 
kann ich aber gerade nicht testen, da ich kein Kabel dafür zur Hand habe 
(also vom Steckbrett von den Pins zum USB Port am PC). Ich schätze, man 
kann die Signale über das Arduino zum PC weiterleiten. Ich muss mich da 
aber erst mal rein lesen. Hätte ja sein können, dass bereits jemand auf 
dieses Problem gestoßen ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren