Последовательный плоттер не отображает предоставленные мной данные

Я хочу использовать функцию последовательного плоттера Arduino, одновременно используя DHT11 в качестве датчика влажности. Но у меня возникла проблема, поскольку плоттер не загружается по имеющемуся у меня коду. Помогите пожалуйста, в чем проблема, из-за которой не загружается серийный плоттер.

Вот код, который я написал:-

#include <dht.h>
#define dht_apin0 A0 // Датчик аналогового контакта подключен к

dht DHT0;

void setup() {

  Serial.begin(9600);
  delay(500);//Задержка для загрузки системы
  Serial.println("DHT11 Humidity Sensor\n");
  delay(1000);//Подождите перед доступом к датчику

}//завершаем "setup()"

void loop(){
  //Начало программы

    DHT0.read11(dht_apin0);

    Serial.print("Current humidity = ");
    Serial.print(DHT0.humidity);
    Serial.print("%  ");

    delay(5000);//Подождите 5 секунд, прежде чем снова получить доступ к датчику.

  //Самое быстрое должно быть раз в две секунды.

}// завершаем цикл()

, 👍1

Обсуждение

https://learn.adafruit.com/experimenters-guide-for-metro/circ08-using%20the%20arduino%20serial%20plotter, @Juraj

Последовательный плоттер понятия не имеет, что делать с текстом перед значением влажности или с % после него., @Gerben


1 ответ


2

Вы не можете отправлять на плоттер произвольную информацию (знаки процента, текст и т. д.). Плоттер только понимает числовые значения. Вам нужно отделить эти числовые значения друг от друга запятыми, а затем выполнить println в последнем значении:

Serial.print(percent);
Serial.print(F(","));
Serial.print(tankPercent(depth));
Serial.print(F(","));
Serial.print(litres);
Serial.print(F(","));
Serial.println(tankLitres(depth));

В вашем случае это будет просто:

Serial.println(DHT0.humidity);

Вы можете пойти немного дальше, если хотите переключиться между последовательным выходом или последовательным плоттером. В одном случае я просто установил постоянную переменную для графических или простых данных, а затем создал функцию для каждого из них (мои приведенные выше операторы Serial на самом деле находятся внутри функции под названием displayGraph()) ). Функция данных будет такой же, как у вас изначально, например:


void displayData(float depth, float percent, float litres){

  // глубина уровня воды (дюймы)

  Serial.print(F("current missing inches: "));
  Serial.println(mixtureDistance());

  // кубические дюймы

  Serial.print(F("total cubic inches: "));
  Serial.println(TANK_TOTAL_CUBIC_INCHES);

  Serial.print(F("current cubic inches: "));
  Serial.println(tankCurrentCubicInches(depth));

  // литры

  Serial.print(F("total litres: "));
  Serial.println(TANK_TOTAL_LITRES);

  // ... и т. д
}

У меня также есть проекты, в которых я использую переключатель, который, если он включен, устанавливает флаг для вывода в формате последовательного графика, а если выключен, использует процедуру последовательных данных.

Затем в вашем скетче loop() вы должны сделать что-то вроде:

graph
  ? displayGraph(depth, percent, litres)
  : displayData(depth, percent, litres);

...или немного более подробно, чем использовать третичный оператор:

if (graph){
  displayGraph(...);
}
else {
  displayData(...);
}

Вот пример последовательного плоттера Q&D для моей функции displayGraph(), приведенной выше. В правом верхнем углу изображения четыре цвета обозначают четыре части данных, которые я отправляю, по порядку:

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

Резкие движения — это просто удары по резервуару, чтобы получить какие-то переменные и нестабильные показания, например.

,