Moteino anenometr - prędkość wiatru z czujnika Hall lub kontaktronu

Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

Koledzy pomóżcie bo nie mam już nerwów.
Próbuję do kodu nadajnika 868MHz kolegi @Robert Błaszczak do Moteino dorobić czujnik prędkości wiartu.
Z kodu po pinie A0 z Moteino R6 czyta ładnie zmianę rezystancji i zamienia na kierunek wiatru , natomiast wybranego dowolnie pinu 4, 5 ,...12 Moteino nie chce za diabła czytać impulsów z halla (gotowa płytka +,-, D0,A0)

Na razie czysty kod do wrzucenia do "całości" nadajnika
.
kod:

Kod: Zaznacz cały

#include <Wire.h>                         //Zawarty w Arduino IDE (www.arduino.cc)
#include <SPI.h>                          //Zawarty w Arduino IDE (www.arduino.cc)
#include <RFM69_ATC.h>                    //Pobierz z: https://github.com/lowpowerlab/rfm69
#include <SPIFlash.h> 

#include "TimerOne.h" // Timer Interrupt set to 2 second for read sensors
#include <math.h>

#define WindSensorPin 5 // The pin location of the anemometer senso
#define WindVanePin A0 // The pin the wind vane sensor is connected to
#define VaneOffset 0; // define the anemometer offset from magnetic north

int VaneValue; // raw analog value from wind vane
int Direction; // translated 0 - 360 direction
int CalDirection; // converted value with offset applied
int LastValue; // last direction value

volatile bool IsSampleRequired; // this is set true every 2.5s. Get wind speed
volatile unsigned int TimerCount; // used to determine 2.5sec timer count
volatile unsigned long Rotations; // cup rotation counter used in interrupt routine
volatile unsigned long ContactBounceTime; // Timer to avoid contact bounce in isr

float WindSpeed; // speed miles per hour

void setup() {

LastValue = 0;

IsSampleRequired = false;

TimerCount = 0;
Rotations = 0; // Set Rotations to 0 ready for calculations

Serial.begin(9600);

pinMode(WindSensorPin, INPUT);
attachInterrupt(digitalPinToInterrupt(WindSensorPin), isr_rotation, FALLING);

Serial.println("Anemometer Test");
Serial.println("Speed (MPH)\tKnots\tDirection\tStrength");

// Setup the timer interupt
Timer1.initialize(500000);// Timer interrupt every 2.5 seconds
Timer1.attachInterrupt(isr_timer);
}

void loop() {

getWindDirection();

// Only update the display if change greater than 5 degrees.
if(abs(CalDirection - LastValue) > 5) {
LastValue = CalDirection;
}

if(IsSampleRequired) {
// convert to mp/h using the formula V=P(2.25/T)
// V = P(2.25/2.5) = P * 0.9
WindSpeed = Rotations * 0.9;
Rotations = 0; // Reset count for next sample

IsSampleRequired = false;

Serial.print(WindSpeed); Serial.print("\t\t");
Serial.print(getKnots(WindSpeed)); Serial.print("\t");
Serial.print(CalDirection);
getHeading(CalDirection); Serial.print("\t\t");
getWindStrength(WindSpeed);
}
}

// isr handler for timer interrupt
void isr_timer() {

TimerCount++;

if(TimerCount == 6)
{
IsSampleRequired = true;
TimerCount = 0;
}
}

// This is the function that the interrupt calls to increment the rotation count
void isr_rotation() {

if((millis() - ContactBounceTime) > 15 ) { // debounce the switch contact.
Rotations++;
ContactBounceTime = millis();
}
}

// Convert MPH to Knots
float getKnots(float speed) {
return speed * 0.868976;
}

// Get Wind Direction
void getWindDirection() {

VaneValue = analogRead(WindVanePin);
Direction = map(VaneValue, 0, 1023, 0, 359);
CalDirection = Direction + VaneOffset;

if(CalDirection > 360)
CalDirection = CalDirection - 360;

if(CalDirection < 0)
CalDirection = CalDirection + 360;

}

// Converts compass direction to heading
void getHeading(int direction) {

if(direction < 22)
Serial.print(" N");
else if (direction < 67)
Serial.print(" NE");
else if (direction < 112)
Serial.print(" E");
else if (direction < 157)
Serial.print(" SE");
else if (direction < 212)
Serial.print(" S");
else if (direction < 247)
Serial.print(" SW");
else if (direction < 292)
Serial.print(" W");
else if (direction < 337)
Serial.print(" NW");
else
Serial.print(" N");
}

// converts wind speed to wind strength
void getWindStrength(float speed) {

if(speed < 2)
Serial.println("Calm");
else if(speed >= 2 && speed < 4)
Serial.println("Light Air");
else if(speed >= 4 && speed < 8)
Serial.println("Light Breeze");
else if(speed >= 8 && speed < 13)
Serial.println("Gentle Breeze");
else if(speed >= 13 && speed < 18)
Serial.println("Moderate Breeze");
else if(speed >= 18 && speed < 25)
Serial.println("Fresh Breeze");
else if(speed >= 25 && speed < 31)
Serial.println("Strong Breeze");
else if(speed >= 31 && speed < 39)
Serial.println("Near Gale");
else
Serial.println("RUN");
} 
jak coś nie działa to włącz zasilanie.....
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

No to mam wstępnie działające na czujniku Hall'a oraz Moteino R6. NIE SPRAWDZAŁEM jak odbiera dane bramka. Zrobię to dopiero jutro/dziś po 18 :)

HAll podłączony -:
GND do GND,
VCC hall -> A2 MOteino (sleep ) - muszę jeszcze zrobić podobnie jak aku na tranzystorze aby nie czerpało prądu jak moteino SLEEP
Sygnał Hall (analog A0 -jakoś lepiej działa) pod pin D3 Moteino

Proszę o wasze uwagi i sugestie co przerobić w kodzie.
DZIĘKUJĘ koledze @elemaya za pomoc :)
.
FILMIK ze wstępnie działającego sprzętu: https://youtu.be/L9Vo5cBZalU
.
KOD (modyfikacja pod czujnik Hall'a z kodu @Robert Błaszczak wersji bezprzewodowej T i H):

Kod: Zaznacz cały

/*
T/H Transmiter RB-10
Copyright (C) 2019 Robert Błaszczak

Niniejszy program jest wolnym oprogramowaniem; możesz go 
rozprowadzać dalej i/lub modyfikować na warunkach Powszechnej
Licencji Publicznej GNU, wydanej przez Fundację Wolnego
Oprogramowania - według wersji 2-giej tej Licencji lub którejś
z późniejszych wersji. 
Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on 
użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej 
gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH 
ZASTOSOWAŃ. W celu uzyskania bliższych informacji - Powszechna 
Licencja Publiczna GNU. 
Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz 
Powszechnej Licencji Publicznej GNU (GNU General Public License);
jeśli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.
*/

#include <Wire.h>                         //Zawarty w Arduino IDE (www.arduino.cc)
#include <SPI.h>                          //Zawarty w Arduino IDE (www.arduino.cc)
#include <RFM69_ATC.h>                    //Pobierz z: https://github.com/lowpowerlab/rfm69
#include <SPIFlash.h>                     //Pobierz z: https://github.com/lowpowerlab/spiflash
#include <BH1750FVI.h>  // I2C

#include <LowPower.h>                     //Pobierz z: https://github.com/lowpowerlab/lowpower

#define NODEID 2                          // Unikalny numer transmitera (1 - 6) pracującego w sieci o takim samym ID, który jest jednocześnie numerem czujnika w SUPLA Cloud.
#define NETWORKID 100                     // Numer sieci (1 - 254) w której działą bramka RB-10G oraz inne transmitery. Bramka oraz max. 6 transmiterów musi działać w sieci o takim samym ID.
#define GATEWAYID 1                       // Numer bramki (0 - 254), do której łączy się transmiter.

#define FREQUENCY RF69_868MHZ             //Jeśli posiadasz moduł radiowy pracujący z inną częstotliwością zamień parametr na RF69_433MHZ lub RF69_915MHZ.
//#define IS_RFM69HW_HCW                  //Usuń zacznik komentarza, jeśli posiadasz moduł radiowy w wersji RFM69HW/HCW.
#define ENCRYPTKEY "xxxxx"     //Klucz kodowania - 16 znaków (ani mniej, ani więcej) - identyczny w bramce RB-10G i we wszystkich transmiterach.

#define ENABLE_ATC                        //Wstaw znacznik komentarza jeśli chcesz wyłączyć automatyczną kontrolę transmisji (ATC).
#define ATC_RSSI -80                      //Poziom sygnału radiowego (odcięcie) dla ATC.

period_t sleepTime = SLEEP_4S;            //Zdefiniowany czas uśpienia transmitera 4 sekundy (zgodnie z LowPower library (LowPower.h)).
    #define SEND_LOOPS 1
    #define BATT_READ_LOOPS SEND_LOOPS * 1
    #define OBR_READ_LOOPS
//#define SEND_LOOPS 13                     //Ilość pętli uśpienia transmitera (np. 4 sekundy * 15 = 60 sekund). Ilość pętli należy dobrać do konkretnej płytki Monteino.
//#define BATT_READ_LOOPS SEND_LOOPS * 30   //Ilość pętli, po których wykonywany jest pomiar napięcia na baterii (np. 60 sekund * 30 = 30 minut).

#define SERIAL_ENABLE                   //Usuń znaki komentarza '//' aby włączyć wyświetlanie na porcie szeregowym.

#define BATT0 730                         //Odczytana wartość napięcia BATTx poniżej której poziom baterii ustawiany jest na wartość 0 (3.10V).
#define BATT1 1002                        //Odczytana wartość napięcia BATTx poniżej której poziom baterii ustawiany jest na wartość 1 (3.20V).
#define BATT2 1008                        //Odczytana wartość napięcia BATTx poniżej której poziom baterii ustawiany jest na wartość 2 (3.25V).

#ifdef SERIAL_ENABLE
  #define SERIAL_BAUD 115200
  #define SP(input) {Serial.print(input);}
  #define SPln(input) {Serial.println(input);}
  #define SFLUSH() {Serial.flush();}
#else
  #define SERIAL_BAUD 115200
  #define SP(input);
  #define SPln(input);
  #define SFLUSH();
#endif

//#######################################################################
#define WindImpuls 3 // D4 - nr wejścia impulsatora  anemometru - w moteino oznzaczony "4"
//#######################################################################

double diameter = 2.15;
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 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();
}
//#######################################################################



RFM69_ATC radio;
SPIFlash flash(SS_FLASHMEM, 0xEF30);
char Ostr[10];  // do pręskości wiatru
//char Hstr[10];
//char Pstr[10];
char Bstr[10];
double O,B;
char buffer[80];






void setup() {
  Serial.begin(SERIAL_BAUD);

  radio.initialize(FREQUENCY, NODEID, NETWORKID);
  #ifdef IS_RFM69HW_HCW
    radio.setHighPower();
  #endif
  radio.encrypt(ENCRYPTKEY);
  radio.enableAutoPower(ATC_RSSI);
  sprintf(buffer, "| Prędkość wiatru | SUPLA TRANSMITER RB-10 %d MHz.", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
  SPln(buffer);
  Wire.begin();
  Wire.setClock(500000);
  
  
 // 
  
  
  if (flash.initialize()) flash.sleep();

  for (uint8_t i=0; i<=A5; i++)
  {
    if (i == RF69_SPI_CS) continue;
    if (i == SS_FLASHMEM) continue;
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
      
   SFLUSH();
  
}

char input = 0;
unsigned long sendLoops = 0;
unsigned long battReadLoops = 0;
word Battery1024 = 0;
byte BatteryLevel = 0;
byte obrReadLoops = 0;
byte sendLen;


void loop() {

 Obroty();
  
  if (battReadLoops--<=0) {
    ReadBattery();
    battReadLoops = BATT_READ_LOOPS-1;
  }

  if(obrReadLoops--<0){
    Obroty();
    obrReadLoops = OBR_READ_LOOPS-2;
    
  }
  
  if (sendLoops--<=0) {
    sendLoops = SEND_LOOPS-1;
    
  
	      O = ms;
       dtostrf(O, 3, 2, Ostr);
       dtostrf(BatteryLevel, 0, 0, Bstr);
       
    sprintf(buffer, "%s|%s", Ostr, Bstr);

    sendLen = strlen(buffer);
    radio.sendWithRetry(GATEWAYID, buffer, sendLen);
    SP("Wysłane dane: "); SP(buffer); SPln();
       //SP("Prędkość wiatru: "); SP(ms); SPln();
  }
  
  if (radio.receiveDone()) {
    SPln();
  }
  
  SFLUSH();
  flash.sleep();
  radio.sleep();
  
  LowPower.powerDown(sleepTime, ADC_OFF, BOD_OFF);
  
  SPln("SLEEP");
}

void Obroty () {
attachInterrupt(digitalPinToInterrupt(WindImpuls), rpm_fan, FALLING); 
pinMode(WindImpuls, INPUT); 
unsigned int read = 0;

//    for (byte i = 0; i < 6; i++)
//    read += digitalRead (3);
analogWrite(A2, 1024);
  for (byte i = 0; i < 6; i++)
    read += digitalRead(3);
    delay(4000);
  analogWrite(A2, 0);

  
    //#######################################################################
      if (millis() - lastmillis >= 1000) {     //Aktualizuj co sekundE, bEdzie to rOwnoznaczne z odczytem czEstotliwoSci (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śćiwiatru w milach/godzinę
      mph = mph * 3.5; // Kalibracja będu odczytu, wartość naleĹźy dobrac we 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;
  
  }
  //SP("Obroty: "); SP(ms); 
//####################################################################### 
}



void ReadBattery() {
  unsigned int readings = 0;

  analogWrite(A0, 1024);
  for (byte i = 0; i < 6; i++)
    readings += analogRead(A1);
  analogWrite(A0, 0);

  Battery1024 = (readings / 3);

  if (Battery1024 >= BATT2) {
  BatteryLevel = 3;
  }
  else if (Battery1024 < BATT2 && Battery1024 >= BATT1) {
    BatteryLevel = 2;
  }
  else if (Battery1024 < BATT1 && Battery1024 >= BATT0) {
    BatteryLevel = 1;
  }
  else if (Battery1024 < BATT0) {
    BatteryLevel = 0;
  }
  SP("BATTx: "); SP(Battery1024); SP(" | Poziom baterii (0 - 3): ");SPln(BatteryLevel);
}
jak coś nie działa to włącz zasilanie.....
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

Wysyłanie informacji o prędkości wiatru działa. Wykorzystałem do tego drugi transmiter . Pierwszy już działa i wysyła dane T, H, P oraz Lux z BME i BH i aby tego pierwszego odbierała bramka jej kod wyglądał tak (dzięki koledze @klew ):

Kod: Zaznacz cały

void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {

  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/2)// org było bez -1
    {
      *temp = RFNodes[i].temperature;
      *humidity = RFNodes[i].humidity;
    }
}

double get_pressure(int channelNumber, double pressure) {
   
  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1))
    {
      pressure = RFNodes[i].pressure; 
    }
  return  pressure;
}

double get_distance(int channelNumber, double lux) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-2) )
    {
      lux = RFNodes[i].lux; 
    }
  return  lux;
}
.
.
.

Kod: Zaznacz cały

SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
   SuplaDevice.setPressureCallback(&get_pressure);
   SuplaDevice.setDistanceCallback(&get_distance);
      SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
  ;
Teraz dziś dodałem czujnik wiatru na halotronie. Jak pisałem nadajnik drugi nadaje - jego kod taki sam jak nadajnika 1 tyle, że T,H,P,Lux =0 a jako piąta wartość przesyłana jest wartość O -wiatru.
I teraz bramka za diabła nie chce mi tego nadajnika odebrać (tzn jak pokombinuje odbiera np tą wartość wiatru ale wtedy nie wskazuje wartośći z nadajnika 1 np LUX ). Kod :

Kod: Zaznacz cały

void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {

  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/2)// org było bez -1
    {
      *temp = RFNodes[i].temperature;
      *humidity = RFNodes[i].humidity;
    }
}

double get_pressure(int channelNumber, double pressure) {
   
  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1))
    {
      pressure = RFNodes[i].pressure; 
    }
  return  pressure;
}

double get_distance(int channelNumber, double lux) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-2) )
    {
      lux = RFNodes[i].lux; 
    }
  return  lux;
}

double get_wind(int channelNumber, double wind) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/3 )
    {
      wind = RFNodes[i].wind; 
    }
  return  wind;
}
.
..

Kod: Zaznacz cały

SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
   SuplaDevice.setPressureCallback(&get_pressure);
   SuplaDevice.setDistanceCallback(&get_distance);
   SuplaDevice.setWindCallback(&get_wind);
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   SuplaDevice.addWindSensor();
Koledzy jak to rozwiązać aby nie budować kolejnej bramki ?
jak coś nie działa to włącz zasilanie.....
Awatar użytkownika
Robert Błaszczak
Posty: 3970
Rejestracja: sob gru 22, 2018 8:55 pm
Lokalizacja: Zielona Góra
Kontakt:

A zmieniłeś

Kod: Zaznacz cały

#define NODEID
Każdy nadajnik powinien mieć inny (od 1 do 6) NODEID.
Pozdrawiam
Robert Błaszczak


Moja prywatna strona: www.blaszczak.pl
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

Robert Błaszczak pisze: pt lis 01, 2019 2:56 pm A zmieniłeś

Kod: Zaznacz cały

#define NODEID
Każdy nadajnik powinien mieć inny (od 1 do 6) NODEID.
oczywiście:
Clip_3.jpg
Clip_3.jpg (34.1 KiB) Przejrzano 2787 razy
chcę to obsłużyć jedną bramką
jak coś nie działa to włącz zasilanie.....
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

Jak zwykle. Nic . Nikt. :(
jak coś nie działa to włącz zasilanie.....
krycha88
Posty: 5187
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

A czy jesteś pewny że warunek jest kiedyś spełniony?

Kod: Zaznacz cały

if (RFNodes[i].channelNumber == (channelNumber-1)/3 )
https://gui-generic-builder.supla.io/
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

krycha88 pisze: sob lis 02, 2019 2:56 am A czy jesteś pewny że warunek jest kiedyś spełniony?

Kod: Zaznacz cały

if (RFNodes[i].channelNumber == (channelNumber-1)/3 )
Pewnie nie ale kombinacji było wiele i akurat tak zostało.
Odbiornik j/w odbiera- screen, nadajniki nadają.
Rozumiem to tak : RFNodes[0] - nadajnik 1 (z niego idzie T,H,P, LUX). I jak nie ma lub jest nadajnik RFNodes[1] czyli nadajnik 2.
Przy poniższym kodzie działa przesyłanie wszystkich 4 wartośći do Cloud z nadajnika 1.

Kod: Zaznacz cały

void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {

  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/2)// org było bez -1
    {
      *temp = RFNodes[i].temperature;
      *humidity = RFNodes[i].humidity;
    }
}

double get_pressure(int channelNumber, double pressure) {
   
  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/2 )
    {
      pressure = RFNodes[i].pressure; 
    }
  return  pressure;
}

double get_distance(int channelNumber, double lux) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-1)/3 )
    {
      lux = RFNodes[i].lux; 
    }
  return  lux;
}
Natomiast chcę aby z drugiego nadajnika RFNode gdzie jak rozumiem i = 1 przesłał mi wartość wiatru do Cloud
. W Cloud są 4 kanały (czyli Channel0 do 3 ) gdzie channel3 to wiatr.

Kod: Zaznacz cały

double get_distance(int channelNumber, double wind) {
nawet jak zrobię tak
 //for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[1].channelNumber == 3 )
    {
     wind = RFNodes[i].wind; 
    }
  return  wind;
}
to nie pojawi się to tu:

Kod: Zaznacz cały

SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
   SuplaDevice.setPressureCallback(&get_pressure);
   SuplaDevice.setDistanceCallback(&get_distance);
   SuplaDevice.setWindCallback(&get_wind);
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
   SuplaDevice.addDistanceSensor();
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor();
    SuplaDevice.addWindSensor(); 
   SuplaDevice.addDistanceSensor()
Dla was to może jest i proste ale ja wczoraj i przedwczoraj spędziłem pół nocki i drugie pół dnia i nic :(
jak coś nie działa to włącz zasilanie.....
krycha88
Posty: 5187
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

A jak zrobisz to tak

Kod: Zaznacz cały

double get_wind(int channelNumber, double wind) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-3 )
    {
      wind = RFNodes[i].wind; 
    }
  return  wind;
}
Pokaż jeszcze jak definujesz tablice RFNodes
https://gui-generic-builder.supla.io/
Awatar użytkownika
QLQ
Posty: 2276
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

krycha88 pisze: sob lis 02, 2019 10:44 am A jak zrobisz to tak

Kod: Zaznacz cały

double get_wind(int channelNumber, double wind) {

 for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == (channelNumber-3 )
    {
      wind = RFNodes[i].wind; 
    }
  return  wind;
}
Pokaż jeszcze jak definujesz tablice RFNodes
To jest kod Roberta Błaszczaka z zmienionym czujnikiem na bme i bh. Jeden nadajnik obsługuje te właśnie czujniki. Teraz w końcu opanowalem drugi moteR6 aby czytał mi z halla obroty anemometru. I bramka ma dodane te czujniki zamiast dth. Na esp nie mam z tym problemu . A ten kod jest już właśnie z tablicami , strukturami których jeszcze nie ogarniam do końca.
W kodzie tym NIE MA DANYCH Z CZUJNIKA WIATRU BO PISZE Z TELEFONU i cholernie ciężko to kopiować. Są tylko dane z Node1. Z node2 ma przeslac wiatr do Cloud.

Kod: Zaznacz cały

/*
Bramka RB-10G
Copyright (C) 2019 Robert Błaszczak

Niniejszy program jest wolnym oprogramowaniem; możesz go 
rozprowadzać dalej i/lub modyfikować na warunkach Powszechnej
Licencji Publicznej GNU, wydanej przez Fundację Wolnego
Oprogramowania - według wersji 2-giej tej Licencji lub którejś
z późniejszych wersji. 
Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on 
użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej 
gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH 
ZASTOSOWAŃ. W celu uzyskania bliższych informacji - Powszechna 
Licencja Publiczna GNU. 
Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz 
Powszechnej Licencji Publicznej GNU (GNU General Public License);
jeśli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.
*/

#include <RFM69_ATC.h>                    //Pobierz z: https://github.com/lowpowerlab/rfm69

#define NODEID 1                          //Unikalny numer bramki (1 - 254).
#define NETWORKID 100                     //Numer sieci (1 - 254) w której działą bramka SUPLA oraz inne transmitery. Bramka oraz max. 6 transmiterów musi działać w sieci o takim samym ID.
#define FREQUENCY RF69_868MHZ             //Jeśli posiadasz moduł radiowy pracujący z inną częstotliwością zamień parametr na RF69_433MHZ lub RF69_915MHZ.
//#define IS_RFM69HW_HCW                  //Usuń zacznik komentarza, jeśli posiadasz moduł radiowy w wersji RFM69HW/HCW.
#define ENCRYPTKEY "qwertyuiopasdfgh"     //Klucz kodowania - 16 znaków (ani mniej, ani więcej) - identyczny w bramce SUPLA i we wszystkich transmiterach.
#define ENABLE_ATC                        //Wstaw znacznik komentarza jeśli chcesz wyłączyć automatyczną kontrolę transmisji (ATC).

#define SERIAL_BAUD 115200                //Prędkość transmisji portu szeregowego.

#define SUPLADEVICE_CPP
#include <SuplaDevice.h>

#define SUPLA_SERVER "svr5.supla.org"
#define LOCATION_ID xxx
#define LOCATION_PASSWORD "xxx"
// pobierz identyfikator urządzenia ze strony https://www.supla.org/arduino/get-guid i wprowadź go poniżej
#define GUID {0x4E,0x20,0xAA,0x53,0xCE,0x09,0x1E,0xC1,0xB1,0x8D,0x9C,0x8B,0x59,0xDB,0x78,0x46};

RFM69_ATC radio(D8, D2, false);
bool promiscuousMode = false;

const unsigned long period = 600000;      //Czas (10 minut) po którym bramka uznaje brak odczytu z transmitera i ustawia wartości wysyłane do Supla Cloud na 0.
double temperature = 0.0;
double humidity = 0.0;
double pressure = 0.0;
double lux = 0.0;
unsigned long startMillis = 0;
unsigned long currentMillis = 0;
unsigned long RFNodesCount = 0;

typedef struct {
  int nodeid;
  int channelNumber;
  double temperature;
  double humidity;
  double pressure;
  double lux;
  double batteryLevel;
  unsigned long lastContact;
} RF_TemperatureandHumidityNode;

RF_TemperatureandHumidityNode RFNodes[6];


void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {

  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == channelNumber)
    {
      *temp = RFNodes[i].temperature;
      *humidity = RFNodes[i].humidity;
    }
}

double get_pressure(int channelNumber, double pressure) {
   
  for (int i = 0; i < RFNodesCount; i++)
    if (RFNodes[i].channelNumber == channelNumber)
    {
      pressure = RFNodes[i].pressure; 
    }
  return  pressure;
}


void setup() {
  Serial.begin(SERIAL_BAUD);
  
   //SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
   //SuplaDevice.setPressureCallback(&get_pressure);
   SuplaDevice.addDHT22();
   SuplaDevice.addPressureSensor(); //Pressure
   
   
  char guid[SUPLA_GUID_SIZE] = GUID;
  uint8_t mac[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
  SuplaDevice.setName("BRAMKA RB-10G");
  SuplaDevice.begin(guid, mac, SUPLA_SERVER, LOCATION_ID, LOCATION_PASSWORD);
  
  radio.initialize(FREQUENCY,NODEID,NETWORKID);

#ifdef IS_RFM69HW_HCW
  radio.setHighPower();
#endif

  radio.encrypt(ENCRYPTKEY);
  radio.promiscuous(promiscuousMode);

  char buff[105];
  sprintf(buff, "BRAMKA RB-10G. Start komunikacji radiowej na częstotliwości %d MHz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
  Serial.println(buff);
}

byte ackCount = 0;
uint32_t packetCount = 0;

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }

  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void readRadioData() {

  String value = "";
  if (radio.receiveDone())
  {
    int foundIdx = -1;

    for (int i = 0; i < RFNodesCount; i++)
      if (RFNodes[i].nodeid == radio.SENDERID)
      {
        foundIdx = i;
        break;
      }

    Serial.println("Odbieram dane...");
    if (foundIdx == -1)
    {
      if (RFNodesCount < 6)
      {
        Serial.println("Znalazłem nowy transmiter. Dodaję go do SUPLA Cloud");
        RFNodes[RFNodesCount].nodeid = radio.SENDERID;
        RFNodes[RFNodesCount].lastContact = millis();
        RFNodes[RFNodesCount].channelNumber = radio.SENDERID - 1;
        RFNodes[RFNodesCount].temperature = 0.0;
        RFNodes[RFNodesCount].humidity = 0.0;
        RFNodes[RFNodesCount].pressure = 0.0;
        RFNodes[RFNodesCount].lux = 0.0;
        RFNodes[RFNodesCount].batteryLevel = 0;
        
        foundIdx = RFNodesCount;
        RFNodesCount++;
      } else {
        Serial.println("Maksymalna ilość transmiterów przekroczona!");
        foundIdx = 0;
      }
    } else
    {
      RFNodes[foundIdx].temperature = 0.0;
    }

    Serial.print("#[");
    Serial.print(++packetCount);
    Serial.print(']');
    Serial.print('['); Serial.print(radio.SENDERID, DEC); Serial.print("] ");

    value = "";
    for (byte i = 0; i < radio.DATALEN; i++)
      if (radio.DATA[i] != ' ')
        value += (char)radio.DATA[i];

    Serial.println(value);

    String tempStr = getValue(value, '|', 0);
    String humStr = getValue(value, '|', 1);
    String presStr = getValue(value, '|', 2);
    String luxStr = getValue(value, '|', 3);
    String battLevelStr = getValue(value, '|', 4);

    Serial.print("Temperatura: ");
    Serial.println(tempStr);
    Serial.print("Wilgotność: ");
    Serial.println(humStr);
    Serial.print("Ciśnienie: ");
    Serial.println(presStr);
    Serial.print("Natężenie światła: ");
    Serial.println(luxStr);
    Serial.print("Poziom baterii: ");
    Serial.println(battLevelStr);

    RFNodes[foundIdx].temperature = tempStr.toFloat();
    RFNodes[foundIdx].humidity = humStr.toFloat();
    RFNodes[foundIdx].pressure = presStr.toFloat();
    RFNodes[foundIdx].lux = luxStr.toFloat();
    RFNodes[foundIdx].batteryLevel = battLevelStr.toFloat();
    RFNodes[foundIdx].lastContact = millis();

    Serial.print("Poziom sygnału transmitera [RX_RSSI]:"); Serial.print(radio.RSSI); Serial.print(" dBm");

    if (radio.ACKRequested())
    {
      byte theNodeID = radio.SENDERID;
      radio.sendACK();
      
      if (ackCount++ % 3 == 0)
      {
        Serial.print(" ACK TEST - Transmiter ");
        Serial.print(theNodeID);
        delay(5);
        radio.sendWithRetry(theNodeID, "ACK TEST", 8, 0);
      }
    }
    Blink(LED_BUILTIN, 100);
    Serial.println();
    Serial.println();
  }

  for (int i = 0; i < RFNodesCount; i++)
  {
    if (millis() - RFNodes[i].lastContact >= period)
    {
      RFNodes[i].temperature = -375;
      RFNodes[i].humidity = -1;
      RFNodes[i].pressure = -10000;
      RFNodes[i].lux = 0;
      RFNodes[i].batteryLevel = 0;
      Serial.print("Brak odczytu z czujnika ");
      Serial.println (RFNodes[i].nodeid);
    };
  }
}

void Blink(byte PIN, int DELAY_MS)
{
  pinMode(PIN, OUTPUT);
  digitalWrite(PIN,LOW);
  delay(DELAY_MS);
  digitalWrite(PIN,HIGH);
}

void loop() {
  readRadioData();
  SuplaDevice.iterate();
}  
jak coś nie działa to włącz zasilanie.....
ODPOWIEDZ

Wróć do „Pomoc”