NRF52832 и датчик BME280

О программировании Arduino, использование библиотек, примеры и общие вопросы программирования.
Berk
Сообщения: 80
Зарегистрирован: 11 окт 2017, 22:05

Re: NRF52832 и датчик BME280

Сообщение Berk » 09 дек 2018, 13:29

Andrey_64 писал(а):
09 дек 2018, 12:06
Очистил
Загрузчик не ложится
Пробовал код теперь не просыпается ...
Не мешало-бы добавить какой-то индикатор в передаче , что сенсор жив (для МД)
>>Загрузчик не ложится
так и должно быть, вроверить есть ли изменения или нет можно меняя настройку - reset (dont enable /enable) будет разная реакция на пин рессет(21)
>>Пробовал код теперь не просыпается ...
Так проблему вы будите долго решать, выже хотите что бы на Вас потратили время, а сами ленитесь подробнее описать, утверждения все желательно подкреплять выводом дебага. Как интерпретировать вашу строку? Тоесть теперь не перезагружается войдя в функцию бефор? Но один раз отправляет значение и засыпает и не просыпается? Почему решили что не просыпается?
>> Не мешало-бы добавить какой-то индикатор в передаче , что сенсор жив (для МД)
По идее сама передача данных является подтверждением, по обновлению этих данных можно делать реакцию в мажордомо, если их не было какое то время то что то делаем, потом есть еще отправка батареи, тоже самое. В моей програме для датчика BME280 всё немного по другому. Но об этом потом, щас надо именно с этим разобратся, если это конечно вам нитересно)))


Итак, что у вас сейчас не работает???

Andrey_64
Сообщения: 10
Зарегистрирован: 06 дек 2018, 18:24

Re: NRF52832 и датчик BME280

Сообщение Andrey_64 » 09 дек 2018, 14:17

? Тоесть теперь не перезагружается войдя в функцию бефор? Но один раз отправляет значение и засыпает и не просыпается? Почему решили что не просыпается?

Циклической перезагрузки (в сериале) не наблюдается
О том , что уснула и не проснулась судил по сериалу и таймеру в МД-майсенсорс
Подтянул на питание 21 и19 PIO
Обнаружил глюк с программатором - переустановил
Изменил строку 180 : NRF_UART0->ENABLE = 1;// 0-было

606036 MCO:SLP:MS=600000,SMS=0,I1=255,M1=255,I2=255,M2=255
606042 TSF:TDI:TPD

__ __ ____
| \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___
| |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
| | | | |_| |___| | __/ | | \__ \ _ | | \__ \
|_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/
|___/ 2.3.0

23 MCO:BGN:INIT NODE,CP=RNNNN---,VER=2.3.0
27 TSM:INIT
28 TSF:WUR:MS=0
30 TSM:INIT:TSP OK
31 TSM:INIT:STATID=60
34 TSF:SID:OK,ID=60
35 TSM:FPAR
43 TSF:MSG:SEND,60-60-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
447 TSF:MSG:READ,0-0-60,s=255,c=3,t=8,pt=1,l=1,sg=0:0
452 TSF:MSG:FPAR OK,ID=0,D=1
546 TSF:MSG:READ,3-3-60,s=255,c=3,t=8,pt=1,l=1,sg=0:1
2050 TSM:FPAR:OK
2051 TSM:ID
2052 TSM:ID:OK
2053 TSM:UPL
2056 TSF:MSG:SEND,60-60-0-0,s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=OK:1
2070 TSF:MSG:READ,0-0-60,s=255,c=3,t=25,pt=1,l=1,sg=0:1
2075 TSF:MSG:PONG RECV,HP=1
2078 TSM:UPL:OK
2079 TSM:READY:ID=60,PAR=0,DIS=1
2083 TSF:MSG:SEND,60-60-0-0,s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=OK:0100
2090 TSF:MSG:READ,0-0-60,s=255,c=3,t=15,pt=6,l=2,sg=0:0100
2097 TSF:MSG:SEND,60-60-0-0,s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=OK:2.3.0
2105 TSF:MSG:SEND,60-60-0-0,s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=OK:0
2322 TSF:MSG:READ,0-0-60,s=255,c=3,t=6,pt=0,l=1,sg=0:M
2328 TSF:MSG:SEND,60-60-0-0,s=255,c=3,t=11,pt=0,l=14,sg=0,ft=0,st=OK:BME_280 Sensor
2337 TSF:MSG:SEND,60-60-0-0,s=255,c=3,t=12,pt=0,l=4,sg=0,ft=0,st=OK:1.52
2349 TSF:MSG:READ,0-0-60,s=255,c=3,t=6,pt=0,l=1,sg=0:M
2445 TSF:MSG:SEND,60-60-0-0,s=0,c=0,t=6,pt=0,l=18,sg=0,ft=0,st=OK:Temperature sensor
2554 TSF:MSG:SEND,60-60-0-0,s=1,c=0,t=7,pt=0,l=15,sg=0,ft=0,st=OK:Humidity sensor
2662 TSF:MSG:SEND,60-60-0-0,s=2,c=0,t=8,pt=0,l=15,sg=0,ft=0,st=OK:Pressure sensor
2669 MCO:REG:REQ
2674 TSF:MSG:SEND,60-60-0-0,s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=OK:2
2686 TSF:MSG:READ,0-0-60,s=255,c=3,t=27,pt=1,l=1,sg=0:1
2691 MCO:PIM:NODE REG=1
2693 MCO:BGN:STP

Все ОК. Большое Спасибо.
Запитал от 18650В + преобразователь 0,5-9в to 3,3в =посмотрю ,на сколько хватит...

Berk
Сообщения: 80
Зарегистрирован: 11 окт 2017, 22:05

Re: NRF52832 и датчик BME280

Сообщение Berk » 09 дек 2018, 14:32

Ясно не обратил внимание что uart отключается, впринципе это надо в уже рабочей програме, при тестах команды выключающие его можно вообще не указывать. Я так понял вы тестером потребление не замеряли. Ну и советую на батарейном тесте все же отключить uart, поджирает мальца. И по дебагу не видно, но как я понял данные датчик шлет нормально, засыпает и снова шлет.

Berk
Сообщения: 80
Зарегистрирован: 11 окт 2017, 22:05

Re: NRF52832 и датчик BME280

Сообщение Berk » 09 дек 2018, 14:34

И еще, включение пониженного энергопотребление все же лучше перенести в бефор, что бы он включался перед презентацией, тк там много сообщений и они без включения этого режима много расходуют батареи

Berk
Сообщения: 80
Зарегистрирован: 11 окт 2017, 22:05

Re: NRF52832 и датчик BME280

Сообщение Berk » 09 дек 2018, 14:39

Ну и раз все получилось, можете еще попробовать мою тестовую прогу, которую я делал для своего датчика на BME280. Там используется библиотеки адафрута:
https://github.com/adafruit/Adafruit_Sensor
https://github.com/adafruit/Adafruit_BME280_Library

люблю я их библы.

Прога может еще немного предсказывать погоду))), этого нет у адафрута, это я смиксовал

Код: Выделить всё

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define MY_RADIO_NRF5_ESB
#define MY_SMART_SLEEP_WAIT_DURATION_MS 1000
#define MY_PASSIVE_NODE
#define MY_NODE_ID 100

#define TEMP_CHILD_ID 0
#define HUM_CHILD_ID 1
#define BARO_CHILD_ID 2
#define FORECAST_CHILD_ID 3
#define ALTITUDE_CHILD_ID 4
#define BAROCONF_CHILD_ID 100
#define LEDCONF_CHILD_ID 101
#define FORECASTCONF_CHILD_ID 102
#define ALTITUDECONF_CHILD_ID 103
#define SLEEP_TIME_SENS_ID 104
#define BATTARY_SEND_SENS_ID 105
#define POWER_CHILD_ID 110

#define BAT_COOF 0.0092957746478873
#define BAT_MIN 225
#define BAT_MAX 295


float tempThreshold = 0.5;
float humThreshold = 5;
float presThreshold = 1;
float pres_mmThreshold = 1;
float altiThreshold = 5;

byte baromem;
byte ledmem;
byte altitudemem;
byte forecastmem;
uint16_t temp;
float vcc;
int battery;
int old_battery;
boolean first_send_battery = 1;
boolean first_param_send = 1;
uint32_t sleepTime;
byte sleep_mode;
uint32_t w_battetyTime = 0;
uint32_t send_batteryTime;
bool metric = true;                // Variable that stores if the sensor will output the temperature in Fahrenheit of Celsius. The gateway sends this preference to the node, so you dont need to change it here.
bool receivedConfig = false;
bool flag_led = 0;
bool stat = 0;

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C

float temperature;
float pressure;
float pressure_mm;
float altitude;
float humidity;
float lastTemperature = -1;
float lastHumidity = -1;
float lastPressure = -1;
float lastPressure_mm = -1;
float lastAltitude = -1;
bool status;

#define CONVERSION_FACTOR (1.0/10.0)         // used by forecast algorithm to convert from Pa to kPa, by dividing hPa by 10.
const char *weather[] = { "stable", "sunny", "cloudy", "unstable", "thunderstorm", "unknown" };
enum FORECAST
{
  STABLE = 0,                     // "Stable Weather Pattern"
  SUNNY = 1,                      // "Slowly rising Good Weather", "Clear/Sunny "
  CLOUDY = 2,                     // "Slowly falling L-Pressure ", "Cloudy/Rain "
  UNSTABLE = 3,                   // "Quickly rising H-Press",     "Not Stable"
  THUNDERSTORM = 4,                 // "Quickly falling L-Press",    "Thunderstorm"
  UNKNOWN = 5                     // "Unknown (More Time needed)
};
int lastForecast = -1;                // Stores the previous forecast, so it can be compared with a new forecast.
const int LAST_SAMPLES_COUNT = 5;
float lastPressureSamples[LAST_SAMPLES_COUNT];
int minuteCount = 0;                // Helps the forecst algorithm keep time.
bool firstRound = true;                // Helps the forecast algorithm recognise if the sensor has just been powered up.
float pressureAvg;                // Average value is used in forecast algorithm.
float pressureAvg2;                // Average after 2 hours is used as reference value for the next iteration.
float dP_dt;                    // Pressure delta over time


#include <MySensors.h>

MyMessage temperatureMsg(TEMP_CHILD_ID, V_TEMP);
MyMessage humidityMsg(HUM_CHILD_ID, V_HUM);
MyMessage pressureMsg(BARO_CHILD_ID, V_PRESSURE);
MyMessage forecastMsg(FORECAST_CHILD_ID, V_FORECAST);
MyMessage altitudeMsg(ALTITUDE_CHILD_ID, V_DISTANCE);
MyMessage baromemMsg(BAROCONF_CHILD_ID, V_VAR1);
MyMessage ledmemMsg(LEDCONF_CHILD_ID, V_VAR1);
MyMessage forecastmemMsg(FORECASTCONF_CHILD_ID, V_VAR1);
MyMessage altitudememMsg(ALTITUDECONF_CHILD_ID, V_VAR1);
MyMessage msg_sleep_time(SLEEP_TIME_SENS_ID, V_VAR1);
MyMessage msg_battary_send(BATTARY_SEND_SENS_ID, V_VAR1);
MyMessage powerMsg(POWER_CHILD_ID, V_VAR1);


void preHwInit() {
  pinMode(21, INPUT);
  pinMode(29, INPUT);
  pinMode(25, OUTPUT);
  digitalWrite(25, HIGH);
  pinMode(26, OUTPUT);
  digitalWrite(26, HIGH);
  pinMode(27, OUTPUT);
  digitalWrite(27, HIGH);
  red_short_blink();
  delay(500);
  white_blinkhw();
  delay(500);
  //white_blinkhw();
}


void before()
{
  NRF_POWER->DCDCEN = 1;
  analogReadResolution(10);
  analogReference(AR_INTERNAL);
  NRF_UART0->ENABLE = 0;
  disableNfc();
  turnOffAdc();


  baromem = loadState(100);
  if (baromem > 1) {
    baromem = 0;
    saveState(100, baromem);
  }

  ledmem = loadState(101);
  if (ledmem > 1) {
    ledmem = 0;
    saveState(101, ledmem);
  }

  forecastmem = loadState(102);
  if (forecastmem > 1) {
    forecastmem = 0;
    saveState(102, forecastmem);
  }

  altitudemem = loadState(103);
  //altitudemem = 1;
  if (altitudemem > 1) {
    altitudemem = 1;
    saveState(103, altitudemem);
  }

  sleepTime = loadState(104);
  if (sleepTime > 240 || sleepTime == 0) {
    sleepTime = 1;
    saveState(104, sleepTime);
  }

  send_batteryTime = loadState(105);
  if (send_batteryTime > 168 || send_batteryTime == 0) {
    send_batteryTime = 1;
    saveState(105, send_batteryTime);
  }



 // digitalWrite(27, LOW);
}


void presentation()  {
  sendSketchInfo("EFEKTA BME280 Sensor", "1.1");
  present(TEMP_CHILD_ID, S_TEMP, "TEMPERATURE [C or F]");
  wait(100);
  present(HUM_CHILD_ID, S_HUM, "HUMIDITY [%]");
  wait(100);
  present(BARO_CHILD_ID, S_BARO, "PRESSURE [hPa or mmHg]");
  wait(100);
  present(FORECAST_CHILD_ID, S_BARO, "FORECAST");
  wait(100);
  present(ALTITUDE_CHILD_ID, S_DISTANCE, "ALTITUDE [m]");
  wait(100);
  present(BAROCONF_CHILD_ID, S_CUSTOM, "PRESSURE 0:ON|1:OFF");
  wait(100);
  present(LEDCONF_CHILD_ID, S_CUSTOM, "LEDS 0:ON|1:OFF");
  wait(100);
  present(FORECASTCONF_CHILD_ID, S_CUSTOM, "FORECAST 0:ON|1:OFF");
  wait(100);
  present(ALTITUDECONF_CHILD_ID, S_CUSTOM, "ALTITUDE 0:ON|1:OFF");
  wait(100);
  present(SLEEP_TIME_SENS_ID, S_CUSTOM, "DELAY TIME|MIN");
  wait(100);
  present(BATTARY_SEND_SENS_ID, S_CUSTOM, "BATTERY SEND TIME|H");
}

void setup() {

  //digitalWrite(27, HIGH);

  if (isTransportReady() == true)
  {
    green_long_blink();
  } else {
    red_long_blink();
  }

  if (! bme.begin(&Wire)) {
    while (1);
  }
  bme.setSampling(Adafruit_BME280::MODE_FORCED,
                  Adafruit_BME280::SAMPLING_X1, // temperature
                  Adafruit_BME280::SAMPLING_X1, // pressure
                  Adafruit_BME280::SAMPLING_X1, // humidity
                  Adafruit_BME280::FILTER_OFF   );
                  sleep(1000);

  sleep_mode = 2;
}


void loop() {
  /*
  if (stat == 1) {
    send(altitudememMsg.set(altitudemem));
    red_long_blink();
    stat = 0;
  }
  */

  bme.takeForcedMeasurement(); // has no effect in normal mode
  wait(100);
  sendData();

  if (first_param_send == 1) {
    first_send_param ();
    first_param_send = 0;
  }

  if (w_battetyTime >= send_batteryTime * 60 * 60 * 1000) {
    readBatLev();
    sleep_mode = 2;
    w_battetyTime = 0;
  }

  //mySleepPrepare();
  //i2c_off();

  if (sleep_mode == 0) {
    sleep(sleepTime * 60 * 1000, false);
    //wait(500);
  }
  if (sleep_mode == 1) {
    sleep(sleepTime * 60 * 1000, true);
    sleep_mode = 0;
    //wait(1000);
  }
  if (sleep_mode == 2) {
    sleep(sleepTime * 60 * 1000, true);
    sleep_mode = 1;
    //wait(1000);
  }
  w_battetyTime = w_battetyTime + (sleepTime * 60 * 1000);
}


void receive(const MyMessage & message)
{
  if (message.sensor == BAROCONF_CHILD_ID) {
    if (message.type == V_VAR1) {
      if (message.getByte() <= 1) {
        baromem = message.getByte();
        saveState(100, baromem);
        if (send(baromemMsg.set(baromem))) {
          if (baromem == 0) {
            TRANSPORT_DEBUG(PSTR("MyS: SENDING PRESSURE: ON\n"));
          }
          if (baromem == 1) {
            TRANSPORT_DEBUG(PSTR("MyS: SENDING PRESSURE: OFF\n"));
          }
          if (ledmem == 0) {
            green_long_blink();
          }
        }
      }
    }
  }

  if (message.sensor == LEDCONF_CHILD_ID) {
    if (message.type == V_VAR1) {
      if (message.getByte() <= 1) {
        ledmem = message.getByte();
        saveState(101, ledmem);
        if (send(ledmemMsg.set(ledmem))) {
          if (ledmem == 0) {
            TRANSPORT_DEBUG(PSTR("MyS: LEDS: ON\n"));
          }
          if (ledmem == 1) {
            TRANSPORT_DEBUG(PSTR("MyS: LEDS: OFF\n"));
          }
          if (ledmem == 0) {
            green_long_blink();
          }
        }
      }
    }
  }

  if (message.sensor == FORECASTCONF_CHILD_ID) {
    if (message.type == V_VAR1) {
      if (message.getByte() <= 1) {
        forecastmem = message.getByte();
        saveState(102, forecastmem);
        if (send(forecastmemMsg.set(forecastmem))) {
          if (forecastmem == 0) {
            TRANSPORT_DEBUG(PSTR("MyS: SENDING FORECAST: ON\n"));
          }
          if (forecastmem == 1) {
            TRANSPORT_DEBUG(PSTR("MyS: SENDING FORECAST: OFF\n"));
          }
          if (ledmem == 0) {
            red_long_blink();
          }
        }
      }
    }
  }

  if (message.sensor == ALTITUDECONF_CHILD_ID) {
   // stat = 1;
    if (message.type == V_VAR1) {
      if (message.getByte() <= 1) {
        altitudemem = message.getByte();
        saveState(103, altitudemem);
        sleep(1000);
        send(altitudememMsg.set(altitudemem));
        if (ledmem == 0) {
          blue_long_blink();
        }
        if (altitudemem == 0) {
          TRANSPORT_DEBUG(PSTR("MyS: SENDING ALTITUDE: ON\n"));
        }
        if (altitudemem == 1) {
          TRANSPORT_DEBUG(PSTR("MyS: SENDING ALTITUDE: OFF\n"));
        }
      }
    }
  }


  if (message.sensor == SLEEP_TIME_SENS_ID) {
    if (message.type == V_VAR1) {
      if (message.getULong() <= 240 && message.getULong() != 0) {
        sleepTime = message.getULong();
        saveState(104, sleepTime);
        if (send(msg_sleep_time.set(sleepTime))) {
          TRANSPORT_DEBUG(PSTR("MyS: THE NEW INTERVAL SEND VALUES IS SET: %d MIN.\n"), sleepTime);
          if (ledmem == 0) {
            green_long_blink();
          }
        }
      }
    }
  }

  if (message.sensor == BATTARY_SEND_SENS_ID) {
    if (message.type == V_VAR1) {
      if (message.getULong() <= 168 && message.getULong() != 0) {
        send_batteryTime = message.getULong();
        saveState(105, send_batteryTime);
        if (send(msg_battary_send.set(send_batteryTime))) {
          TRANSPORT_DEBUG(PSTR("MyS: THE NEW INTERVAL BATTERY SEND IS SET: %d HOUR\n"), send_batteryTime);
          if (ledmem == 0) {
            green_long_blink();
          }
        }
      }
    }
  }
}




void sendData() {
  temperature = bme.readTemperature();
  if (baromem == 0 || forecastmem == 0) {
    pressure = bme.readPressure() / 100.0F;
  }
  if (altitudemem == 0) {
    altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
  }
  humidity = bme.readHumidity();

  if (!metric) {
    temperature = temperature * 9.0 / 5.0 + 32.0;
  } else {
    if (baromem == 0) {
      pressure_mm = pressure * 0.75006375541921;
    }
  }
  int forecast;
  if (forecastmem == 0) {
    forecast = sample(pressure);                        // Run the forecast function with a new pressure update.
  }

  //send(temperatureMsg.set(temperature, 0));
  //wait(200);
  if (abs(temperature - lastTemperature) >= tempThreshold) {
    if (send(temperatureMsg.set(temperature, 2))) {
      flag_led = 1;
    }
    lastTemperature = temperature;
    //sleep(5000);
  }

  if (abs(humidity - lastHumidity) >= humThreshold) {
    if (send(humidityMsg.set(humidity, 2))) {
      flag_led = 1;
    }
    lastHumidity = humidity;
    //sleep(5000);
  }

  if (baromem == 0) {
    if (!metric) {
      if (abs(pressure - lastPressure) >= presThreshold) {
        if (send(pressureMsg.set(pressure, 1))) {
          flag_led = 1;
        }
        lastPressure = pressure;
        //sleep(500);
      }

    } else {
      if (abs(pressure_mm - lastPressure_mm) >= pres_mmThreshold) {
        if (send(pressureMsg.set(pressure_mm, 1))) {
          flag_led = 1;
        }
        lastPressure_mm = pressure_mm;
        //sleep(500);
      }

    }
  }

  if (forecastmem == 0) {
    if (forecast != lastForecast) {
      if (send(forecastMsg.set(weather[forecast]))) {
        flag_led = 1;
      }
      lastForecast = forecast;
      //sleep(500);
    }
  }


  if (altitudemem == 0) {
    if (abs(altitude - lastAltitude) >= altiThreshold) {
      if (send(altitudeMsg.set(altitude, 2))) {
        flag_led = 1;
      }
      lastAltitude = altitude;
      //sleep(500);
    }

  }
  if (flag_led == 1) {
    if (ledmem == 0) {
      blue_long_blink();
    }
    flag_led = 0;
  } else {
    if (ledmem == 0) {
      green_long_blink();
    }
  }
}

void disableNfc() {
  NRF_NFCT->TASKS_DISABLE = 1;
  NRF_NVMC->CONFIG = 1;
  NRF_UICR->NFCPINS = 0;
  NRF_NVMC->CONFIG = 0;
}

void turnOffRadio() {
  NRF_RADIO->TASKS_DISABLE = 1;
  while (!(NRF_RADIO->EVENTS_DISABLED)) {}
}

void turnOffAdc() {
  if (NRF_SAADC->ENABLE) {
    NRF_SAADC->TASKS_STOP = 1;
    while (NRF_SAADC->EVENTS_STOPPED) {}
    NRF_SAADC->ENABLE = 0;
    while (NRF_SAADC->ENABLE) {}
  }
}

void turnOffHighFrequencyClock() {
  NRF_CLOCK->TASKS_HFCLKSTOP = 1;
  while ((NRF_CLOCK->HFCLKSTAT) & 0x0100) {}
}

void mySleepPrepare() {
  turnOffHighFrequencyClock();
  //turnOffRadio();
  NRF_UART0->ENABLE = 0;
}

void i2c_off()
{
  NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
  *(volatile uint32_t *)0x40004FFC = 0;
  *(volatile uint32_t *)0x40004FFC;
  *(volatile uint32_t *)0x40004FFC = 1;
}




void readBatLev() {
  NRF5_ESB_startListening();
  wait(200);
  temp = analogRead(29);
  vcc = temp * 0.0092957746478873 * 100;
  battery = map((int)vcc, BAT_MIN, BAT_MAX, 0, 100);
  if (battery < 0) {
    battery = 0;
  }
  if (battery > 100) {
    battery = 100;
  }
  if (first_send_battery == 1) {
    first_send_battery = 0;
    sendBatteryLevel(battery);
    //TRANSPORT_DEBUG(PSTR("MyS: SEND BATTERY LEVEL\n"));
    //TRANSPORT_DEBUG(PSTR("MyS: BATTERY LEVEL ADC: %d\n"), temp);
    old_battery = battery;
  } else {
    if (old_battery != battery) {
      if (battery < old_battery) {
        old_battery = battery;
        sendBatteryLevel(battery);
        //TRANSPORT_DEBUG(PSTR("MyS: SEND BATTERY LEVEL\n"));
        //TRANSPORT_DEBUG(PSTR("MyS: BATTERY LEVEL ADC: %d\n"), temp);
      } else {
        battery = old_battery;
      }
    }
  }
}

void red_short_blink() {
  digitalWrite(25, LOW);
  sleep(50);
  digitalWrite(25, HIGH);
}

void green_short_blink() {
  digitalWrite(26, LOW);
  sleep(50);
  digitalWrite(26, HIGH);
}

void blue_short_blink() {
  digitalWrite(27, LOW);
  sleep(50);
  digitalWrite(27, HIGH);
}
void red_long_blink() {
  digitalWrite(25, LOW);
  sleep(200);
  digitalWrite(25, HIGH);
}

void green_long_blink() {
  digitalWrite(26, LOW);
  sleep(200);
  digitalWrite(26, HIGH);
}

void blue_long_blink() {
  digitalWrite(27, LOW);
  sleep(200);
  digitalWrite(27, HIGH);
}

void white_blinkhw() {
  digitalWrite(27, LOW);
  digitalWrite(26, LOW);
  digitalWrite(25, LOW);
  delay(300);
  digitalWrite(27, HIGH);
  digitalWrite(26, HIGH);
  digitalWrite(25, HIGH);
}

void first_send_param () {
  send(msg_sleep_time.set(sleepTime));
  wait(100);
  send(ledmemMsg.set(ledmem));
  wait(100);
  send(msg_battary_send.set(send_batteryTime));
  wait(100);
  send(baromemMsg.set(baromem));
  wait(100);
  send(forecastmemMsg.set(forecastmem));
  wait(100);
  send(altitudememMsg.set(altitudemem));
  readBatLev();
}






// These functions are only included if the forecast function is enables. The are used to generate a weater prediction by checking if the barometric pressure is rising or falling over time.

float getLastPressureSamplesAverage()
{
  float lastPressureSamplesAverage = 0;
  for (int i = 0; i < LAST_SAMPLES_COUNT; i++) {
    lastPressureSamplesAverage += lastPressureSamples[i];
  }
  lastPressureSamplesAverage /= LAST_SAMPLES_COUNT;

  return lastPressureSamplesAverage;
}


// Forecast algorithm found here
// http://www.freescale.com/files/sensors/doc/app_note/AN3914.pdf
// Pressure in hPa -->  forecast done by calculating kPa/h
int sample(float pressure) {
  // Calculate the average of the last n minutes.
  int index = minuteCount % LAST_SAMPLES_COUNT;
  lastPressureSamples[index] = pressure;

  minuteCount++;
  if (minuteCount > 185) {
    minuteCount = 6;
  }

  if (minuteCount == 5) {
    pressureAvg = getLastPressureSamplesAverage();
  }
  else if (minuteCount == 35) {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) { // first time initial 3 hour
      dP_dt = change * 2; // note this is for t = 0.5hour
    }
    else {
      dP_dt = change / 1.5; // divide by 1.5 as this is the difference in time from 0 value.
    }
  }
  else if (minuteCount == 65) {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) { //first time initial 3 hour
      dP_dt = change; //note this is for t = 1 hour
    }
    else {
      dP_dt = change / 2; //divide by 2 as this is the difference in time from 0 value
    }
  }
  else if (minuteCount == 95) {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) { // first time initial 3 hour
      dP_dt = change / 1.5; // note this is for t = 1.5 hour
    }
    else {
      dP_dt = change / 2.5; // divide by 2.5 as this is the difference in time from 0 value
    }
  }
  else if (minuteCount == 125) {
    float lastPressureAvg = getLastPressureSamplesAverage();
    pressureAvg2 = lastPressureAvg; // store for later use.
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) { // first time initial 3 hour
      dP_dt = change / 2; // note this is for t = 2 hour
    }
    else {
      dP_dt = change / 3; // divide by 3 as this is the difference in time from 0 value
    }
  }
  else if (minuteCount == 155) {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) { // first time initial 3 hour
      dP_dt = change / 2.5; // note this is for t = 2.5 hour
    }
    else {
      dP_dt = change / 3.5; // divide by 3.5 as this is the difference in time from 0 value
    }
  }
  else if (minuteCount == 185) {
    float lastPressureAvg = getLastPressureSamplesAverage();
    float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
    if (firstRound) { // first time initial 3 hour
      dP_dt = change / 3; // note this is for t = 3 hour
    }
    else {
      dP_dt = change / 4; // divide by 4 as this is the difference in time from 0 value
    }
    pressureAvg = pressureAvg2; // Equating the pressure at 0 to the pressure at 2 hour after 3 hours have past.
    firstRound = false; // flag to let you know that this is on the past 3 hour mark. Initialized to 0 outside main loop.
  }

  int forecast = UNKNOWN;
  if (minuteCount < 35 && firstRound) { //if time is less than 35 min on the first 3 hour interval.
    forecast = UNKNOWN;
  }
  else if (dP_dt < (-0.25)) {
    forecast = THUNDERSTORM;
  }
  else if (dP_dt > 0.25) {
    forecast = UNSTABLE;
  }
  else if ((dP_dt > (-0.25)) && (dP_dt < (-0.05))) {
    forecast = CLOUDY;
  }
  else if ((dP_dt > 0.05) && (dP_dt < 0.25))
  {
    forecast = SUNNY;
  }
  else if ((dP_dt > (-0.05)) && (dP_dt < 0.05)) {
    forecast = STABLE;
  }
  else {
    forecast = UNKNOWN;
  }

  // uncomment when debugging
  //Serial.print(F("BME280 - Forecast at minute "));
  //Serial.print(minuteCount);
  //Serial.print(F(" dP/dt = "));
  //Serial.print(dP_dt);
  //Serial.print(F("kPa/h --> "));
  //Serial.println(weather[forecast]);

  return forecast;
}
Последний раз редактировалось Berk 09 дек 2018, 15:02, всего редактировалось 2 раза.

Berk
Сообщения: 80
Зарегистрирован: 11 окт 2017, 22:05

Re: NRF52832 и датчик BME280

Сообщение Berk » 09 дек 2018, 14:44

Andrey_64 писал(а):
09 дек 2018, 14:17

Подтянул на питание 21 и19 PIO
Достаточно просто подтянуть на плюс через резюк(10K) пин 21, зачем 19ый, непонимаю, а лучше ресет по нормальному, тоесть еще кнопку и ей замыкать на землю

Andrey_64
Сообщения: 10
Зарегистрирован: 06 дек 2018, 18:24

Re: NRF52832 и датчик BME280

Сообщение Andrey_64 » 09 дек 2018, 15:25

Так и есть - через 10Ком подтягивал
Про 19PIO где-то встречал в гугле
Периодически глючит то-ли ST-Link ,то-ли IDE
Произошла ошибка при загрузке скетча
0x4000
adapter speed: 10000 kHz
Error: init mode failed (unable to connect to the target)
in procedure 'program'
in procedure 'init' called at file "embedded:startup.tcl", line 473
in procedure 'ocd_bouncer'
** OpenOCD init failed **
shutdown command invoked
Подожду еще один ST-Link
Вложения
ST-LINK-V2.jpg
ST-LINK-V2.jpg (56.69 КБ) 18951 просмотр

Berk
Сообщения: 80
Зарегистрирован: 11 окт 2017, 22:05

Re: NRF52832 и датчик BME280

Сообщение Berk » 09 дек 2018, 15:40

Andrey_64 писал(а):
09 дек 2018, 15:25
Так и есть - через 10Ком подтягивал
Про 19PIO где-то встречал в гугле
Периодически глючит то-ли ST-Link ,то-ли IDE
Произошла ошибка при загрузке скетча
0x4000
adapter speed: 10000 kHz
Error: init mode failed (unable to connect to the target)
in procedure 'program'
in procedure 'init' called at file "embedded:startup.tcl", line 473
in procedure 'ocd_bouncer'
** OpenOCD init failed **
shutdown command invoked
Подожду еще один ST-Link
Нет связи с девайсом - unable to connect to the target, проверяйте провода sdio swdio, бывают перепутаны или плохой контакт. Стлинк довольно тупая вещь, на любом все должно работать. Еще раз пробегитесь по теме - viewtopic.php?f=5&t=362 (ту часть где описывается установка дров через http://zadig.akeo.ie/ )

Berk
Сообщения: 80
Зарегистрирован: 11 окт 2017, 22:05

Re: NRF52832 и датчик BME280

Сообщение Berk » 09 дек 2018, 15:42

а именно этот програматор как на фото, это пожалуй самый ужасный, единственный из моей коллекции на котором не имут 52832 ( мож у меня он такой, но прошивает только 51822 или вообще ничего не шьет, уже не помню, но у них с алиэкспресс у таких у всех внутряк разный, китайцы все время что то убирают)

Andrey_64
Сообщения: 10
Зарегистрирован: 06 дек 2018, 18:24

Re: NRF52832 и датчик BME280

Сообщение Andrey_64 » 09 дек 2018, 16:21

Опять переставил поддержку NRF5x и ST-Link V2-залилось ?!
И снова глюк!
603492 MCO:SLP:WUP=-1
603494 TSF:TRI:TPU
60349⸮
__ __ ____
| \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___
| |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
| | | | |_| |___| | __/ | | \__ \ _ | | \__ \
|_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/
|___/ 2.3.0

23 MCO:BGN:INIT NODE,CP=RNNNN---,VER=2.3.0
27 MCO:BGN:BFR
2
__ __

Ответить