Комбинируйте DHT22 и SI114X.h

Похоже, я не могу объединить датчик солнечного света Grove и датчик температуры и влажности Grove DHT22. Я не могу понять почему.

У меня есть следующая настройка:

  • Seeeduino Cloud (Arduino Yún clone)
  • Датчик солнечного света Grove Shield Grove подключен к порту I2C
  • Датчик температуры и влажности Grove DHT22 подключен к порту A0

Я отправляю данные в Initialstate.com... Это мой код:

// Process.h дает нам доступ к классу Process, который позволяет
// мы общаемся с оболочкой
#include "DHT.h" //Temp Hum sensor
#include <Bridge.h>
#include <Process.h>
#include <Wire.h>
#include "SI114X.h" //Датчик солнечного света

SI114X SI1145 = SI114X();

////////////////////////////////////////////

//Запуск данных датчиков температуры и влажности
#define DHTPIN A0
// к какому датчику подключен датчик, в данном случае A0    
#define DHTTYPE DHT22   // DHT 22  (AM2302)

DHT dht(DHTPIN, DHTTYPE);
//Конец данных датчиков температуры и влажности

//////////////////////////////////
// Стример Начального состояния //
//////////////////////////////////
// URL to IS Bucket API
String ISBucketURL = "https://groker.initialstate.com/api/buckets";
// URL to IS Event API
String ISEventURL = "https://groker.initialstate.com/api/events";
// Ключ доступа (тот, который вы найдете в настройках своей учетной записи):
String accessKey = "KRYLC3tvJUiyTVqTJr5nRqgkKQI2FiDh";
String bucketKey = "Test_Klimaat2";
// Bucket name (имя, с которым ваши данные будут связаны в исходном состоянии):
String bucketName = "Test klimaat 2";
// Bucket key (hidden reference to your bucket that allows appending):
//String bucketKey = "arduino_stream";
// Bucket name (name your data will be associated with in Initial State):
//String bucketName = "Arduino Stream";
// How many signals are in your stream? You can have as few or as many as you want
const int NUM_SIGNALS = 5;
// Как называются ваши сигналы (т. е. "Температура", "Влажность" и т. Д.)
String signalName[NUM_SIGNALS] = {"Humidity", "Temperatur", "Visable", "Infrared", "UV"};
// Этот массив предназначен для хранения наших сигнальных данных позже
String signalData[NUM_SIGNALS];

// Это выполняется только один раз в самом начале
void setup() {
  Serial.begin(9600);
  Bridge.begin();
  Wire.begin(); 
  SI1145.Begin();
  dht.begin(); //Инициализировать датчик температуры и влажности

  while (!Serial);
    // Post Bucket
    Serial.println("Posting Bucket!");
    // The postBucket() function creates a bucket 
    // (unnecessary if the bucket already exists)
    postBucket();
}

// This repeats
void loop() {
  // Сбор данных
  // Считывание с порта для ввода или вывода или генерирование собственных значений/сообщений
  // Эти сигналы являются случайными числами для примера

  String VIS;
  String IR;
  String UV;
  String TEMP;
  String HUM;

  //Считывание кода DHT22
  HUM = String((float)dht.readHumidity());
  TEMP = String((float)dht.readTemperature());

  //код считывания данных солнечного света
  VIS = String(SI1145.ReadVisible());
  IR = String(SI1145.ReadIR());
  UV = String((float)SI1145.ReadUV()/100);

  signalData[0] = HUM;
  signalData[1] = TEMP;
  signalData[2] = VIS;
  signalData[3] = IR;
  signalData[4] = UV;

  // Post Data
  Serial.println("Posting Data!");
  // Функция postData() транслирует наши события
  postData(); 
  // Подождите 5 секунд перед сбором и отправкой следующей партии
  delay(5000);
}

// Вот функции создания и разноски корзины данных
// Их не нужно редактировать - все, что вам нужно изменить для
// вашей ситуации можно найти выше

void postBucket() {
  // Инициализировать процесс
  Process isbucket;

  isbucket.begin("curl");
  isbucket.addParameter("-k");
  isbucket.addParameter("-v");
  isbucket.addParameter("-X");
  isbucket.addParameter("POST");
  isbucket.addParameter("-H");
  isbucket.addParameter("Content-Type:application/json");
  isbucket.addParameter("-H");
  isbucket.addParameter("Accept-Version:0.0.1");

  // IS Access Key Header
  isbucket.addParameter("-H");
  isbucket.addParameter("X-IS-AccessKey:" + accessKey);

  // IS Bucket Key Header
  isbucket.addParameter("-d");
  isbucket.addParameter("{\"bucketKey\": \"" + bucketKey + "\", \"bucketName\": \"" + bucketName + "\"}");
  isbucket.addParameter("https://groker.initialstate.com/api/buckets");
  // Run the process
  isbucket.run();
  Serial.flush();
}

void postData() {
  // Initialize the process
  Process isstreamer;
  isstreamer.begin("curl");
  isstreamer.addParameter("-k");
  isstreamer.addParameter("-v");
  isstreamer.addParameter("-X");
  isstreamer.addParameter("POST");
  isstreamer.addParameter("-H");
  isstreamer.addParameter("Content-Type:application/json");
  isstreamer.addParameter("-H");
  isstreamer.addParameter("Accept-Version:0.0.1");

  // IS Access Key Header
  isstreamer.addParameter("-H");
  isstreamer.addParameter("X-IS-AccessKey:" + accessKey);

  // IS Bucket Key Header
  // Note that bucketName is not needed here
  isstreamer.addParameter("-H");
  isstreamer.addParameter("X-IS-BucketKey:" + bucketKey);

  isstreamer.addParameter("-d");

  // Initialize a string to hold our signal data
  String jsonData;
  jsonData = "[";
  for (int i=0; i<NUM_SIGNALS; i++) {
    jsonData += "{\"key\": \"" + signalName[i] + "\", \"value\": \"" + signalData[i] + "\"}";
    if (i != NUM_SIGNALS - 1) {
      jsonData += ",";
    }
  }
  jsonData += "]";
  isstreamer.addParameter(jsonData);
  isstreamer.addParameter("https://groker.initialstate.com/api/events");
  // Print posted data for debug
  Serial.print("Sending data: ");
  Serial.println(jsonData);
  // Run the process
  isstreamer.run();
  Serial.flush();
}

Когда я запускаю этот код, последовательный монитор правильно отображает строку данных, которую я хочу отправить со всеми значениями. Однако данные НЕ отправляются. Только когда я закомментирую одну из этих строк в объявлении loop (), данные будут успешно отправлены в Initialstate. Очевидно, без комментируемых данных:

 //Чтение кода DHT22
  HUM = String((float)dht.readHumidity());
  TEMP = String((float)dht.readTemperature());

  //code reading Sunlight data
  VIS = String(SI1145.ReadVisible());
  IR = String(SI1145.ReadIR());
  UV = String((float)SI1145.ReadUV()/100);

Любые идеи приветствуются.

, 👍1

Обсуждение

Только небольшой вопрос, вы получаете точные показания с помощью DHT22? Какое значение резистора вы используете?, @Badreddine Zebbiche

Показания точны. Я использую датчик grove, так что резистор не требуется (я предполагаю) : https://www.seeedstudio.com/Grove-Temperature%26Humidity-Sensor-Pro-p-838.html..., @Sander


1 ответ


1

Я нашел решение. Основываясь на этом посте: http://forum.arduino.cc/index.php?topic=198433.0 Я пришел к выводу, что мои строки слишком длинные или у моей платы заканчивается память. Я удалил размещение корзины и создал сокращения в своих названиях сигналов. Это решило проблему.

,