• 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
Problem z przesyłem danych z czujnika HCHO NRF24l01
#1
Cześć wszystkim.
Stworzyłem projekt, który składa się z 4 czujników.
sht31- (temperatura i wilgotność)
sps30 - (pomiar PM)
HCHOSensor v 1.0 DFRobot (czujnik formaldehydu)
MiCS 5524 (czujnik lotnych związków organicznych)
Udało mi się je wszystkie połączyć i otrzymywałem prawidłowe wyniki. Problem zaczął się , gdy otrzymane dane chciałem wysyałać zdalnie za pomocą modułu NRF24l01. Udało mi si to połowicznie, ponieważ czujnik sps30 jak i sht31 wysyłały prawidłowe dane. Największy kłopot mam z czujnikiem od formaldehydu (DFRobot). Wszystko działa poprawnie do czasu kiedy nie wprowadzę kodu do obsługi owego czujnika. Zauważyłem, że jakby problem tkwi w komendzie "if(hchoSensor.available()>0)   {". Gdy jej nie ma, wysyłam i odbieram prawidłowo dane z pozostałych czujników, lecz gdy dodam tą komendę to w monitorze portu szeregowego nie widać danych lub pojawi się tylko jedna linijka. Czy ktoś mógłby mnie naprowadzić na jakiś trop co źle robię? Będę bardzo wdzięczny
Pozdrawiam
Kod:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(5, 6); // CE, CSN
const byte address[6] = "00001";

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
#include <sps30.h>
#include <DFRobotHCHOSensor.h>
#include <SoftwareSerial.h>
#define SensorSerialPin 10
SoftwareSerial sensorSerial(SensorSerialPin,SensorSerialPin);
DFRobotHCHOSensor hchoSensor(&sensorSerial);




Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
    //HCHO
sensorSerial.begin(9600);  //the baudrate of HCHO is 9600
    sensorSerial.listen();
    Serial.begin(9600);



  //czujnik temperatury i wilgotności
  while (!Serial)
    delay(10);    // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("SHT31 test");
  if (! sht31.begin(0x44)) {  // Set to 0x45 for alternate i2c addr
    Serial.println("Couldn't find SHT31");
    while (1) delay(1);
  }

  Serial.print("Heater Enabled State: ");
  if (sht31.isHeaterEnabled())
    Serial.println("ENABLED");
  else
    Serial.println("DISABLED");
   
    //sps30
  int sps30;
  #ifndef PLOTTER_FORMAT
  Serial.print("SPS sensor probing successful\n");
#endif /* PLOTTER_FORMAT */

s16 ret;
   
  ret = sps30_start_measurement();
  if (ret < 0) {
    Serial.print("error starting measurement\n");
  }

#ifndef PLOTTER_FORMAT
  Serial.print("measurements started\n");
#endif /* PLOTTER_FORMAT */
  delay(1000);
  //radio
    radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
radio.stopListening();


 
}


void loop() {

  if(hchoSensor.available()>0) 


{
   
  //sps30
  struct sps30_measurement m;
  char serial[SPS_MAX_SERIAL_LEN];
  u16 data_ready;
  s16 ret;

  do {
    ret = sps30_read_data_ready(&data_ready);
    if (ret < 0) {
      Serial.print("error reading data-ready flag: ");
      Serial.println(ret);
    } else if (!data_ready)
      Serial.print("data not ready, no new measurement available\n");
    else
      break;
    delay(100000); /* retry in 100ms */
  } while (1);

  ret = sps30_read_measurement(&m);
  if (ret < 0)
    Serial.print("error reading measurement\n");
      else {

float t = sht31.readTemperature();
int pm1 = sps30_read_measurement(&m);
float h = sht31.readHumidity();
float hcho = hchoSensor.uartReadPPM();




   
      Serial.print(t);
  Serial.print(",");
Serial.print(h);
  Serial.print(",");
Serial.print(m.mc_1p0);//PM 1.0
Serial.print(",");
Serial.print(m.mc_2p5);//PM 2.5
Serial.print(",");
Serial.print(m.mc_4p0);//PM4.0
Serial.print(",");
Serial.print(m.mc_10p0);//PM 10.0
Serial.print(",");
Serial.print(m.nc_0p5);//NC 0.5
Serial.print(",");
Serial.print(m.nc_1p0);//NC 1.0
Serial.print(",");
Serial.print(m.nc_2p5);//NC 4.0
Serial.print(",");
Serial.print(m.nc_4p0);//NC 4.0
Serial.print(",");
Serial.print(m.nc_10p0);//NC 10.0
Serial.print(",");
Serial.print(m.typical_particle_size);// typowe wielkości cząsteczek
Serial.print(",");
Serial.print(hcho);
Serial.println();
delay(1000);

  radio.write(&t, sizeof(t));
    radio.write(&h, sizeof(h));
    radio.write(&m, sizeof(m));
      radio.write(&hcho, sizeof(hcho));
      }
}
}




 
 
Odpowiedź
#2
Pin 10 jest typowo używany w SPI, czyli raczej zostaw go dla RF24, a użyj innego pinu do softserial dla czujnika. Poza tym jak masz tak rozbudowany projekt to użyj płytki, która ma więcej sprzętowych seriali i nie używaj softowych, to zawsze będzie rodzić jakieś komplikacje.
Pisanie programów z delay jako jedyna metoda zarządzania czasem to kiepski pomysł, rozbuduj swoje umiejętności.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
zobacz tutaj
https://www.arduino.cc/en/Tutorial/Built...thoutDelay
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości