Arduino Due + DHT22 + Реле

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Задача этих прибамбасов измерять температуру и включать выключать реле (которое будет включать выключать электрокотел (слаботочку управляющую, потому что реле питая сам тэн жить не будет)).

Понимаю что это стрельба из пушки по воробьям, но задача самая первая частичная - в дальнейшем планируется добавлять функционал. Плюс надо с чего то начинать - я и это сделать то пока не могу - поэтому и обращаюсь за помощью. Зимой будет время поковыряться.

Текущий код

#include <dht22.h>
dht22 DHT22;
void setup()
{
  DHT22.attach(3);
  Serial.begin(9600);
  Serial.println("DHT22 TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT22LIB_VERSION);
}
void loop()
{
  Serial.println("\n");
  int chk = DHT22.read();
  Serial.print("Read sensor: ");
  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }
  Serial.print("Temperature (°C): ");
  Serial.println((float)DHT22.temperature, DEC);
  Serial.print("Humidity (%): ");
  Serial.println((float)DHT22.humidity, DEC);
  Serial.print("Dew Point (°C): ");
  Serial.println(DHT22.dewPoint(), DEC);
  delay(10000);
}

Как в него присобачить включение релюшки (висит на 2 пине) по достижении температуры 5 град и выключение при достижении 7 градусов?

maksim
Offline
Зарегистрирован: 12.02.2012
Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Спасибо. Вот вроде все добавил но вопрос нуба остался ... что писать в в поле оператора IF? 41 и 43 строки. В смысле как температура называется?

#include <dht22.h>
#define Relay_1  2  // Arduino Digital I/O pin number
dht22 DHT22;
void setup()
{
  pinMode(Relay_1, OUTPUT);  
  DHT22.attach(3);
  Serial.begin(9600);
  Serial.println("DHT22 TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT22LIB_VERSION);
  delay(4000); 
}
void loop()
{
  Serial.println("\n");
  int chk = DHT22.read();
  Serial.print("Read sensor: ");
  switch (chk)
  {
  case 0: 
    Serial.println("OK"); 
    break;
  case -1: 
    Serial.println("Checksum error"); 
    break;
  case -2: 
    Serial.println("Time out error"); 
    break;
  default: 
    Serial.println("Unknown error"); 
    break;
  }
  Serial.print("Temperature (°C): ");
  Serial.println((float)DHT22.temperature, DEC);
  Serial.print("Humidity (%): ");
  Serial.println((float)DHT22.humidity, DEC);
  Serial.print("Dew Point (°C): ");
  Serial.println(DHT22.dewPoint(), DEC);
  
  IF (???<=5)
  digitalWrite(Relay_1,HIGH);// set the Relay ON
  IF (???=>7)
  digitalWrite(Relay_1,LOW);// set the Relay OFF
  
  delay(10000);
}

 

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Вроде допер сам.

if (DHT22.temperature <= 30) digitalWrite(Relay_1,HIGH);// set the Relay ON
  else digitalWrite(Relay_1,LOW);// set the Relay Off

Буду копать дальше и тут если что допытывать :-)

maksim
Offline
Зарегистрирован: 12.02.2012

В первом варианте првильная логика, во втором синтаксис, так что скрестите их вместе и будет вам счастье.

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Это вы про то чтобы не было щелкунчика непрерывного туда\сюда?

Ну да я об помню но синтаксис меня "временно победил"...

Теперь я его... так наверно само то:

  if (DHT22.temperature <= 29) digitalWrite(Relay_1,HIGH);// set the Relay ON
  else if (DHT22.temperature > 32) digitalWrite(Relay_1,LOW);// set the Relay Off

температуры временно текущие в комнате - чтоб было понятно что релюшка правильно щелкает.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Anton Timkin пишет:

Задача этих прибамбасов измерять температуру и включать выключать реле (которое будет включать выключать электрокотел (слаботочку управляющую, потому что реле питая сам тэн жить не будет)).

Понимаю что это стрельба из пушки по воробьям, но задача самая первая частичная - в дальнейшем планируется добавлять функционал. Плюс надо с чего то начинать - я и это сделать то пока не могу - поэтому и обращаюсь за помощью. Зимой будет время поковыряться.

реле разные бывают.. тут вон народ носится на 100 ампер пускатели в розетку.. ну типа а вдруг чего :)

и про стрельбу по воробьям из пушки тоже можно не переживать... у нас тут есть инидивиды которые для ентой цели облачные сервера приспособили :)

 

 

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Puhlyaviy пишет:

реле разные бывают.. тут вон народ носится на 100 ампер пускатели в розетку.. ну типа а вдруг чего :)

и про стрельбу по воробьям из пушки тоже можно не переживать... у нас тут есть инидивиды которые для ентой цели облачные сервера приспособили :)

Конечно, я говорил о конкретном реле которое у меня есть, а не в целом о РЕЛЕ. 

А насчет "пушки" у меня на нее планов громадье... с учетом того что комутировать проводку звездой буду, то хочу максимально все завести на один блок. Если сдохнет легко заменить за 5 минут, чем постоянно следить за целым выводком разнообразия по всему дому.

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

А зимой с "дублером пушки" буду отлаживать все ништяки... мне это долго и тяжело дастся чувствую - весь опыт програмирования - бейсик в школе почти 30 лет назад :-)

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Вообщем сменил DHT22 на DS18B20 т.к. надо было датчик погружать в расширительный бак (самая низкая температура в системе). Все работало вот уже почти пару месяцев. Но решил прикрутить кард ридер и скидывать на него лог температуры. Скетч скидавается в дуину нормально, температуру измеряет, говорит что пишет на флэшку, но когда проверяю - флэшка пустая. Помогите разобраться что в скетче не так?

const int chipSelect = 10; //SC0 на Due
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SdFat.h>
#define ONE_WIRE_BUS 2
#define RELAY_ON LOW
#define RELAY_OFF HIGH
#define Relay_1  4
#define Relay_2  5
#define Relay_3  6
#define Relay_4  7
#define Relay_5  8
#define Relay_6  9
#define Relay_7  11
#define Relay_8  12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
unsigned long timer[10]; //Таймер на 10 установок если надо больше заменить соответсвенно
byte timerState[10]; //Таймер на 10 установок если надо больше заменить соответсвенно
SdFat sd;
SdFile myFile;
//----------------------------------------------------------------------------------------
void setup()
{
  digitalWrite(Relay_1, RELAY_OFF); // т.к. реле управляется LOW то чтобы они при перезагрузке не включались пишем именно в этом порядке
  digitalWrite(Relay_2, RELAY_OFF);
  digitalWrite(Relay_3, RELAY_OFF);
  digitalWrite(Relay_4, RELAY_OFF);
  digitalWrite(Relay_5, RELAY_OFF);
  digitalWrite(Relay_6, RELAY_OFF);
  digitalWrite(Relay_7, RELAY_OFF);
  digitalWrite(Relay_8, RELAY_OFF);
  pinMode(Relay_1, OUTPUT);
  pinMode(Relay_2, OUTPUT);
  pinMode(Relay_3, OUTPUT);
  pinMode(Relay_4, OUTPUT);
  pinMode(Relay_5, OUTPUT);
  pinMode(Relay_6, OUTPUT);
  pinMode(Relay_7, OUTPUT);
  pinMode(Relay_8, OUTPUT);
  pinMode(10, OUTPUT);
  Serial.begin(9600);
  sensors.begin();
  while (!Serial) {} 
  delay(400);  // задержка из-за перезагрузки Due
  if (!sd.begin(chipSelect, SPI_QUARTER_SPEED)) sd.initErrorHalt();
}
//---------------------------------------------------------------------
void loop()
{
  if (delaySeconds(1, 10)) {  // цифра "1" это используемый таймер, а "10" это задержка в секундах, минутах или часах
    sensors.requestTemperatures(); // Отправка команды на получение температуры
    Serial.print("Temperature is: ");
    Serial.println(sensors.getTempCByIndex(0));
    if (!myFile.open("test.txt", O_RDWR | O_CREAT | O_AT_END)) {
    sd.errorHalt("opening test.txt for write failed");
    }
    Serial.print("Writing to test.txt..."); // если файл успешно открыт то пишем
    myFile.println(sensors.getTempCByIndex(0));
    myFile.close(); // закрываем файл
    Serial.println("done.");
    if (sensors.getTempCByIndex(0) <= 5) digitalWrite(Relay_1, RELAY_ON); //включаем реле если температура ниже 
    else if (sensors.getTempCByIndex(0) > 7) digitalWrite(Relay_1, RELAY_OFF); //выключаем реле если температура выше 
  }
  // Тут пишем остальной код который не выполняется в первом таймере
}

//--------------------------------------------------------------------
// Все ниже должо идти после основного "loop()" и относится только к таймеру

int delayHours(byte timerNumber, unsigned long delaytimeH) {
  delayMilliSeconds(timerNumber, delaytimeH * 1000 * 60 * 60);
}
int delayMinutes(byte timerNumber, unsigned long delaytimeM) {
  delayMilliSeconds(timerNumber, delaytimeM * 1000 * 60);
}
int delaySeconds(byte timerNumber, unsigned long delaytimeS) {
  delayMilliSeconds(timerNumber, delaytimeS * 1000);
}

int delayMilliSeconds(int timerNumber, unsigned long delaytime) {
  unsigned long timeTaken;
  if (timerState[timerNumber] == 0) { //If the timer has been reset (which means timer (state ==0) then save millis() to the same number timer,
    timer[timerNumber] = millis();
    timerState[timerNumber] = 1;    //now we want mark this timer "not reset" so that next time through it doesn't get changed.
  }
  if (millis() > timer[timerNumber]) {
    timeTaken = millis() + 1 - timer[timerNumber]; //here we see how much time has passed
  }
  else {
    timeTaken = millis() + 2 + (4294967295 - timer[timerNumber]); //if the timer rolled over (more than 48 days passed)then this line accounts for that
  }
  if (timeTaken >= delaytime) {        //here we make it easy to wrap the code we want to time in an "IF" statement, if not then it isn't and so doesn't get run.
    timerState[timerNumber] = 0; //once enough time has passed the timer is marked reset.
    return 1;                          //if enough time has passed the "IF" statement is true
  }
  else {                               //if enough time has not passed then the "if" statement will not be true.
    return 0;
  }
}

 

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Упс я ламер... это флэшка гнала. Заменил на другую - все работает!!! Какой же форум суперский!!! Еще никто не ответил а все заработало! :-)

 

С наступающим всех!

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Спрашивай, не стесняйся ))))

 

Тебя тоже с наступающим!

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Кстати, нке забывай что millis() переполняется за 59 дней и дуня виснет!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

лучше бы ссылочкой поделился на библиотеку DHT22 которая с дуей работает...

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

JollyBiber пишет:

Кстати, нке забывай что millis() переполняется за 59 дней и дуня виснет!

А я купился на то что в таймере вроде предусмотрен сброс через 48 дней.

Или я неправильно 91 строку понял???

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Puhlyaviy пишет:

лучше бы ссылочкой поделился на библиотеку DHT22 которая с дуей работает...

Упс, а я их все перепробовал (штук 5) и только одна нормально заработала. Только я не помню откуда ее взял.

Вот расшарил со своего драйва.

https://drive.google.com/file/d/0Bwj7vhGs7_SpYXBjLURuNF9wblk/edit?usp=sharing

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Вот нашел Watchdog библиотеку для Дуи.

http://www.leonardomiliani.com/2013/nuova-libreria-advancedfunctions-per-arduino-due/?lang=en

Но не могу ее заставить работать. Ктонить запускал WDT на Дуе успешно?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Anton Timkin пишет:

Вот нашел Watchdog библиотеку для Дуи.

http://www.leonardomiliani.com/2013/nuova-libreria-advancedfunctions-per-arduino-due/?lang=en

Но не могу ее заставить работать. Ктонить запускал WDT на Дуе успешно?

спасиб за DHT22

про WDT нада править arduino core кучками. там текстовик и все написано что делать.

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Да там одну строчку всего лишь надо закоментить. Это я сделал а вот все равно WD не работает. Ладно после НГ еще попробую разобраться и скетч выложу.

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Решил попробовать переписать скетч под использование schedule.

Черт побери мне так нравится больше - можно сколько угодно баловаться delay - контролер при этом не морозится. Скетч немного распух при загрузке в контролер зато похудел в самом Ide - чисто визуально мне это нравится больше.

Последний код такой.

#include <Scheduler.h>
#include <SdFat.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_PIN 2
#define RELAY_ON LOW
#define RELAY_OFF HIGH
#define Relay_1  4
#define Relay_3  5
#define Relay_5  6
#define Relay_7  7
#define Relay_9  8
#define Relay_11  9
#define Relay_13  11
#define Relay_15  12
OneWire oneWire(ONE_WIRE_BUS_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress Probe01 = { 0x28, 0x99, 0xE7, 0x3C, 0x05, 0x00, 0x00, 0xDD };
DeviceAddress Probe02 = { 0x28, 0x9E, 0x38, 0x3D, 0x05, 0x00, 0x00, 0xE6 };
const int chipSelect = 10; //SC0 на Due
int led =  13;
SdFat sd;
SdFile myFile;
//----------------------------------------------------------------------------------------
void setup()
{
  digitalWrite(Relay_1, RELAY_OFF); // т.к. реле управляется LOW то чтобы они при перезагрузке не включались пишем именно в этом порядке
  digitalWrite(Relay_3, RELAY_OFF);
  digitalWrite(Relay_5, RELAY_OFF);
  digitalWrite(Relay_7, RELAY_OFF);
  digitalWrite(Relay_9, RELAY_OFF);
  digitalWrite(Relay_11, RELAY_OFF);
  digitalWrite(Relay_13, RELAY_OFF);
  digitalWrite(Relay_15, RELAY_OFF);
  pinMode(Relay_1, OUTPUT);
  pinMode(Relay_3, OUTPUT);
  pinMode(Relay_5, OUTPUT);
  pinMode(Relay_7, OUTPUT);
  pinMode(Relay_9, OUTPUT);
  pinMode(Relay_11, OUTPUT);
  pinMode(Relay_13, OUTPUT);
  pinMode(Relay_15, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(led, OUTPUT);
  Serial.begin(115200);
  sensors.begin();
  sensors.setResolution(Probe01, 12);
  sensors.setResolution(Probe02, 12);
  while (!Serial) {}
  if (!sd.begin(chipSelect, SPI_FULL_SPEED)) sd.initErrorHalt();
  if (!myFile.open("temp.txt", O_RDWR | O_CREAT | O_AT_END))
  {
    sd.errorHalt("opening temp.txt for write failed");
  }
  Serial.print("Reload..."); // если файл успешно открыт то пишем
  myFile.print("Reload");
  myFile.close(); // закрываем файл
  Scheduler.startLoop(loop2);
  Scheduler.startLoop(loop3);
}
//---------------------------------------------------------------------
void loop() {
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
  delay(1000);
}
void loop2() {
  Serial.println();
  Serial.print("Number of Devices found on bus = ");
  Serial.println(sensors.getDeviceCount());
  Serial.print("Getting temperatures... ");
  Serial.println();
  sensors.requestTemperatures(); // Отправка команды на получение температуры
  Serial.print("Temperature 1 is:   ");
  Serial.println(sensors.getTempCByIndex(0));
  Serial.print("Temperature 2 is:   ");
  Serial.println(sensors.getTempCByIndex(1));
  if (!myFile.open("temp.txt", O_RDWR | O_CREAT | O_AT_END))
  {
    sd.errorHalt("opening temp.txt for write failed");
  }
  Serial.print("Writing to temp.txt..."); // если файл успешно открыт то пишем
  myFile.print("Temp 1 ");
  myFile.println(sensors.getTempCByIndex(0));
  myFile.print("Temp 2 ");
  myFile.println(sensors.getTempCByIndex(1));
  myFile.close(); // закрываем файл
  Serial.println("done.");
  if (sensors.getTempCByIndex(0) <= 5) digitalWrite(Relay_1, RELAY_ON); //включаем реле если температура ниже
  else if (sensors.getTempCByIndex(0) > 7) digitalWrite(Relay_1, RELAY_OFF); //выключаем реле если температура выше
  delay(60000);
}
void loop3() {
  digitalWrite(Relay_3, RELAY_ON);
  delay(60000);
  digitalWrite(Relay_3, RELAY_OFF);
  if (!myFile.open("temp.txt", O_RDWR | O_CREAT | O_AT_END))
  {
    sd.errorHalt("opening temp.txt for write failed");
  }
  Serial.print("Pump restarted"); // если файл успешно открыт то пишем
  myFile.print("Pump restarted");
  myFile.close(); // закрываем файл
  delay(86400000);
  yield();
}

//----------------------------------------------------------------
// Ниже относится к настройкам датчиков температуры
void printTemperature(DeviceAddress deviceAddress)
{ float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00)
  {
    Serial.print("Error getting temperature  ");
  }
  else
  { Serial.print("C: ");
    Serial.print(tempC);
    // разлочить две строки ниже если нужна температура по Фаренгейту
    //Serial.print(" F: ");
    //Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

Добавил еще один loop для выключения насоса на минуту раз в сутки (слегка завоздушиватся система) не критично но так стало еще лучше.

А вот WDT так и не запустился. В голом виде из образца рабтает. Если закоментирую строку блокирующую WDT в core и использую свой скетч то таймер исправно ресетует через 16 секунд. Но если вставляю в свой скетч ресет таймера то ниче не работает. Система не стартует вообще. Пробовал вставлять ресет в разные части скетча, в разные лупы но ничего не меняется. Может ктонить помочь куда искать?

Скетч с попыткой использования WDT такой:

#include "advancedFunctions.h"
#include <Scheduler.h>
#include <SdFat.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_PIN 2
#define RELAY_ON LOW
#define RELAY_OFF HIGH
#define Relay_1  4
#define Relay_3  5
#define Relay_5  6
#define Relay_7  7
#define Relay_9  8
#define Relay_11  9
#define Relay_13  11
#define Relay_15  12
OneWire oneWire(ONE_WIRE_BUS_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress Probe01 = { 0x28, 0x99, 0xE7, 0x3C, 0x05, 0x00, 0x00, 0xDD };
DeviceAddress Probe02 = { 0x28, 0x9E, 0x38, 0x3D, 0x05, 0x00, 0x00, 0xE6 };
const int chipSelect = 10; //SC0 на Due
int led =  13;
SdFat sd;
SdFile myFile;
//----------------------------------------------------------------------------------------
void setup()
{
  wdt.enable(16000);
  digitalWrite(Relay_1, RELAY_OFF); // т.к. реле управляется LOW то чтобы они при перезагрузке не включались пишем именно в этом порядке
  digitalWrite(Relay_3, RELAY_OFF);
  digitalWrite(Relay_5, RELAY_OFF);
  digitalWrite(Relay_7, RELAY_OFF);
  digitalWrite(Relay_9, RELAY_OFF);
  digitalWrite(Relay_11, RELAY_OFF);
  digitalWrite(Relay_13, RELAY_OFF);
  digitalWrite(Relay_15, RELAY_OFF);
  pinMode(Relay_1, OUTPUT);
  pinMode(Relay_3, OUTPUT);
  pinMode(Relay_5, OUTPUT);
  pinMode(Relay_7, OUTPUT);
  pinMode(Relay_9, OUTPUT);
  pinMode(Relay_11, OUTPUT);
  pinMode(Relay_13, OUTPUT);
  pinMode(Relay_15, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(led, OUTPUT);
  Serial.begin(115200);
  sensors.begin();
  sensors.setResolution(Probe01, 12);
  sensors.setResolution(Probe02, 12);
  while (!Serial) {}
  if (!sd.begin(chipSelect, SPI_FULL_SPEED)) sd.initErrorHalt();
  if (!myFile.open("temp.txt", O_RDWR | O_CREAT | O_AT_END))
  {
    sd.errorHalt("opening temp.txt for write failed");
  }
  Serial.print("Reload..."); // если файл успешно открыт то пишем
  myFile.print("Reload");
  myFile.close(); // закрываем файл
  Scheduler.startLoop(loop2);
  Scheduler.startLoop(loop3);
}
//---------------------------------------------------------------------
void loop() {
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
  delay(1000);
  wdt.restart();
}
void loop2() {
  Serial.println();
  Serial.print("Number of Devices found on bus = ");
  Serial.println(sensors.getDeviceCount());
  Serial.print("Getting temperatures... ");
  Serial.println();
  sensors.requestTemperatures(); // Отправка команды на получение температуры
  Serial.print("Temperature 1 is:   ");
  Serial.println(sensors.getTempCByIndex(0));
  Serial.print("Temperature 2 is:   ");
  Serial.println(sensors.getTempCByIndex(1));
  if (!myFile.open("temp.txt", O_RDWR | O_CREAT | O_AT_END))
  {
    sd.errorHalt("opening temp.txt for write failed");
  }
  Serial.print("Writing to temp.txt..."); // если файл успешно открыт то пишем
  myFile.print("Temp 1 ");
  myFile.println(sensors.getTempCByIndex(0));
  myFile.print("Temp 2 ");
  myFile.println(sensors.getTempCByIndex(1));
  myFile.close(); // закрываем файл
  Serial.println("done.");
  if (sensors.getTempCByIndex(0) <= 5) digitalWrite(Relay_1, RELAY_ON); //включаем реле если температура ниже
  else if (sensors.getTempCByIndex(0) > 7) digitalWrite(Relay_1, RELAY_OFF); //выключаем реле если температура выше
  delay(60000);
}
void loop3() {
  digitalWrite(Relay_3, RELAY_ON);
  delay(60000);
  digitalWrite(Relay_3, RELAY_OFF);
  if (!myFile.open("temp.txt", O_RDWR | O_CREAT | O_AT_END))
  {
    sd.errorHalt("opening temp.txt for write failed");
  }
  Serial.print("Pump restarted"); // если файл успешно открыт то пишем
  myFile.print("Pump restarted");
  myFile.close(); // закрываем файл
  delay(86400000);
  yield();
}

//----------------------------------------------------------------
// Ниже относится к настройкам датчиков температуры
void printTemperature(DeviceAddress deviceAddress)
{ float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00)
  {
    Serial.print("Error getting temperature  ");
  }
  else
  { Serial.print("C: ");
    Serial.print(tempC);
    // разлочить две строки ниже если нужна температура по Фаренгейту
    //Serial.print(" F: ");
    //Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

 

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

АУ есь тут кто? Или все еще пьяные в салатах валяются :-)

Дуя+schedule+wdt мною так и не побеждены, помогите плз. 

PS гугля тоже молчит в т.ч. на пендоском наречии.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Anton Timkin пишет:

АУ есь тут кто? Или все еще пьяные в салатах валяются :-)

Дуя+schedule+wdt мною так и не побеждены, помогите плз. 

PS гугля тоже молчит в т.ч. на пендоском наречии.

и никито тебе не поможет.. тут два с половиной инвалида у которых дуя.. :)

и на буржуйском форуме может быть челвоек 5 и они тож тока свои проблемы решают каждый сам..

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Ну ладно с этим разобрались... просто безо всяких библиотек в лупе вставляем строчку ниже и все работает отлично.

WDT_Restart( WDT );

Щас мучаю на будущее надо будет подключить два DHT22 датчика... туплю как это сделать.

В этой библиотеке просто прописать два пина не получается. Можешь помочь?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Anton Timkin пишет:

Щас мучаю на будущее надо будет подключить два DHT22 датчика... туплю как это сделать.

В этой библиотеке просто прописать два пина не получается. Можешь помочь?

так а зачем сразу 2 датчика на одном контролере?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

да и в библиотеке не нужно прописывать 2 пина.

нужно для каждого пина инициализировать библиотеку. 

типа

DHT22.attach(3);

DHT22.attach(4);

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Один на улице, второй в помещении. Простые onewire темпертурные не подходят - нужны показания влажности и снаружи и внутри.

А как потом разделить чтение из разных датчиков?

void setup()
{
  DHT22.attach(2);
  DHT22.attach(3);
  SerialUSB.begin(115200);
  SerialUSB.println("DHT22 TEST PROGRAM ");
  SerialUSB.print("LIBRARY VERSION: ");
  SerialUSB.println(DHT22LIB_VERSION);
}

void loop()
{
  SerialUSB.println("\n");

  int chk = DHT22.read();

  SerialUSB.print("Read sensor: ");
  switch (chk)
  {
    case 0: SerialUSB.println("OK"); break;
    case -1: SerialUSB.println("Checksum error"); break;
    case -2: SerialUSB.println("Time out error"); break;
    default: SerialUSB.println("Unknown error"); break;
  }

  SerialUSB.print("Humidity (%): ");
  SerialUSB.println((float)DHT22.humidity, DEC);

  SerialUSB.print("Temperature (°C): ");
  SerialUSB.println((float)DHT22.temperature, DEC);

  SerialUSB.print("Temperature (°F): ");
  SerialUSB.println(DHT22.fahrenheit(), DEC);

  SerialUSB.print("Temperature (°K): ");
  SerialUSB.println(DHT22.kelvin(), DEC);

  SerialUSB.print("Dew Point (°C): ");
  SerialUSB.println(DHT22.dewPoint(), DEC);

  SerialUSB.print("Dew PointFast (°C): ");
  SerialUSB.println(DHT22.dewPointFast(), DEC);

  delay(2000);
  }

 

Anton Timkin
Offline
Зарегистрирован: 29.09.2013

Методом научного тыка допетрил...

#include <dht22.h>
dht22 DHT22;

void setup()
{
  DHT22.attach(2);
  DHT22.attach(3);
  SerialUSB.begin(115200);
}

void loop()
{
  WDT_Restart( WDT );
  DHT22.read(1);
  SerialUSB.print("Humidity 1 (%): ");
  SerialUSB.println((float)DHT22.humidity, DEC);
  SerialUSB.print("Temperature 1 (°C): ");
  SerialUSB.println((float)DHT22.temperature, DEC);
  SerialUSB.print("Dew Point 1 (°C): ");
  SerialUSB.println(DHT22.dewPoint(), DEC);
  delay(2000);
  DHT22.read(2);
  SerialUSB.print("Humidity 2 (%): ");
  SerialUSB.println((float)DHT22.humidity, DEC);
  SerialUSB.print("Temperature 2 (°C): ");
  SerialUSB.println((float)DHT22.temperature, DEC);
  SerialUSB.print("Dew Point 2 (°C): ");
  SerialUSB.println(DHT22.dewPoint(), DEC);
  delay(2000);
  }

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Anton Timkin пишет:

Методом научного тыка допетрил...

мЫладец. :)

the_wall
Offline
Зарегистрирован: 06.06.2013

Поделитесь библиотекой для due

newnovichok
Offline
Зарегистрирован: 28.04.2022

здравствуйте? @Anton Timkin. а можно целиком код с esp 01 реле и DHT 22. делаю умную теплицу с доступом через BLYNK.