• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
DHT22 wieszanie Arduino przy współpracy z innymi czujnikami
#1
Witajcie. 

Po krótce, mam problem z czujnikiem DHT22. Uruchamiając sam czujnik, działa on bez problemu. Uruchamiając go z pozostałymi czujnikami wiesza on arduino, a dokładniej zamraża, jedynie co ratuje to RESET. Szukałem podobnym tematów, ale bez skutku. 

Kod:
// ******************************************Biblioteki
#include <DHT.h>
#include <Timers.h>
#include <HCSR04.h>
//#include <Arduino.h>
#include "BasicStepperDriver.h"
#include <BH1750.h>
#include <SFE_BMP180.h>
#include <Wire.h>
#include <OneWire.h>
#include <DS18B20.h>
#include "looper.h"
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// ****************************************Definiowanie zmiennych
// PinDS18B20
#define ONEWIRE_PIN 2
#define SENSORS_NUM 2
//DHT22
#define DHTPIN 31
#define DHTTYPE DHT22
//BMP180
#define ALTITUDE 165.0
//bluetooth
#define serial Serial
//krokowy
#define MOTOR_STEPS 200
#define RPM 60
#define MICROSTEPS 2
#define DIR 51
#define STEP 49

// *****************************************Konfiguracja
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // LCD I2C
looper myScheduler; //przerwania krokowy
Timers <4> akcja; // procesy
BasicStepperDriver stepper(MOTOR_STEPS, DIR, STEP);
OneWire onewire(2);
DS18B20 sensors(&onewire);
SFE_BMP180 pressure;
BH1750 lightMeter;
HCSR04 hc(4, 5);
Servo myservo;
Servo myservo1;
DHT dht(DHTPIN, DHTTYPE);
//*************************************** Adresy czujnikow DS18
const byte address[SENSORS_NUM][8] PROGMEM = {
 0x28, 0xC7, 0x7A, 0xED, 0x9, 0x0, 0x0, 0x8E, //szklarnia
 0x28, 0xFF, 0xA4, 0xAD, 0xC1, 0x17, 0x4, 0x4B //zbiornik
};
// ******************************************Zmienne
String readString, data;
int CD, CM, CT, CS, BR;
char c;

char status;  //BMP
double T, P, pres; //BMP
float rain = 0; //deszczu
float mois = 0; //wilgotnosci
float temp, temp1, t, a, b,h; //temperatura, temp.zbiornik, *wilgotnosc, temp.dht, dystans,litry
uint16_t lux = 0;
int i = 0;
int d = 0;
int  set_rain,  lux_kr;
int kran_sciana = 0;
int kran_drzwi = 0;
float hum;
float set_temp = 28; //ust. temp
float set_max_temp = 30;
float set_mois = 50; //ust. wilg
float set_lux = 50; //ust. swiatla
float max_lux = 500;
float humidity;



void setup() {

akcja.attach(0,500,wilg);
akcja.attach(1,2000,czujniki);
akcja.attach(2,1500,blutu);
akcja.attach(3,1250,wysw);



 while (!Serial);
 Serial.begin(9600);
 dht.begin();
 lcd.begin(20,4);   // initialize the lcd for 16 chars 2 lines, turn on backlight
 sensors.begin();

 sensors.request();
 pressure.begin();
 lightMeter.begin();
 stepper.begin(RPM, MICROSTEPS);


 pinMode(A0, INPUT);//cz.deszczu
 pinMode(A1, INPUT);// cz. wilgotnosci
 //pinMode(6, OUTPUT);// przekaznik WOLNY
 pinMode(7, OUTPUT);// przekaznik_GRZALKA
 pinMode(8, OUTPUT);// przekaznik_WYCIAG
 pinMode(9, OUTPUT);// przekaznik_NAWIEW (WIEKSZE NIZ 12V)
 pinMode(42, OUTPUT);// przekaznik_POMPA
 pinMode(44, OUTPUT);// przekaznik_LED
 pinMode(45, INPUT_PULLUP); //krancowka sciana
 pinMode(53, INPUT_PULLUP); //krancowka drzw
 pinMode( 48 , OUTPUT );//sleep
 digitalWrite( 48, LOW );
 myservo.attach(50);  // zdefiniowanie do którego portu podłączone jest serwo
 myservo1.attach(52);

//  myScheduler.addJob(loop1, 3);//przerwania
//  myScheduler.addJob(loop2, 3);

 for(int i = 0; i< 3; i++) //jasnosc lcd
  {
   lcd.backlight();
   delay(250);
   lcd.noBacklight();
   delay(250);
  }
 lcd.backlight();

}



void loop() {
//  digitalWrite (48, HIGH);
// stepper.rotate(-100);
// digitalWrite (48, LOW);
// akcja.process();

 akcja.process();


 //**************************** krok

/* if ( (kran_sciana == 1) and (kran_drzwi ==0) and (lux_kr ==1)){
   // digitalWrite(47, HIGH);
    myScheduler.restartJob(loop1);}
    else{
   // digitalWrite(47, LOW);
     myScheduler.pauseJob(loop1);      
    }

      if ( (kran_sciana == 0) and (kran_drzwi ==1) and (lux_kr ==0)){
   // digitalWrite(47, HIGH);
    myScheduler.restartJob(loop2);}
    else{
   // digitalWrite(47, LOW);
     myScheduler.pauseJob(loop2);
    }

     myScheduler.scheduler();

*/

 }
 

//************************************************************************************************
void czujniki(){
 status = pressure.startTemperature();
 delay(status);
 status = pressure.getTemperature(T);
 status = pressure.startPressure(3);
 delay(status);
 status = pressure.getPressure(P, T);

 if (sensors.available())
   {
     temp = sensors.readTemperature(FA(address[0]));  //DS szklarnia
     temp1 = sensors.readTemperature(FA(address[1])); //DS zbiornik
     pres = pressure.sealevel(P, ALTITUDE); // cisnienie
     rain = ((1023 - analogRead(A0)) / 10.23);//deszczu
     mois = ((1023 - analogRead(A1)) / 10.23);//wilgotn
     lux = lightMeter.readLightLevel();
     a = hc.dist();
//     kran_sciana = digitalRead(45);
//     kran_drzwi = digitalRead(53);

     sensors.request();      
    }

//    float  h = dht.readHumidity();
//***********************************************opady
   
   if ( rain > 65)
     d=3;//duze
   else if (rain < 65 and rain>40)
     d=2;//przelotne
   else if (rain < 40 and rain >10)
     d=1;//znikome
   else if (rain < 10)
     d=0;//brak


   if ( rain > 65) {
     set_rain = 1;
    }
    else
     set_rain = 0;
//***********************************************zbiornik

   if ( a >= 21.7)
     b=0;
   else if (a<21.7 and a>18.8)
     b=0.1;
   else if (a<18.8 and a>17.65)
     b=0.2;
   else if (a<17.65 and a>16.35)
     b=0.3;
   else if (a<16.35 and a>15.10)
     b=0.4;
   else if (a<15.10 and a>13.40)
     b=0.5;
   else if (a<13.4 and a>11.65)
    b=0.6;
   else if (a<11.65 and a>9.6)
     b=0.7;
   else if (a<9.6 and a>7.95)
     b=0.8;
   else if (a<7.95 and a>6.4)
     b=0.9;
   else if (a<6.4 and a>4.2)
     b=1;

 //**********************************
 if ( mois < set_mois) {
   digitalWrite(42, LOW);
 }
 else
 digitalWrite(42, HIGH);

 //*********************************temperatura  dopisac serwo

 if ((temp < set_temp)) {
   digitalWrite(7, LOW);

 }
 else
   digitalWrite(7, HIGH);

 if (temp < (set_max_temp) and (set_rain == 0)) {
   myservo.write(45);              //  LEWE
   myservo1.write(45);              // PRAWE
 }
 else{
   myservo.write(8);              //  LEWE
   myservo1.write(8);}             // PRAWE

 if (temp < (set_max_temp) and (set_rain == 1)) {
   digitalWrite( 9, LOW );
   digitalWrite( 8, LOW );
 }
 else
   digitalWrite( 9, HIGH );
 digitalWrite( 8, HIGH );

 //********************************* swiatlo

 if (lux < set_lux) { //ok
   digitalWrite(44, LOW);
 }
 else
   digitalWrite(44, HIGH);

 if (lux > max_lux) { //ok
   lux_kr = 1;
 }
 else
   lux_kr = 0;
}


//****************************************************************************************************
void wilg(){

      h = dht.readHumidity(); //wilgotnosc
     t = dht.readTemperature();  //temp dht


}
//****************************************************************************************************
void blutu(){
   float h = (float)humidity;

 if (Serial.available())  {
   char c = Serial.read();  //gets one byte from serial buffer
   if (c == 'r'){
      serial.println("<r>");
       serial.print("<t>");
     Serial.print(temp);
       serial.println("</t>");

       serial.print("<tm>");
     Serial.print(set_temp);
       serial.println("</tm>");

       serial.print("<tx>");
     Serial.print(set_max_temp);
       serial.println("</tx>");

       serial.print("<tz>");
     Serial.print(temp1);
       serial.println("</tz>");
       
       serial.print("<gl>");
     Serial.print(mois);
       serial.println("</gl>");
       
       serial.print("<po>");
     Serial.print(h);
       serial.println("</po>");
       
       serial.print("<sw>");
     Serial.print(lux);
       serial.println("</sw>");

       serial.print("<sm>");
     Serial.print(set_lux);
       serial.println("</sm>");

       serial.print("<sx>");
     Serial.print(max_lux);
       serial.println("</sx>");

       serial.print("<ci>");
     Serial.print(pres, 2);
       serial.println("</ci>");

      if (d == 0){
       serial.print("<oy>");
     Serial.print("Brak");
       serial.println("</oy>");
      }
      else if (d == 1){
       serial.print("<oy>");
     Serial.print("Znikome");
       serial.println("</oy>");
      }
      else if (d == 2){
       serial.print("<oy>");
     Serial.print("Przelotne");
       serial.println("</oy>");
      }
      else if (d == 3){
       serial.print("<oy>");
     Serial.print("Duze");
       serial.println("</oy>");
      }

       serial.print("<ro>");
     Serial.print(b);
       serial.println("</ro>");

      serial.println("</r>");
     
   }
}


 if (c == ',') {
     Serial.println(readString); //prints string to serial port out
     
     if(readString.indexOf("CD") >=0) {
       data=readString.substring(2);
       //Serial.print("CD is: ");
       Serial.println(data);
       set_temp = data.toInt();
       //Serial.println(CD);
       //Serial.println();
     }
     if(readString.indexOf("CM") >=0) {
       readString=readString.substring(2);
       //Serial.print("CM is: ");
       Serial.println(readString);
       set_max_temp = readString.toInt();
       //Serial.println(CM);
       //Serial.println();
     }
     if(readString.indexOf("CT") >=0) {
       readString=readString.substring(2);
      // Serial.print("CT is: ");
       Serial.println(readString);
       set_lux = readString.toInt();
      // Serial.println(CT);
       //Serial.println();
     }
      if(readString.indexOf("CS") >=0) {
       readString=readString.substring(2);
      // Serial.print("CS is: ");
       Serial.println(readString);
       set_mois = readString.toInt();
      // Serial.println(CS);
       //Serial.println();
     }
      if(readString.indexOf("BR") >=0) {
       readString=readString.substring(2);
       //Serial.print("BR is: ");
       Serial.println(readString);
       max_lux = readString.toInt();
      // Serial.println(BR);
      // Serial.println();
     }

     readString=""; //clears variable for new input
     data="";
   }  
   else {    
     readString += c; //makes the string readString
   }
 
}
 
//********************************************************************************************************
void wysw(){
 lcd.clear();
 
 lcd.setCursor(0,0);
 lcd.print("T:");
 lcd.print(temp);
 lcd.print("*C");
 lcd.setCursor(10,0);
 lcd.print("Tz:");
 lcd.print(temp1);
 lcd.print("*C");

 lcd.setCursor(0,1);
 lcd.print("S:");
 lcd.print(lux);
 lcd.print("lx");
 lcd.setCursor(11,1);
 lcd.print("Z:");
 lcd.print(b);
 lcd.print("L");

 lcd.setCursor(0,2); //Start at character 4 on line 0
 lcd.print("Wg:");
 lcd.print(mois);
 lcd.print("%");
 lcd.setCursor(10,2);
 lcd.print("Wp:");
 lcd.print(h);
 lcd.print("%");

 lcd.setCursor(0,3); //Start at character 4 on line 0
 lcd.print("C");
 lcd.print(pres);
 lcd.print("hPa");
 
}
//********************************************************************************************************
void loop1(){
 digitalWrite (48, HIGH);
 stepper.rotate(-100);
 digitalWrite (48, LOW);          
}

void loop2(){
 digitalWrite (48, HIGH);
 stepper.rotate(66450);
 digitalWrite (48, LOW);          
}

Biblioteka: DHT-master 


Samo DHT działa bez problemu, z tym kodem już nie. Dawałem zewnetrzne zasilanie, również nie pomogło. Usuwałem funkcje bluetooth, lcd i przerwań, ale bez zmian. Dawałem wszystko w jedną pętle, zwiększałem opóźnienie, również nic to nie dało. Ktoś coś podpowie? Zawieszanie się nie jest w kółko po określonym czasie. Raz działa bez problemu 10min, a raz wiesza po 30sek 
 
Odpowiedź
#2
Wrzuć tu bibliotekę Timers.h.  Zapewne ona miesza się z tą do DHT. Albo inaczej poukładaj sobie zadania w pętli, albo zastosuj czujnik na I2C. W każdym wypadku funkcja akcja.attach(1,2000,czujniki); nie będzie dobrze działać na program. Każdy czujnik osobno powinieneś tak wywoływać i już taka akcja trwa długo w świecie procków (po kilkadziesiąt ms każdy czujnik). Potem sobie zebrać dane w innej i porobić z nimi co tam potrzebujesz.
Posprawdzaj sobie ile trwają bloki kodu w tej funkcji.

Kod:
uint32_t start=micros();
costam();
uint32_t stop=micros();
uint32_t iletrwalo=stop-start;
Serial.println(iletrwalo);

Odczyt DS może trwać 25ms, ale pod warunkiem że włączysz mu tryb asynchroniczny - każesz mierzyć i koniec, wracasz za jakiś czas, odczytujesz i każesz mierzyć. Albo każesz mierzyć bo za 1s wynik będzie potrzebny, wracasz za tę 1s i odczytujesz tylko.  W międzyczasie procesor ogarnia resztę kodu. W bibliotece od Adafruit DallasTemperature jest do tego specjalna funkcja, sprawdź jak jest w tej. Bez tego odczyt trwa 750ms, dwa czujniki to 1500ms, do tego delay przy odczycie ciśnienia (dlaczego nie robisz tak jak przy DS, odczyt i wezwanie do nowego pomiaru). Jak taka funkcja trwa Ci 5000 ms to albo ta wywoływana co 500 ms się nie wykonuje albo przerywa działanie tej.  Zastanów się też jak często  potrzebujesz sprawdzać temperaturę/wilgotność. Jak dwa pomiary zajmują Ci 1200ms, to wywoływanie ich co 1s zabiera 120% mocy obliczeniowej procka, czego oczywiście nie masz. Jak to samo wywołasz co 60s to już zabiera 2%, no czasem tylko animacja na ekranie dostanie czkawki (gdybyś taką miał). A jakbyś miał taką funkcję rozbitą dla każdego czujnika i to w trybie asynchronicznym to pykasz sobie po 25ms na każdą sekundę i odczyty możesz mieć nawet co 5s bez istotnego obciążenia procesora.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości