Цикл for, порты, датчики.

Yura_15
Offline
Зарегистрирован: 02.08.2019

Здравствуйте. Пробую писать код для мониторинга температуры. Хочу написать лаконично через цикл for, чтобы не повторять код по много раз, но как не понимаю. В Python я бы создал список из [dht1, dht2, dhtn, ...] и все. Подскажите как это сделать для ардуино.

Moderator : пожалуйста, вставьте код правильно - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Paul_it
Offline
Зарегистрирован: 25.06.2019

Здравствуй

1. Есть такая функция как вставка кода.(когда пишешь тему в левом верхнем углу красные фигурные скобки).

2. Скажи откуда брал этот код (источник).

3. Ты хочешь проверять температуру циклически? (например каждый день). Если так, то делай таймером через millis() или micros().

Yura_15
Offline
Зарегистрирован: 02.08.2019

Привет. Хочу, чтоб в цикле он обошел все порты с датчиками.

Первоисточник выглядит так :

// DHT Temperature & Humidity Sensor
// Unified Sensor Library Example
// Written by Tony DiCola for Adafruit Industries
// Released under an MIT license.

// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor

#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 2     // Digital pin connected to the DHT sensor 
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

// Uncomment the type of sensor in use:
//#define DHTTYPE    DHT11     // DHT 11
#define DHTTYPE    DHT22     // DHT 22 (AM2302)
//#define DHTTYPE    DHT21     // DHT 21 (AM2301)

// See guide for details on sensor wiring and usage:
//   https://learn.adafruit.com/dht/overview

DHT_Unified dht(DHTPIN, DHTTYPE);

uint32_t delayMS;

void setup() {
  Serial.begin(9600);
  // Initialize device.
  dht.begin();
  Serial.println(F("DHTxx Unified Sensor Example"));
  // Print temperature sensor details.
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  Serial.println(F("------------------------------------"));
  Serial.println(F("Temperature Sensor"));
  Serial.print  (F("Sensor Type: ")); Serial.println(sensor.name);
  Serial.print  (F("Driver Ver:  ")); Serial.println(sensor.version);
  Serial.print  (F("Unique ID:   ")); Serial.println(sensor.sensor_id);
  Serial.print  (F("Max Value:   ")); Serial.print(sensor.max_value); Serial.println(F("°C"));
  Serial.print  (F("Min Value:   ")); Serial.print(sensor.min_value); Serial.println(F("°C"));
  Serial.print  (F("Resolution:  ")); Serial.print(sensor.resolution); Serial.println(F("°C"));
  Serial.println(F("------------------------------------"));
  // Print humidity sensor details.
  dht.humidity().getSensor(&sensor);
  Serial.println(F("Humidity Sensor"));
  Serial.print  (F("Sensor Type: ")); Serial.println(sensor.name);
  Serial.print  (F("Driver Ver:  ")); Serial.println(sensor.version);
  Serial.print  (F("Unique ID:   ")); Serial.println(sensor.sensor_id);
  Serial.print  (F("Max Value:   ")); Serial.print(sensor.max_value); Serial.println(F("%"));
  Serial.print  (F("Min Value:   ")); Serial.print(sensor.min_value); Serial.println(F("%"));
  Serial.print  (F("Resolution:  ")); Serial.print(sensor.resolution); Serial.println(F("%"));
  Serial.println(F("------------------------------------"));
  // Set delay between sensor readings based on sensor details.
  delayMS = sensor.min_delay / 1000;
}

void loop() {
  // Delay between measurements.
  delay(delayMS);
  // Get temperature event and print its value.
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  else {
    Serial.print(F("Temperature: "));
    Serial.print(event.temperature);
    Serial.println(F("°C"));
  }
  // Get humidity event and print its value.
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Error reading humidity!"));
  }
  else {
    Serial.print(F("Humidity: "));
    Serial.print(event.relative_humidity);
    Serial.println(F("%"));
  }

 

 

Paul_it
Offline
Зарегистрирован: 25.06.2019
unsigned long a;
unsigned long your_time = ;
void setup() {

}

void loop() {
if (millis() - a > your_time) { //ёр тайм - задержка при цикле(например 10 дней) 
// тут твой фор
last_time = millis(); // обнуление(без него никак, на работе никак не скажется)
}
if (millis() < last_time) last_time = millis(); //обнуление по проишествии 50 суток(максимум для ансайнед лонг)
}

вроде как-то так.

Paul_it
Offline
Зарегистрирован: 25.06.2019

И еще - у меня тоже тема в песочнице про ИК приемник. Посмотри, может что подскажешь.

Yura_15
Offline
Зарегистрирован: 02.08.2019

Не то. В цикле обход по датчика, портам - сократить этот кусок кода:

  // Датчик №1
  sensors_event_t event;
  dht1.temperature().getEvent(&event);
  Serial.print(F("Дат. №1  "));
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  else {
    Serial.print(F("Temp.: ")); Serial.print(event.temperature); Serial.print(F("°C  "));
  }
  // Get humidity event and print its value.
  dht1.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Error reading humidity!"));
  }
  else {
    Serial.print(F("Hum.: ")); Serial.print(event.relative_humidity); Serial.println(F("%"));
  }
  
  // Датчик №2
  //sensors_event_t event;
  Serial.print(F("Дат. №2  "));
  dht2.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  else {
    Serial.print(F("Temp.: ")); Serial.print(event.temperature); Serial.print(F("°C  "));
  }
  // Get humidity event and print its value.
  dht2.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Error reading humidity!"));
  }
  else {
    Serial.print(F("Hum.: ")); Serial.print(event.relative_humidity); Serial.println(F("%"));
  }

 

Paul_it
Offline
Зарегистрирован: 25.06.2019
unsigned long a;
unsigned long your_time = ;
void setup() {

}

void loop() {
  if (millis() - a > your_time) { //ёр тайм - задержка при цикле(например 10 дней)

    sensors_event_t event;
    dht1.temperature().getEvent(&event);
    Serial.print(F("Дат. №1  "));
    if (isnan(event.temperature)) {
      Serial.println(F("Error reading temperature!"));
    } else {
      Serial.print(F("Temp.: ")); Serial.print(event.temperature); Serial.print(F("°C  "));
    }

    dht1.humidity().getEvent(&event);
    if (isnan(event.relative_humidity)) {
      Serial.println(F("Error reading humidity!"));
    }
    else {
      Serial.print(F("Hum.: ")); Serial.print(event.relative_humidity); Serial.println(F("%"));
    }
    Serial.print(F("Дат. №2  "));
    dht2.temperature().getEvent(&event);
    if (isnan(event.temperature)) {
      Serial.println(F("Error reading temperature!"));
    } else {
      Serial.print(F("Temp.: ")); Serial.print(event.temperature); Serial.print(F("°C  "));
    }
    dht2.humidity().getEvent(&event);
    if (isnan(event.relative_humidity)) {
      Serial.println(F("Error reading humidity!"));
    } else {
      Serial.print(F("Hum.: ")); Serial.print(event.relative_humidity); Serial.println(F("%"));
    }

    last_time = millis(); // обнуление(без него никак, на работе никак не скажется)
  }
  if (millis() < last_time) last_time = millis(); //обнуление по проишествии 50 суток(максимум для ансайнед лонг)
}

Вроде так. Если не так, значит я тебя не понял

Paul_it
Offline
Зарегистрирован: 25.06.2019

Лаконично ты не напишешь. в dht1.tmperature().getEvent(&event) номер датчика на переменную ты не переделаешь, т.к это название функции. Если только в библиотеку не залезешь.

Yura_15
Offline
Зарегистрирован: 02.08.2019

Как это былобы на Python:

for port in [dht1, dht2, dht3, dht4, dht5, dht6 и тд.]:

  // Датчики ВСЕ, ВСЕ
  sensors_event_t event;
  port.temperature().getEvent(&event);
  Serial.print(F("Дат. №1  "));
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  else {
    Serial.print(F("Temp.: ")); Serial.print(event.temperature); Serial.print(F("°C  "));
  }
  // Get humidity event and print its value.
  port.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Error reading humidity!"));
  }
  else {
    Serial.print(F("Hum.: ")); Serial.print(event.relative_humidity); Serial.println(F("%"));
  }
  

 

Paul_it
Offline
Зарегистрирован: 25.06.2019

Paul_it пишет:

Лаконично ты не напишешь. в dht1.tmperature().getEvent(&event) номер датчика на переменную ты не переделаешь, т.к это название функции. Если только в библиотеку не залезешь.

Это не питон. К сожалению тут нельзя оперировать частями (номерами) функций.

Paul_it
Offline
Зарегистрирован: 25.06.2019

Можно конечно записать функции в другие функции и ими ЦЕЛЫМИ оперировать, но укоротить не получится.

Yura_15
Offline
Зарегистрирован: 02.08.2019

Думаю, сначала данные в массив, а массив можно будет и циклом обойти. Не беда. Спасибо за ответы.

Paul_it
Offline
Зарегистрирован: 25.06.2019

Удачи

T.Rook
Offline
Зарегистрирован: 05.03.2016

мне кажется Вы об этом:

google arduino dht array

b707
Offline
Зарегистрирован: 26.05.2017

Paul_it пишет:

Это не питон. К сожалению тут нельзя оперировать частями (номерами) функций.

может не стоит так категорично писать, если сами не разбираетесь? dht в данном коде - это обьект, обьекты можно организовывать в массивы

Yura_15
Offline
Зарегистрирован: 02.08.2019

Понял, спасибо за ответ.

Yura_15
Offline
Зарегистрирован: 02.08.2019

b707 пишет:

Paul_it пишет:

Это не питон. К сожалению тут нельзя оперировать частями (номерами) функций.

может не стоит так категорично писать, если сами не разбираетесь? dht в данном коде - это обьект, обьекты можно организовывать в массивы

Пожалуйста объясните как представить объект? Думаю не int :)

Попробовал составить масив массивов, но ошибка говорит, что не представлен тип объекта.

Спасибо за ответ.

b707
Offline
Зарегистрирован: 26.05.2017

Сначала создаете столько dht обьектов, сколько нужно. потом помещаете указатели на них в массив

DHT_Unified dht1(DHTPIN1, DHTTYPE);
DHT_Unified dht2(DHTPIN2, DHTTYPE);
DHT_Unified dht3(DHTPIN3, DHTTYPE);

// массив указателей на обьекты
DHT_Unified* dht_sensors(&dht1, &dht2, &dht3);

 

Yura_15
Offline
Зарегистрирован: 02.08.2019

b707 пишет:

Сначала создаете столько dht обьектов, сколько нужно. потом помещаете указатели на них в массив

DHT_Unified dht1(DHTPIN1, DHTTYPE);
DHT_Unified dht2(DHTPIN2, DHTTYPE);
DHT_Unified dht3(DHTPIN3, DHTTYPE);

// массив указателей на обьекты
DHT_Unified* dht_sensors(&dht1, &dht2, &dht3);

 

float garland1_temp[9] = {111.1, 112.2, 113.3, -114.4, 115.5, 116.6, 117.7, 118.8, 119.9};
float garland2_temp[9] = {211.1, 212.2, 213.3, -214.4, 215.5, 216.6, 217.7, 218.8, -219.9};
garland_Unified* garland_temp(&garland1_temp, &garland2_temp);

пытаюсь такой код попробовать. Результат: "garland_Unified' does not name a type"

b707
Offline
Зарегистрирован: 26.05.2017

Yura_15 пишет:

float garland1_temp[9] = {111.1, 112.2, 113.3, -114.4, 115.5, 116.6, 117.7, 118.8, 119.9};
float garland2_temp[9] = {211.1, 212.2, 213.3, -214.4, 215.5, 216.6, 217.7, 218.8, -219.9};
garland_Unified* garland_temp(&garland1_temp, &garland2_temp);

пытаюсь такой код попробовать. Результат: "garland_Unified' does not name a type"

вам непонятно сообщение об ошибке?  Ясно же написано - garland_Unified не является именем типа

Чтобы использовать в программе тип данных, отличный от простейших int или float - его нужно сначала описать самому или подключить библиотеку с его описанием. Судя по ошибке - Вы не делаете ни того, ни другого. Откуда вы взяли это garland_Unified - сами придумали?

Кроме того, это не единственная ошибка. Когда вы ее поправите - вас ждет следующая.

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

Yura_15
Offline
Зарегистрирован: 02.08.2019

Так точно. Юзаю ардуину три недели. Много лет писал код на Питоне, для себя,  для автоматической торговли. Тоже не глубоко вникал работало и ладно.

Код писал типа по аналогии от вашего. Я понял, профанация. Значит, как я понимаю, проблема избыточного кода останется пока не научусь описывать объект. Хотел итерировать объекты - цикл внутри цикла, типа так.

Спасибо за ответ. Совет принял.

b707
Offline
Зарегистрирован: 26.05.2017

Yura_15 пишет:

Код писал типа по аналогии от вашего. Я понял, профанация. Значит, как я понимаю, проблема избыточного кода останется пока не научусь описывать объект. Хотел итерировать объекты - цикл внутри цикла, типа так.

Изначально вы спрашивали про датчики DHT. Если работать с ними - обьекты можно взять готовые, из библиотеки DHT. Если вы будете работать со стандартными датчиками - для них почти всегда уже есть готовые библиотеки. Но если придумываете что-то свое - то да, обьекты придется конструировать свои.

Yura_15
Offline
Зарегистрирован: 02.08.2019

Полностью вас понял.

Yura_15
Offline
Зарегистрирован: 02.08.2019

b707 пишет:

Сначала создаете столько dht обьектов, сколько нужно. потом помещаете указатели на них в массив

DHT_Unified dht1(DHTPIN1, DHTTYPE);
DHT_Unified dht2(DHTPIN2, DHTTYPE);
DHT_Unified dht3(DHTPIN3, DHTTYPE);

// массив указателей на обьекты
DHT_Unified* dht_sensors(&dht1, &dht2, &dht3);

 

Спасибо совет. Только что включил. Все итерируется по датчикам, но итерирует почему-в обратном порядке, то есть нулевой элемент списка в конце списка. Все проверял по пинам на макетке. Такой нюанс.

DHT_Unified* dht_sensors_gar_1(&dht11, &dht12, &dht13, &dht14, &dht15, &dht16, &dht17, &dht18);