Go Down

Topic: Conflitto sensori DHT22 e BMP280 (Read 257 times) previous topic - next topic

Otello37

Arduino Yun, sto sperimentando un po di sensori sulla stessa basetta e tutto funzionava magnificamente finche' non ho aggiunto l'ultimo BMP280 (Gravity), quest'ultimo funziona e mi restituisce i valori di pressione, altitudine e temp. ma subito dopo il suo avvio si blocca il DHT22, che smette di mandate i dati.
Il BMP280 è un I2C il DHT22 no. Non capisco l'interferenza  :smiley-confuse:

Non c'è un flusso continuo di dati, in pratica attivo delle chiamate via ssh (da terminale remoto o cell) sullo YUN che è in rete ovviamente, il ciclo void-loop attende e verifica i comandi che io mando e poi partono delle chiamate ai vari sensori, led, rele. 

Premetto che singolarmente con i relativi sketch, i sensori, funzionano entrambi, quindi si esclude problema hardware e forse anche problema di connessione.

Posto anche il codice, quello decommentato è la parte relativa al BMP280.

Code: [Select]

//#include <Wire.h>
//#include "DFRobot_BMP280.h"
#include <Ultrasonic.h>
#include <Console.h>
#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to DHT
#define DHTTYPE DHT22   // DHT 22  (AM2302)

// Definizione dei pin
int ledverde = 10;
int ledgiallo = 11;
int ledrosso = 12;
int buzzerPin = 9;
int rele1 = 7;
int rele2 = 8;

//DFRobot_BMP280 bmp; // Initialize BMP280 sensors
DHT dht(DHTPIN, DHTTYPE);   // Initialize DHT sensor for normal 16mhz Arduino
Ultrasonic ultrasonic(5, 6); //(trig, echo)

String name;

void setup() {
   // Initialize Console and wait for port to open:
  //bmp.begin();
  dht.begin();
  Bridge.begin();
  Console.begin();
  // Wait for Console port to connect
  while (!Console);
 
  pinMode(ledrosso, OUTPUT);
  pinMode(ledgiallo, OUTPUT);
  pinMode(ledverde, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);
  digitalWrite(rele1, HIGH);
  digitalWrite(rele2, HIGH);
 
  Console.println("Console operativa...");
  meteo();
  //meteo2();
  statoled();
  statorele();
}

void meteo(){
 // Wait a few seconds between measurements.
  dht.begin();
  delay(500);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
 
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Console.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index
  // Must send in temp in Fahrenheit!
  float hi = dht.computeHeatIndex(f, h);
  //Console.println("\n");
  Console.println("╔╦╗╔═╗╔╦╗╔═╗╔═╗");
  Console.println("║║║║╣  ║ ║╣ ║ ║");
  Console.println("╩ ╩╚═╝ ╩ ╚═╝╚═╝"); 
  Console.println("--------------------");
  Console.print("Humidity:    ");
  Console.print(h);
  Console.println(" %");
  Console.print("Temperature DHT: ");
  Console.print(t);
  Console.println(" *C ");
  Console.print("Heat index:  ");
  Console.print(hi);
  Console.println(" *F");
  Console.print("Distance in cm: ");
  Console.println(ultrasonic.distanceRead());
  Console.println("--------------------");
}

/*void meteo2(){
  bmp.begin();
  delay(500);
  Console.println("╔╦╗╔═╗╔╦╗╔═╗╔═╗");
  Console.println("║║║║╣  ║ ║╣ ║ ║");
  Console.println("╩ ╩╚═╝ ╩ ╚═╝╚═╝"); 
  Console.println("--------------------");
  Console.print("Temperature: ");
  Console.print(bmp.readTemperatureValue());
  Console.println(" Pressure: ");
  Console.print(bmp.readPressureValue());
  Console.println(" Altitude:");
  Console.println(bmp.readAltitudeValue());
}
*/
void statoled(){                  //funzione che stampa lo stato dei led: accesi
                                 // o spenti
  Console.println("╔═╗╔╦╗╔═╗╔╦╗╔═╗  ╦  ╔═╗╔╦╗");
  Console.println("╚═╗ ║ ╠═╣ ║ ║ ║  ║  ║╣  ║║");
  Console.println("╚═╝ ╩ ╩ ╩ ╩ ╚═╝  ╩═╝╚═╝═╩╝");                                 
  Console.println("---------------");
  Console.print("LED Verde  -  ");
  Console.println(digitalRead(10));
  Console.print("LED Giallo -  ");
  Console.println(digitalRead(11));
  Console.print("LED Rosso  -  ");
  Console.println(digitalRead(12));
  Console.println("---------------");
   
}

void statorele(){                  //funzione che stampa lo stato dei led: accesi
                                  // o spenti
  Console.println("╔═╗╔╦╗╔═╗╔╦╗╔═╗  ╦═╗╔═╗╦  ╔═╗");
  Console.println("╚═╗ ║ ╠═╣ ║ ║ ║  ╠╦╝║╣ ║  ║╣ ");
  Console.println("╚═╝ ╩ ╩ ╩ ╩ ╚═╝  ╩╚═╚═╝╩═╝╚═╝");                                 
  if (digitalRead(7) == 0) {Console.println("Rele1      -  1");} else { Console.println("Rele 1     -  0");}
  if (digitalRead(8) == 0) {Console.println("Rele2      -  1");} else { Console.println("Rele 2     -  0");}
  Console.println("---------------");
  Console.println("Attendo istruzioni...");
}

void suono_on(){                //suono accensione LED
  tone(buzzerPin, 5000, 100);
  delay(300);
  noTone(buzzerPin);
}

void suono_off(){               //suono spegnimento LED
  tone(buzzerPin, 100, 100);
  delay(300);
  noTone(buzzerPin);
}

void suono_err(){               //suono messaggio errore
  tone(buzzerPin, 50, 400);
  delay(500);
  noTone(buzzerPin);
}

void suono_stato(){             //suono statoLEDl
 
  tone(buzzerPin, 70000, 100);
  delay(150);
  tone(buzzerPin, 70000, 100);
  delay(150);
  noTone(buzzerPin);
}

void loop() {
  if (Console.available() > 0) {
    char c = Console.read(); // read the next char received
    // look for the newline character, this is the last character in the string
    if (c == '\n') {
      //print text with the name received
      Console.print(name);
      Console.print("\n");
      bool check_name = false;
      if (name == "ledrossoon") digitalWrite(ledrosso,HIGH), check_name = true, suono_on();
      if (name == "ledverdeon") digitalWrite(ledverde,HIGH), check_name = true,suono_on() ;
      if (name == "ledgialloon") digitalWrite(ledgiallo,HIGH), check_name = true,suono_on();
      if (name == "rele1on") digitalWrite(rele1,LOW), check_name = true,suono_on();
      if (name == "rele2on") digitalWrite(rele2,LOW), check_name = true,suono_on();
      if (name == "ledrossooff") digitalWrite(ledrosso,LOW), check_name = true,suono_off();
      if (name == "ledverdeoff") digitalWrite(ledverde,LOW), check_name = true,suono_off();
      if (name == "ledgiallooff") digitalWrite(ledgiallo,LOW), check_name = true,suono_off();
      if (name == "rele1off") digitalWrite(rele1,HIGH), check_name = true,suono_off();
      if (name == "rele2off") digitalWrite(rele2,HIGH), check_name = true,suono_off();
      if (name == "statoled") statoled(), check_name = true, suono_stato();
      if (name == "statorele") statorele(), check_name = true, suono_stato();
      if (name == "stato") statoled(),statorele(), check_name = true, suono_stato();
      if (name == "spegnitutto") digitalWrite(ledrosso,LOW), digitalWrite(ledverde,LOW),
      digitalWrite(ledgiallo,LOW),digitalWrite(rele1,HIGH), digitalWrite(rele2,HIGH), check_name = true,suono_off();
      if (name == "meteo") meteo(), check_name = true, suono_stato();
     // if (name == "meteo2") meteo2(), check_name = true, suono_stato();
      if (check_name == 0) Console.println("Error !"), suono_err(); //controllo errore nel comando
     
      name = "";  // clear the name string
    } else {     // if the buffer is empty Cosole.read() returns -1
      name += c; // append the read char from Console to the name string
    }
  } else {
    delay(100);
       
  }
}

Patrick_M

non credevo che funzionassero messi così:
Code: [Select]

if (name == "statorele") statorele(), check_name = true, suono_stato();
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

gpb01

>Patrick_M: cerca su Google "comma operator in c language" ... capirai perché funziona e perché va usato com molta attenzione ...

Guglielmo
Search is Your friend ... or I am Your enemy !

Patrick_M

per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Otello37

Leggendo qua e la in rete ho trovato:"....Use SDA/SCL on pins D2 & D3" e il cavo dati del DHT22 stava proprio su D2, ho pensato ad un possibile conflitto con il BMP280 sul pin D2. L'ho spostato su D4 ed ora entrambi i sensori funzionano correttamente.
Quindi [RISOLTO]:)

Go Up