Почта
Диск
     

Технология научного эксперимента

Создание аккаунта в облачном сервисе ThingSpeak

Перейдите на сайт ThingSpeak. Зайдите в раздел Регистрация (Sing Up) и получите аккаунт. Зайдите в аккаунт и создайте канал данных. Скопируйте API-ключ.

Добавление поддержки платы ESP32

Запустите Arduino IDE и откройте пункт меню "Файл->Настройки". В появившемся окне в поле "Дополнительные ссылки менеджера плат" укажите:
https://dl.espressif.com/dl/package_esp32_index.json
Нажмите на кнопку "OK".

Откройте пункт меню "Инструменты->Плата->Менеджер плат...". В появившемся окне в строке поиска укажите текст esp 32 и установите поддержку модуля esp32 нажав на кнопку "Установить". После окончания установки закройте окно.

Выберите плату ESP32 выбрав пункт меню "Инструменты->Плата->ESP32 Dev Module". Укажите порт, к которому подключен модуль.

Добавление библиотеки Meteonet

Скачайте ZIP-архив с библиотекой Meteonet:
Meteonet.zip

Запустите Arduino IDE и откройте пункт меню "Файл->Стекч->Подключить библиотеку->Добавить .ZIP библиотеку...".

Выберите скачанный файл Meteonet.zip

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Meteonet.h>

#define DEBUG 1

////////////////////////////
// Датчик DS18B20 -> ESP32
////////////////////////////
// DATA -> 4
// VCC  -> 3V
// GND  -> GND


// Global variables
OneWire           oneWire(4);
DallasTemperature sensors(&oneWire);
Meteonet          meteonet("7b3d979ca8330a94fa7e9e1b466d8b99e0bcdea1ec90596c0dcc8d7ef6b4300c");


void setup() {

  // Starting serial port
  if(DEBUG) {
    Serial.begin(9600);
    delay(500);
    Serial.println();
  }

  // Starting Meteonet
  meteonet.begin();
}


void loop() {

  sensors.requestTemperatures();
  double T = sensors.getTempCByIndex(0)+273.15;
  double err = 0.5;
  meteonet.print(AIR_TEMPERATURE, T, err);

  if(DEBUG) {
    Serial.println("T = "+String(T));
  }
}

  



/*
 * 
 * Список источников:
 * https://www.esp32.com/viewtopic.php?t=3332
 * https://techtutorialsx.com/2017/09/30/esp32-arduino-external-interrupts/
 * https://www.cooking-hacks.com/documentation/tutorials/geiger-counter-radiation-sensor-board-arduino-raspberry-pi-tutorial
 */


#include <SPI.h>
#include <Meteonet.h>


#define DEBUG 1                                               // режим отладки: 1 - включен, 0 - выключен

#define FACTOR_SBM20   0.00570                                // множитель для перехода от числа импульсов в минуту к мкЗв/ч
#define FACTOR_LND712  0.01000
#define FACTOR_M4011   0.00662
#define FACTOR_J305b   0.00812

const byte pin = 25;                                          // номер контакта, к которому подключен счетчик Гейгера
unsigned long counts;                                         // число импульсов от счетчика Гейгера
unsigned int  factor;                                         // множитель для пересчета числа импульсов за период к числу импульсов за минуту
unsigned long period = 60;                                    // период измерений, с
Meteonet meteonet("7b3d979ca8330a94fa7e9e1b466d8b99e0bcdea1ec90596c0dcc8d7ef6b4300c");                                   // создаем объект для работы с сетью Метеонет


// ФУНКЦИЯ ДЛЯ ПОДСЧЕТА ЧИСЛА ИМПУЛЬСОВ ОТ СЧЕТЧИКА
void IRAM_ATTR tubeImpulse() {
  counts++;
}


// НАЧАЛЬНЫЕ НАСТРОЙКИ
void setup() {
  // задаем скорость последовательной передачи данных, если включен режим отладки
  if(DEBUG) {
    Serial.begin(9600);
    Serial.println();
  }
  // обнуляем счетчик импульсов
  counts = 0;
  // вычисляем переводной множитель
  factor = 60 / period;
  // задаем режим работы контакта, к которому подключен счетчик Гейгера
  pinMode(pin, INPUT);
  // задаем обработчик внешнего прерывания
  attachInterrupt(pin, tubeImpulse, FALLING);
  // задаем период измерений
  meteonet.begin(period);
  // делаем задержку на 500 миллисекунд
  delay(500);
}


// ОСНОВНАЯ ФУНКЦИЯ
void loop() {
  // если прошел целый период измерений, то обрабатываем и отправляем данные
  if(meteonet.isReady()) {
    // определяем число импульсов за минуту
    unsigned long cpm = factor * counts;
    // вычисляем значение радиоактивности, мкЗв/ч
    double radiationValue = FACTOR_J305b * cpm;
    // задаем предполагаемую ошибку измерений, мкЗв/ч
    double radiationError = 0.01;
    // отправляем данные на сервер
    meteonet.send(AIR_RADIATION, radiationValue, radiationError);
    // если включен режим отладки, то выводим данные в последовательный порт
    if(DEBUG) {
      Serial.print(cpm);
      Serial.print(" counts/min ");
      Serial.print(radiationValue);
      Serial.println(" uSv/h");
    }
    // обнуляем счетчик
    counts = 0;
  }
}

  

Добавление библиотек

Запустите Arduino IDE и откройте пункт меню "Файл->Стекч->Подключить библиотеку->Управлять библиотеками...". В появившемся окне в поле поиска укажите DHT и установите библиотеку DHT sensor library. Нажмите на кнопку "OK".

Скачайте ZIP-файл с библиотекой Adafruit_Sensor по ссылке:
https://github.com/adafruit/Adafruit_Sensor/archive/master.zip
Откройте пункт меню "Файл->Стекч->Подключить библиотеку->Добавить ZIP библиотеку...". В появившемся окне укажите путь к скачанному ZIP-файлу. Нажмите на кнопку "ОК".

Пример #1. Скетч для проверки работы датчика

Откройте пункт меню "Файл->Примеры->DHT sensor library->DHTtester". В скетче поменяйте номер контакта данных с 2 на 5. Укажите тип сенсора DHT11. Откомпилируйте и загрузите скетч в плату ESP32 Dev Module. После успешной загрузки откройте Монитор порта и проверьте работоспособность датчика.

Пример #2. Скетч для отправки данных на сервер

#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"

/////////////////////////////////
// DHT11 -> ESP32
/////////////////////////////////
// DAT -> IO4 (желтый)
// VCC -> 3V3 (красный)
// GND -> GND (черный)

/////////////////////////////////
// DS18B20 -> ESP32
/////////////////////////////////
// DAT -> IO5 (зеленый)
// VCC -> 5V  (красный)
// GND -> GND (черный)

DHT dht(4, DHT11);
OneWire oneWire(5);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(9600);
  dht.begin();
  sensors.begin();
}

void loop() {
  // Измеряем температуру
  float T1 = dht.readTemperature();
  sensors.requestTemperatures();
  float T2 = sensors.getTempCByIndex(0);
  
  Serial.print("T1: ");
  Serial.print(T1);
  Serial.print(" T2: ");
  Serial.println(T2);

  delay(2000);
}