Stránka 1 z 1

Meteostanice NRF24 - venkovní část

Napsal: 20 lis 2020, 19:35
od Ingram
Ahoj všem, začal jsem si stavět meteostanici a již mi fungují čidla s Arduino Nano s integrovaným NRF24L01 modulem. Jen jsem narazil na dva problémy.

1) čidlo osvětlení BH1750 dělá nějaký brikule a náhodně zobrazuje hodnotu osvětléní 0 lux. Zajímavé je, že pokud nahraju samostatný kód pro BH1750 a následně můj celý kód pro všechna čidla tak ukazuje správně. Zapojené je dle https://navody.arduino-shop.cz/arduino- ... tleni.html

2) jsem jouda a ačkoliv hardware část mi nedělá problémy tak tápu v kódu a potřebují zprovoznit integrované NRF24 na Keywish RF-Nano Nano V3.0 tak aby dokázal posílat data jednosměrně. Příjmačem bude Raspberry Pi s NRF24 modulem. Momentálně mi jde o tu odesílací část. Předem díky za pomoc.

Kód: Vybrat vše

#include <OneWire.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <DHT.h>
#include <DallasTemperature.h>
#include <ML8511.h>
#include <BH1750.h>

#define BMP280_ADRESA (0x76)
Adafruit_BMP280 bmp;
int korekce = 55.2;

#define pinDHT 10
#define typDHT21 DHT21 
DHT mojeDHT(pinDHT, typDHT21);

const int pinCidlaDS = 2;
OneWire oneWireDS(pinCidlaDS);
DallasTemperature senzoryDS(&oneWireDS);

#define pinOut A0
#define pinRef3V3 A1

int mericiPin = A0;
int ledPin = 3;
const int casMereni = 280;
const int casUstaleni = 40;
const int casSpanku = 9680;
float napetiAnalog = 0;
float napetiPrepocet = 0;
float prasnost = 0;

BH1750 lightMeter;

void setup() {
    Serial.begin(9600);
   if (!bmp.begin(BMP280_ADRESA)) {
    Serial.println("BMP280 senzor nenalezen, zkontrolujte zapojeni!");
    while (1);
    
    mojeDHT.begin();

    senzoryDS.begin();

    pinMode(pinOut, INPUT);
    pinMode(pinRef3V3, INPUT);
    pinMode(ledPin,OUTPUT);

    lightMeter.begin();
  }
}

void loop() {
  float tlak = (bmp.readPressure()/100.00) + korekce;
  float vlh = mojeDHT.readHumidity();
  senzoryDS.requestTemperatures();
      
  Serial.print("Barometricky tlak (BMP280): ");
  Serial.print(tlak);
  Serial.println(" hPa")
  ;
  Serial.print("Vlhkost (DHT21): "); 
  Serial.print(vlh);
  Serial.println("  %");
  
  Serial.print("Teplota (DS18B20): ");
  Serial.print(senzoryDS.getTempCByIndex(0));
  Serial.println(" stupnu Celsia");
  
  int hodnotaUV = prumerAnalogRead(pinOut);
  int hodnotaRef3V3 = prumerAnalogRead(pinRef3V3);
  float napetiOutUV = 3.3 / hodnotaRef3V3 * hodnotaUV;
  float intenzitaUV = prevodNapetiIntenzita(napetiOutUV, 0.96, 2.8, 0.0, 15.0);
  if (napetiOutUV<0.98) {intenzitaUV=0;}
  Serial.print("Napeti (ML8511): ");
  Serial.print(napetiOutUV);
  Serial.print("V, UV Intenzita: ");
  Serial.print(intenzitaUV);
  Serial.println(" mW/cm^2");

  digitalWrite(ledPin,LOW);
  delayMicroseconds(casMereni);
  napetiAnalog = analogRead(mericiPin);
  delayMicroseconds(casUstaleni);
  digitalWrite(ledPin,HIGH);
  delayMicroseconds(casSpanku);
  napetiPrepocet = napetiAnalog * (5.0 / 1024.0);
  prasnost = (0.17 * napetiPrepocet - 0.1)*1000;
  Serial.print("Napeti (Sharp GP2Y1010AU0F): ");
  Serial.print(napetiPrepocet);
  Serial.print(" V");
  Serial.print(", Koncentrace prachu: ");
  Serial.print(prasnost);
  Serial.println(" ug/m3");

  uint16_t lux = lightMeter.readLightLevel();
  Serial.print("Intenzita svetla (BH1750): ");
  Serial.print(lux);
  Serial.println(" lux");
  
  Serial.println();
  delay(2000);
}

int prumerAnalogRead(int pinToRead) {
  byte numberOfReadings = 8;
  unsigned int runningValue = 0; 

  for(int x = 0 ; x < numberOfReadings ; x++)
    runningValue += analogRead(pinToRead);
  runningValue /= numberOfReadings;

  return(runningValue);  
}

float prevodNapetiIntenzita(float x, float in_min, float in_max,
                float out_min, float out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}