Meteostanice NRF24 - venkovní část

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
Ingram
Příspěvky: 1
Registrován: 07 lis 2020, 09:09

Meteostanice NRF24 - venkovní část

Příspěvek od Ingram » 20 lis 2020, 19:35

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;
}

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti