Forum: Mikrocontroller und Digitale Elektronik DHT11 Sensor am Attiny44 statt Arduino


von Jason T. (diomedes)


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!

von Georg G. (df2au)


Lesenswert?

The crystal ball says, there is an error in line 42.

"I did everything right. But it doesn't work. And I'll not tell you 
exactly what I did".

Did you really expect a different kind of help?

von Jason T. (diomedes)


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.

von Guest (Gast)


Lesenswert?

Do you really expect someone to spend at least 30min on someone elses 
code for nothing?

Debug it yourself. And ask specific questions.

Start from scratch, if necessary.

von Jason T. (diomedes)


Lesenswert?

OK,

A specific question:

"why is the humidity readout in the code used in the Attiny setup "1"?

von Georg G. (df2au)


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.

von Jason T. (diomedes)


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.

von Georg G. (df2au)


Lesenswert?

Der DHT11 ist sehr kritisch im Timing. Warum stoppst du nicht die 
serielle Kommunikation, redest mit dem DHT11 und schaltest dann die 
Kommunikation wieder ein?

von Jason T. (diomedes)


Lesenswert?

ok, Danke für den Tip. Ich probiere das aus...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.