Z-UNO DHT22+MH-Z19+2Relay

Данный раздел предназначен для русскоязычных пользователей. Если вы владеете английским, рекомендуем также просмотреть общую ветку обсуждений на английском.
Post Reply
AlexeyK
Posts: 4
Joined: 16 Jan 2020 18:28

Z-UNO DHT22+MH-Z19+2Relay

Post by AlexeyK »

Здравствуйте уважаемые форумчане!

Начинаю изучать плату Z-UNO. Есть задача управлять приточной вентиляцией в комнате по значениям температуры-влажности-CO2.
Из разных проектов собрал скетч:

Code: Select all

// add library
#include "ZUNO_DHT.h"
#include "EEPROM.h"
// pin connection
#define DHTPIN1 9  // first sensor
#define LedPin0 10
#define LedPin1 11

#define ADDRESS_0 0x00
#define ADDRESS_1 0x01

#define TEMPERATURE_CHANNEL 1
#define HUMIDITY_CHANNEL 2
#define PPM_CHANNEL 3

// Global variables to store data reported via getters
byte switchValue0 = EEPROM.read(ADDRESS_0);
byte switchValue1 = EEPROM.read(ADDRESS_1);

char response[9];
byte cmd[9] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 };

DHT dht1(DHTPIN1, DHT22);  // use "DHT11" instead of "DHT22" for DHT11 sensor
 
int humidity1;      // here we will store the humidity of first sensor
int temperature1;   // here we will store the temperature of first sensor  

int newValue;
int responseHigh;
int responseLow;
int ppm;



 
// set up channels
ZUNO_SETUP_CHANNELS(
      ZUNO_SWITCH_BINARY(getterSwitch0, setterSwitch0),
      ZUNO_SWITCH_BINARY(getterSwitch1, setterSwitch1),
      ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemperature1),
      ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumidity1),
      ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_CO2_LEVEL, 0, SENSOR_MULTILEVEL_SIZE_TWO_BYTES, SENSOR_MULTILEVEL_PRECISION_ZERO_DECIMALS, getter)
);

ZUNO_SETUP_SLEEPING_MODE(ZUNO_SLEEPING_MODE_ALWAYS_AWAKE);

boolean firstStart = true;

void setup() {
  Serial1.begin(9600); //connecting to sensor via UART
  dht1.begin();
  Serial0.begin(); 
  Serial0.println("start");
}
 
void loop() {
//Relay

if (firstStart) {

pinMode(LedPin0, OUTPUT);
delay(10);
if (EEPROM.read(ADDRESS_0) == 1)
digitalWrite(LedPin0, LOW);
else
digitalWrite(LedPin0, HIGH);

pinMode(LedPin1, OUTPUT);
delay(10);
if (EEPROM.read(ADDRESS_1) == 1)
digitalWrite(LedPin1, LOW);
else
digitalWrite(LedPin1, HIGH);
}
firstStart = false;

//Sensors
  int i = 0;
  for (i = 0; i < 9; i++) {
    Serial1.write(cmd[i]);
  }

  delay(100);

  i = 0;
  while (Serial1.available()) {
    response[i] = Serial1.read();
    i++;
  }

  responseHigh = (int) response[2]; // returned High level concentration
  responseLow  = (int) response[3]; // returned Low level concentration
  newValue = (256 * responseHigh) + responseLow;
  if ((newValue > (ppm + 100)) || (newValue < (ppm - 100))) {
    ppm = newValue;
    zunoSendReport(PPM_CHANNEL);
  }
  delay(1000);

  // obtaining readings from the sensor DHT
  humidity1 = dht1.readHumidity();
  temperature1 = dht1.readTemperature();
  Serial0.print("Humidity = "); 
  Serial0.print(humidity1);
  Serial0.println(" %  ");
  Serial0.print("Temperature = "); 
  Serial0.print(temperature1);
  Serial0.println(" *C");
  // send data to channels
  zunoSendReport(TEMPERATURE_CHANNEL);
  zunoSendReport(HUMIDITY_CHANNEL); 
  // send every 30 second
  delay(30000);
}

//Relay
void setterSwitch0(byte value) {
if (value > 0) {
digitalWrite(LedPin0, LOW);
if (EEPROM.read(ADDRESS_0) != 1)
EEPROM.write(ADDRESS_0, 1);
}
else {
digitalWrite(LedPin0, HIGH);
if (EEPROM.read(ADDRESS_0) != 0)
EEPROM.write(ADDRESS_0, 0);
}
switchValue0 = value;
}

byte getterSwitch0() {
return switchValue0;
}

void setterSwitch1(byte value) {
if (value > 0) {
digitalWrite(LedPin1, LOW);
if (EEPROM.read(ADDRESS_1) != 1)
EEPROM.write(ADDRESS_1, 1);
}
else {
digitalWrite(LedPin1, HIGH);
if (EEPROM.read(ADDRESS_1) != 0)
EEPROM.write(ADDRESS_1, 0);
}
switchValue1 = value;
}

byte getterSwitch1() {
return switchValue1;
}


//Sensors
int getter(void) {
  return newValue;
}

byte getterTemperature1() {
  return temperature1;
}
 
byte getterHumidity1() {
  return humidity1;
}
В целом работает, за исключением автоматического обновления показаний на контроллере.
т.е. показания прилетают в момент включения датчика и потом только по ручному запросу.
Контроллер RaZberry, дистрибутив самый последний.

В чем может быть проблема?
Attachments
before_update.JPG
before_update.JPG (141.91 KiB) Viewed 5216 times
after_update.JPG
after_update.JPG (137.94 KiB) Viewed 5216 times
User avatar
PoltoS
Posts: 7565
Joined: 26 Jan 2011 19:36

Re: Z-UNO DHT22+MH-Z19+2Relay

Post by PoltoS »

Сколее всего ассоциация не проставилась. 1:0 должна быть в 1ой группе
AlexeyK
Posts: 4
Joined: 16 Jan 2020 18:28

Re: Z-UNO DHT22+MH-Z19+2Relay

Post by AlexeyK »

Перепрописал ассоциацию. Горит восклицательный знак.

Но автообновление заработало, но с интервалом в 10! минут.
В скече вроде стоит при изменении показаний.
Attachments
ассоциация.JPG
ассоциация.JPG (20.31 KiB) Viewed 5196 times
User avatar
PoltoS
Posts: 7565
Joined: 26 Jan 2011 19:36

Re: Z-UNO DHT22+MH-Z19+2Relay

Post by PoltoS »

Посмотрите логи. Думаю, он чаще шлёт
AlexeyK
Posts: 4
Joined: 16 Jan 2020 18:28

Re: Z-UNO DHT22+MH-Z19+2Relay

Post by AlexeyK »

Закинул я в итоге эту плату почти на год в ящик.
Сменил Razberry на Fibaro. Дай думаю попробую может заработает нормально, но нет.
Тут решил сменить номера используемых каналов для zunoSendReport с 1,2,3 на 5,6,7 - и, о чудо, заработало.
Post Reply