Stacja pogodowa

User avatar
shimano73
Posts: 915
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze

Sat Mar 16, 2019 4:30 pm

QLQ wrote:
Sat Mar 16, 2019 3:35 pm


Napiszę do @shimano73 czy mogę udostępnić ten kod bo dostałem go na priv.
Oczywiscie ze możesz udostępnić , mała korekta , mój soft mierzy prędkość wiatru na podstawie czasu pomiędzy pierwszym impulsem a kolejnym z tego względu ze taki pomiar jest dokładniejszy przy jednym impulsie na obrót
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie
User avatar
QLQ
Posts: 821
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Sat Mar 16, 2019 4:34 pm

Jak wspomniałem autorstwa kolegi @shimano73 z moim dodaniem BH1750 na czujniku odległości.
Dopiero sobie uświadomiłem, że nie ma jeszcze kierunku wiatru. Ale to jak już wejdzie "stacja pogody" :

Code: Select all

#define SUPLA_CHANNELTYPE_WEATHER_STATION 3100 // ver. >= 8
Proszę bardzo:

Code: Select all

/*
 * This example shows how to configure SuplaDevice for building for NodeMCU within Arduino IDE
 */


#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <proto.h>
#include <IEEE754tools.h>
// We define our own ethernet layer
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <DHT.h>
#include <lck.h>

#include <BH1750FVI.h>  // I2C
BH1750FVI LightSensor(BH1750FVI::k_DevModeContLowRes);

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>
#include <Bounce2.h>
WiFiClient client;



#include <Wire.h>

#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define WindImpuls 13 // GPIO 13 - nr wejścia impulsatora  anemometru
#define SEALEVELPRESSURE_HPA (1013.25) // cisnienie na poziomie morza 

Adafruit_BME280 bme; // I2C


double diameter = 2.75;
double mph; //Utworzenie zmiennej mile/godzinę
double kmh; //Utowrzenie zmiennej km/h
double ms; // Utworzenie zmiennej m/s 
double pomiar[3];
int licz_pomiar;

int rawVoltage ;
float voltage;

  
// Setup Supla connection
const char* ssid     = "SSID";
const char* password = "haslo_wifi";

//***************************************************************************************
double get_pressure(int channelNumber, double last_val) {

    double value = -275;
    switch(channelNumber) {
        
    case 0: {   
        value = bme.readPressure() / 100;
        Serial.print("Pressure = ");
         Serial.print(value);
         Serial.println(" hPa"); 
        break;    
    } //end case 0 
   case 1: {
         value = WiFi.RSSI();
         Serial.print("WiFi meter = ");
         Serial.print(value);
         Serial.println(" dBm"); 
     break;    
    } //end case 1
      
   case 2: {  
       rawVoltage = analogRead(A0);
       voltage = 62.5 * rawVoltage / 102.4;
      value=voltage;
      Serial.print("Battery = ");
      Serial.print(value);
      Serial.println(" V"); 
      break;    
    } //end case 2      
   }
    return value;  
}
//***************************************************************************************
double  get_wind(int channelNumber, double last_val){
  
    double t = -275;  
    t=ms;
    return t;
}
//***************************************************************************************

void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {
   *temp = bme.readTemperature();
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");
    
    *humidity = bme.readHumidity();
    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");
    if ( isnan(*temp) || isnan(*humidity) ) {
      *temp = -275;
      *humidity = -1;
    }
  
   
}
//***************************************************************************************
double get_distance(int channelNumber, double t) {

 // float lux = analogRead(LIGHTSENSORPIN);             //TEMT6000
   uint16_t lux = LightSensor.GetLightIntensity();     //BH1750
    t = abs(lux);
    Serial.print("Natezenie swiatla = ");
    Serial.print(LightSensor.GetLightIntensity());
    return t;

} //void
//***************************************************************************************
//Średnica anemometru

// Odczyt obrotĂłw (RPM)
int half_revolution_time = 0; //Utworzenie zmiennej przechowującej
double rpm = 0; //Utworzenie zmiennej RPM (obroty)
unsigned long lastmillis = 0; //Utworzenie zmiennej long lastmilis

void rpm_fan() {
  unsigned long static last_event = 0;
  if (millis() - last_event < 5) {   //debouncing
    return;
  }
  half_revolution_time = (millis() - last_event);
  last_event = millis();
}
//***************************************************************************************


void setup() {
  Serial.begin(115200);
  LightSensor.begin();  
  delay(10);
  pinMode(WindImpuls, INPUT_PULLUP);   
  attachInterrupt(digitalPinToInterrupt(WindImpuls), rpm_fan, FALLING); 
  Wire.begin(4,5);
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  
  // Replace the falowing GUID
    char GUID[SUPLA_GUID_SIZE] = {0xC5,0xCB,0x7A,0xA2,0x4D,0x41,0x84,0x81,0x4D,0xF6,0x7E,0xF7,0xB6,0xCD,0xD0,0x1E};
  // char GUID[SUPLA_GUID_SIZE] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid

  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

  /*
   * Having your device already registered at cloud.supla.org,
   * you want to change CHANNEL sequence or remove any of them,
   * then you must also remove the device itself from cloud.supla.org.
   * Otherwise you will get "Channel conflict!" error.
   */
    
  // CHANNEL0 - RELAY
   SuplaDevice.setName("R@F_Stacja Pogodowa");


   SuplaDevice.addWindSensor(); // Wind m/s
   SuplaDevice.addPressureSensor(); //Pressure
   SuplaDevice.addDS18B20Thermometer(); // Level WiFi
   SuplaDevice.addDS18B20Thermometer(); // Valtage battery
   SuplaDevice.addDHT22();  // BME T i %
   SuplaDevice.addDistanceSensor(); // Natezenie swiatla
   
   SuplaDevice.setPressureCallback(&get_pressure);
   WiFi.softAPdisconnect(true);
  
  
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "server.supla.org",  // SUPLA server address
                    nr_ID,                 // Location ID 
                    "password");               // Location Password

}
//***************************************************************************************

void loop() {
 
  SuplaDevice.iterate();
  SuplaDevice.setPressureCallback(&get_pressure);
  
    if (millis() - lastmillis >= 1000) {
    //Aktualizuj co sekundę, będzie to równoznaczne z odczytem częstotliwości (Hz)

    lastmillis = millis();          // Aktualizacja lastmillis
    
    noInterrupts();                   // W trakcie kalkulacji wyłącz obsługę przerwań
    if (half_revolution_time>0) rpm = (30000 / half_revolution_time) ;      
    interrupts() ; //Przywróć przerwania
    if (rpm>0) {
      mph = diameter / 5 * 3.14 * rpm * 60 / 5280;//Odczyt prędkości wiatru w milach/godzinę
      mph = mph * 3.5; // Kalibracja błędu odczytu, wartość należy dobrać we własnym zakresie
      kmh = mph * 1.609;// Zamiana mil/godzine na km/h
      ms = kmh / 3.6;     
   Serial.print("Wind meter = ");
      Serial.print(ms);
      Serial.println(" m/s"); 
    }
       pomiar[licz_pomiar]=ms;  
      if ((pomiar[0]==pomiar[1]) and (pomiar[1]==pomiar[2]) and (pomiar[2]==pomiar[3])) {
          ms=0;      
      }
      licz_pomiar=licz_pomiar+1;    
      if (licz_pomiar==4) licz_pomiar=0;
  
  }

}
//***************************************************************************************

// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();
       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };
    
        return -1;
    };
    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };
    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }
    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }
    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }
    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

       // Serial.println("WiFi init");
        WiFi.begin(ssid, password);

        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
        //    Serial.print(".");
        }

        //Serial.print("\nlocalIP: ");
        //Serial.println(WiFi.localIP());
        //Serial.print("subnetMask: ");
        //Serial.println(WiFi.subnetMask());
        //Serial.print("gatewayIP: ");
        //Serial.println(WiFi.gatewayIP());
    }
//***************************************************************************************

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;
          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;        
          cb.get_temperature_and_humidity =get_temperature_and_humidity;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;
          cb.get_distance = NULL;
          cb.get_temperature = &get_pressure;
          cb.get_wind=&get_wind;
      cb.get_distance= get_distance;
          return cb;
}


Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
QLQ
Posts: 821
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Sat May 18, 2019 7:14 pm

Gdzie coś takiego kupie w normalnych pieniądzach. Jest na Ali ale sama wysyłka to 50zl .
images.jpg
images.jpg (2.78 KiB) Viewed 863 times
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
maffiu
Posts: 487
Joined: Wed Nov 30, 2016 9:30 pm
Location: Kraków/Skawina

Sat May 18, 2019 7:50 pm

QLQ wrote:
Sat May 18, 2019 7:14 pm
Gdzie coś takiego kupie w normalnych pieniądzach. Jest na Ali ale sama wysyłka to 50zl .
images.jpg
Obudowy radiacyjne widziałem już kilka razy zrobione ze szpilek gwintowanych i podstawek do doniczek
User avatar
QLQ
Posts: 821
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Sat May 18, 2019 8:17 pm

maffiu wrote:
Sat May 18, 2019 7:50 pm
QLQ wrote:
Sat May 18, 2019 7:14 pm
Gdzie coś takiego kupie w normalnych pieniądzach. Jest na Ali ale sama wysyłka to 50zl .
images.jpg
Obudowy radiacyjne widziałem już kilka razy zrobione ze szpilek gwintowanych i podstawek do doniczek
O Ty!! Dobry pomysł. Ale chodzi mi aby też wyglądało estetycznie. Ale pomysł zawsze jest dobry... Dzięki. Pochwalę się jak zrobię.
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
makrz
Posts: 271
Joined: Tue Nov 27, 2018 1:43 pm
Location: Opole

Sat May 18, 2019 8:23 pm

QLQ wrote:
Sat May 18, 2019 7:14 pm
Gdzie coś takiego kupie w normalnych pieniądzach. Jest na Ali ale sama wysyłka to 50zl .
images.jpg
Ja kupiłem taką.
User avatar
shimano73
Posts: 915
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze

Sat May 18, 2019 8:29 pm

A ja ma taki , pierwszy od lewej
Attachments
A4777091-6DEB-4D3D-B1F3-28780E7C1E39.jpeg
A4777091-6DEB-4D3D-B1F3-28780E7C1E39.jpeg (1.97 MiB) Viewed 829 times
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie
User avatar
QLQ
Posts: 821
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Wed Jun 19, 2019 8:21 pm

Zakupy jak na foto zrobione. Będę robił drugą. W standardzie:
Bme280
bh2750
Anemometr

I nowa rzecz : pomiar opadow.
Screenshot_20190619-221740_legro.jpg
Screenshot_20190619-221740_legro.jpg (24.71 KiB) Viewed 618 times
Last edited by QLQ on Wed Jun 19, 2019 10:30 pm, edited 1 time in total.
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
QLQ
Posts: 821
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Wed Jun 19, 2019 10:23 pm

Stacja pogody dziś dorobiła się czujnika pomiaru opadów:
.W krótce zrobię filmik aby pokazać jak on działa
.
Screenshot_2019-06-20-00-19-37.png
Screenshot_2019-06-20-00-19-37.png (129.46 KiB) Viewed 620 times
Rzeczy niemożliwe załatwiam "od ręki". Na cuda potrzebuje chwili...
User avatar
dawidd
Posts: 433
Joined: Tue Dec 19, 2017 12:45 pm

Thu Jun 20, 2019 11:55 am

wypaśna ta Twoja stacja :)
Post Reply