• 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ź
  


Wiadomości w tym wątku
DHT22 wieszanie Arduino przy współpracy z innymi czujnikami - przez damian7563 - 18-05-2018, 09:09

Skocz do:


Przeglądający: 1 gości