18-05-2018, 09:09
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.
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
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