Климат контроль на Arduino MEGA 2560

nemecida
Offline
Зарегистрирован: 23.11.2015

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

1) Не могу сдеать так, чтоб оно сначало вывело на экран то, что написано в строках с 20 по 66 один раз(как фон), а потом выводило динамические значения с датчиков. если раскомментировать строку 67 тогда не выводит вообще никаких значений на экран.

2) В сериал порте выводит значение датчика нормально, а на экране выводит 0.

Вот код. Я его только начал писать. Не пинайте. 

#include <UTFT.h>
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
const int sensorPin = 0; //датчик
const int Relay = 13; //светодиод
int smoke_level; //уровень дыма
void setup()
{
  Serial.begin(9600);
  pinMode(sensorPin, INPUT);
  pinMode(Relay, OUTPUT);
  myGLCD.InitLCD();
}
void loop()
{
  int x1, x2, y1, y2;
  myGLCD.clrScr();
  {
    // Нарисовать несколько линий
    myGLCD.setColor(VGA_WHITE);
    //myGLCD.drawLine(x1,y1,x2,y2);
    myGLCD.drawLine(0, 184, 479, 184);
    myGLCD.drawLine(0, 49, 479, 49);
    myGLCD.drawLine(0, 319, 479, 319);
    myGLCD.drawLine(239, 49, 239, 319);

    myGLCD.setColor(VGA_WHITE);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.setFont(BigFont);
    myGLCD.print("HH.MM.SS", CENTER, 1);
    myGLCD.setFont(SmallFont);
    myGLCD.print("DD.MM.YYYY", CENTER, 20);


    //Улица
    myGLCD.setFont(BigFont);
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("OUTDOORS", 55, 59);
    myGLCD.print("Temp.  :", LEFT, 89);
    myGLCD.print("Hum.   :", LEFT, 129);
    //Кухня
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("KITCHEN", 303, 59);
    myGLCD.print("Temp.  :", 240, 89);
    myGLCD.print("Setting:", 240, 109);
    myGLCD.print("Hum.   :", 240, 129);

    myGLCD.setColor(VGA_RED);
    myGLCD.print("Gas: ", 240, 149);

    //Малая комната
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("SMALL ROOM", 29, 194);

    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("Temp.  :", LEFT, 224);
    myGLCD.print("Setting:", LEFT, 244);
    myGLCD.print("Hum.   :", LEFT, 264);

    //Большая комната
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("LARGE ROOM", 279, 194);
    myGLCD.print("Temp.  :", 240, 224);
    myGLCD.print("Setting:", 240, 244);
    myGLCD.print("Hum.   :", 240, 264);
//    while (1) {}
  }
  {
    const int sensorPin = 0; //датчик
    const int Relay = 13; //светодиод
    int smoke; //уровень дыма
    smoke_level = analogRead(sensorPin); // считать уровень дыма
    Serial.println(smoke_level);
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print(String(smoke), 303, 149);
    if (smoke_level > 100) { // проверить допустимый ли уровень дыма (газа)
      digitalWrite(Relay, HIGH); // если больше допустимого, зажечь светодиод
    }
    else {
      digitalWrite(Relay, LOW);
    }
  }
  delay (5000);
}


Araris
Offline
Зарегистрирован: 09.11.2012

Строки 19,68,69,70,71,83 - не нужны, вообще не нужны.

Строки 20-66 перенесите из loop() в конец setup(). Есть некоторые различия между loop() и setup(), хорошо бы Вам о них узнать.

Строка 67 - это бесконечный цикл, то есть выполнение скетча останавливается в этом месте. Совсем останавливается.

В строке 76 выводится значение smoke_level, а в строке 76 - smoke (нужна ли она вообще ?).

Общий вывод: Вам сильно не хватает понимания того, что Вы пишете, но это не навсегда ))), практика писания и гугление теории помогут.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nemecida пишет:

дали в универе задание

Хоть один признался! Молодец!

nemecida
Offline
Зарегистрирован: 23.11.2015

Большое вам спасибо, изменил, всё заработало. Просто клепал по примерам, которые дали. Да и программирую я под железо с сегодняшнего утра) С С++ и JAVA для меня сложновато перейти на AVR-овские коды. Буду сидеть и гуглить да учить, пока не поседею)

nemecida
Offline
Зарегистрирован: 23.11.2015

ЕвгенийП пишет:

nemecida пишет:

дали в универе задание

Хоть один признался! Молодец!

В смысле?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В смысле никто обычно не признаётся, что это учебное задание.

nemecida
Offline
Зарегистрирован: 23.11.2015

ЕвгенийП пишет:

В смысле никто обычно не признаётся, что это учебное задание.

Аааа, в этом смысле) А что, мне скрывать чтоле? Страшная тайна покрытая мраком! Уууууу!!! XD

nemecida
Offline
Зарегистрирован: 23.11.2015

Кстати, не подскажете, в чем измеряется уровень газа датчиком MQ-2? В промилле? Гуглил- не нашел такой информации.

Araris
Offline
Зарегистрирован: 09.11.2012

ЕвгенийП пишет:

Хоть один признался! Молодец!

Именно это меня и сподвигло помочь )))

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

nemecida пишет:

Кстати, не подскажете, в чем измеряется уровень газа датчиком MQ-2? В промилле? Гуглил- не нашел такой информации.

в попугаях. не шучу.

nemecida
Offline
Зарегистрирован: 23.11.2015

Gippopotam пишет:

в попугаях. не шучу.

Я понимаю,  это смешно, но попросил же не пинать.

Araris
Offline
Зарегистрирован: 09.11.2012

nemecida пишет:

Кстати, не подскажете, в чем измеряется уровень газа датчиком MQ-2? В промилле? Гуглил- не нашел такой информации.

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

Почитайте даташит (https://www.seeedstudio.com/depot/datasheet/MQ-2.pdf), возможно, там найдёте.

Особенно хороша концовка этого документа:

"Resistance value of MQ-2 is difference to various kinds and various concentration gases. So,When using this components, sensitivity adjustment is very necessary. we recommend that you calibrate the detector for 1000ppm liquified petroleum gas,or 1000ppm iso-butaneconcentration in air and use value of Load resistance that( RL) about 20 KΩ(5KΩ to 47 KΩ). When accurately measuring, the proper alarm point for the gas detector should be determined after considering the temperature and humidity influence."

nemecida
Offline
Зарегистрирован: 23.11.2015

Araris пишет:

Почитайте даташит.

Как раз его дочитал. ppm это получается миллионная доля. 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

nemecida пишет:

Gippopotam пишет:

в попугаях. не шучу.

Я понимаю,  это смешно, но попросил же не пинать.

дык эта... не шутил-же...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nemecida пишет:

Кстати, не подскажете, в чем измеряется уровень газа датчиком MQ-2? В промилле? Гуглил- не нашел такой информации.

В вольтах. Только MQ2 - это больше для дыма (хотя и метан с бутаном тоже). Для природного газа лучше MQ4.

А вообще, если интересно посмотреть как работаюст с с датчиками MQN на ардуино - Вам сюда http://playground.arduino.cc/Main/MQGasSensors

nemecida
Offline
Зарегистрирован: 23.11.2015

Вы не знаете, как подключить несколько BMP180 к одной Arduino?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

nemecida пишет:

Вы не знаете, как подключить несколько BMP180 к одной Arduino?

есть тема (или даже несколько) на форуме по этой теме.

Araris
Offline
Зарегистрирован: 09.11.2012
nemecida
Offline
Зарегистрирован: 23.11.2015

Gippopotam пишет:

есть тема (или даже несколько) на форуме по этой теме.

Нашел только это http://arduino.ru/forum/programmirovanie/arduino-mega-2560-i-datchiki-bmp180, но тут ничего не сказано об этом нормально.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

nemecida пишет:

Gippopotam пишет:

есть тема (или даже несколько) на форуме по этой теме.

Нашел только это http://arduino.ru/forum/programmirovanie/arduino-mega-2560-i-datchiki-bmp180, но тут ничего не сказано об этом нормально.

Я, если честно не пользовался ни аппаратными "расширителями" I2C, ни программными. Но если бы мне приперло использовать два таких датчика одновременно - я просто добавил бы к одному (или к обоим) по микроконтроллеру. Я не знаю, зачем вам может понадобится два таких датчика, но не исключено, что добавление "мозгов" может оказаться полезным со многих позиций.

nemecida
Offline
Зарегистрирован: 23.11.2015

А возможно ли как нибудь переназначить ножки для приема и передачи? Ибо оно автоматом выставлено SDA-A4(A20) и CLC- A5(A21)

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

nemecida пишет:

Большое вам спасибо, изменил, всё заработало. Просто клепал по примерам, которые дали. Да и программирую я под железо с сегодняшнего утра) С С++ и JAVA для меня сложновато перейти на AVR-овские коды. Буду сидеть и гуглить да учить, пока не поседею)

Что-то не похоже что Вы ассемблер выложили. Ну a ежели Вам тяжело перейти с С++ на С++, тады ой! :)

nemecida
Offline
Зарегистрирован: 23.11.2015

А разве AVR не на Си программируется? Да и коды НА железо и ПОД железо тоже немного отличаются. Я всего первый курс. Не надо так...

nemecida
Offline
Зарегистрирован: 23.11.2015

Поменял всё как Вы сказали, заработало. Счет с газового сенсора выводит и DHT работает, только если подключу к аналоговому пину(  Хотя всё делал по примерам из библиотек. BMP пробовал подключать к меге(в тесте и в коде что ниже) и ничего, показывает нули. При том, что подключая к нано- всё работает. Подобная беда и с DHT- в тестовом коде всё работает и на нано и на меге, но только если в меге подключить к аналоговому пину

#include <UTFT.h>
#include <Wire.h> 
#include <BMP085.h>

#include <dht11.h>      // Добавляем библиотеку DHT11
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN A1

BMP085 dps = BMP085(); 

long Temperature = 0, Pressure = 0;


extern uint8_t SmallFont[];
extern uint8_t BigFont[];

UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
   int smoke_level; //уровень дыма
   int sensorPin1 = 0; //датчик дыма
  // int sensorPin2 = 1; //датчик температуры/влажости

   int Relay1 = 13; //реле сигнализаци дыма
   int Relay2 = 14; //реле вытяжки
   int Relay3 = 15; //реле подогрева  
void setup()
{
  Serial.begin(9600);
  Serial.println("DHT11 test!");
  Wire.begin(); 
  dps.init();
 
  pinMode(sensorPin1, INPUT);
 // pinMode(sensorPin2, INPUT);
  //pinMode(sensorPin3, INPUT);
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  pinMode(Relay3, OUTPUT);

  digitalWrite(Relay1, HIGH);
  delay(1000);
  digitalWrite(sensorPin1, LOW);

  digitalWrite(Relay2, HIGH);
  delay(1000);
  //digitalWrite(sensorPin2, LOW);

  digitalWrite(Relay3, HIGH);
  delay(1000);
  //digitalWrite(sensorPin3, LOW);

  myGLCD.InitLCD();
  // Нарисовать несколько линий
     myGLCD.setColor(VGA_WHITE);
     int x1, x2, y1, y2;
     myGLCD.clrScr();
    //myGLCD.drawLine(x1,y1,x2,y2);
    myGLCD.drawLine(0, 184, 479, 184);
    myGLCD.drawLine(0, 49, 479, 49);
    myGLCD.drawLine(0, 319, 479, 319);
    myGLCD.drawLine(239, 49, 239, 319);
    
    myGLCD.setColor(VGA_WHITE);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.setFont(BigFont);
    myGLCD.print("HH.MM.SS", CENTER, 1);
    myGLCD.setFont(SmallFont);
    myGLCD.print("DD.MM.YYYY", CENTER, 20);


    //Улица
    myGLCD.setFont(BigFont);
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("OUTDOORS", 55, 59);
    myGLCD.print("Temp.   :", LEFT, 89);
    myGLCD.print("Pressure:", LEFT, 109);
    myGLCD.print("Hum.    :", LEFT, 129);
    
    //Кухня
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("KITCHEN", 303, 59);
    myGLCD.print("Temp.  :", 240, 89);
    myGLCD.print("Setting:", 240, 109);
    myGLCD.print("Hum.   :", 240, 129);
    myGLCD.setColor(VGA_RED);
    myGLCD.print("Gas: ", 240, 149);
    
    //Малая комната
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("SMALL ROOM", 29, 194);
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("Temp.  :", LEFT, 224);
    myGLCD.print("Setting:", LEFT, 244);
    myGLCD.print("Hum.   :", LEFT, 264);

    //Большая комната
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print("LARGE ROOM", 279, 194);    
    myGLCD.print("Temp.  :", 240, 224);
    myGLCD.print("Setting:", 240, 244);
    myGLCD.print("Hum.   :", 240, 264);
}
void loop()
{
  int chk;
  ; 
  // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  switch (chk){
  case DHTLIB_OK:  
    break;
  case DHTLIB_ERROR_CHECKSUM:
    Serial.println("Checksum error, \t");
    break;
  case DHTLIB_ERROR_TIMEOUT:
    Serial.println("Time out error, \t");
    break;
  default:
    Serial.println("Unknown error, \t");
    break;
  }
  // Выводим показания влажности и температуры
  Serial.print("Humidity = ");
  Serial.print(DHT.humidity, 1);
  Serial.print(", Temp = ");
  Serial.println(DHT.temperature,1);
  
    smoke_level = analogRead(sensorPin1); // считать уровень дыма
    Serial.println(smoke_level);
    myGLCD.setColor(VGA_WHITE);
    myGLCD.print(String(smoke_level), 368, 149);
    if (smoke_level > 1000) { // проверить допустимый ли уровень дыма (газа)
      digitalWrite(Relay1, HIGH); // если больше допустимого, включить реле
                            }
    else {
      digitalWrite(Relay1, LOW);
         }
        dps.getPressure(&Pressure); 
        dps.getTemperature(&Temperature);
          
        myGLCD.setColor(VGA_WHITE);
        myGLCD.print(String(Temperature*0.1), 144,89);
        myGLCD.print(String(Pressure/133.3), 144,109);
        myGLCD.setColor(VGA_WHITE);
        
        myGLCD.print(String(DHT.temperature), 368,89) ;
        myGLCD.print("*C ", 432,89 );
        myGLCD.print(String(DHT.humidity), 368,129);
        myGLCD.print("%", 432,129);
  delay (5000);
}
viktoriastrelkova
Offline
Зарегистрирован: 22.05.2016

извиняюсь за беспокойство, хотела попросить у Вас помощи по поводу климат-контроля, тк мне нужно разработать блок управления климат-контроля но я плохо представляю как все взаимосвязано с МК и т.д... Тоже в универе дали такое задание...И некому помочь ;( если не сложно напишите мне пожалуйста на почту viktoriastrelkova@mail.ru

asvitich
Offline
Зарегистрирован: 10.06.2016

Пытаюсь переделать по свои нужды данный проект (надеюсь автор не против), но что то не так (первый раз имею с этим дело) может кто подсказать что не так? нужно заставить работать реле 1 (включние по температуре 29 и отключение 32 градуса)

[code]
#include <UTFT.h>
#include <Wire.h> 


#include <dht11.h>      // Добавляем библиотеку DHT11
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN A1
#define Relay_1  8  // температура воды
//#define Relay_2  9  // температура суши
//#define Relay_3  10  //  реле лампы 
//#define Relay_4  11  // реле кормушки
long Temperature = 0, Pressure = 0;


extern uint8_t SmallFont[];
extern uint8_t BigFont[];

UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
 

void setup()
{
  Serial.begin(9600);
  Serial.println("DHT11 test!");
  Wire.begin(); 

 
   pinMode(Relay_1, OUTPUT); // температура воды
  // pinMode(Relay_2, OUTPUT); // температура суши
  // pinMode(Relay_3, OUTPUT); // реле лампы 
  // pinMode(Relay_4, OUTPUT); // реле кормушки
 

  myGLCD.InitLCD();
 // Нарисовать несколько линий
       myGLCD.setColor(VGA_WHITE);
       int x1, x2, y1, y2;
      myGLCD.clrScr();
      myGLCD.drawLine(0, 184, 479, 184);
      myGLCD.drawLine(0, 49, 479, 49);
      myGLCD.drawLine(0, 319, 479, 319);
      myGLCD.drawLine(239, 49, 239, 319);
       
      myGLCD.setColor(VGA_WHITE);
      myGLCD.setBackColor(0, 0, 0);
      myGLCD.setFont(BigFont);
      myGLCD.print("HH.MM.SS", CENTER, 1);
      myGLCD.setFont(SmallFont);
      myGLCD.print("DD.MM.YYYY", CENTER, 20);
      myGLCD.setFont(BigFont);
      myGLCD.setColor(VGA_WHITE);
      
      // водоем
      myGLCD.print("WATER", 55, 59);
      myGLCD.print("Temp.   :", LEFT, 89);
     
      // суша
      myGLCD.setColor(VGA_WHITE);
      myGLCD.print("COAST", 303, 59);
      myGLCD.print("Temp.  :", 240, 89);
      myGLCD.print("Hum.   :", 240, 109);
      
       //время работы лампы
      myGLCD.setColor(VGA_WHITE);
      myGLCD.print("SUNSHINE", 29, 194);
      myGLCD.print("Time   :", LEFT, 224);
      
   
     // время кормления
      myGLCD.setColor(VGA_WHITE);
      myGLCD.print("FOOD", 279, 194);   
      myGLCD.print("Time   :", 240, 224);
      myGLCD.print("Time   :", 240, 244);
      
 
}
void loop()
{
  int chk;
  ; 
  // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  switch (chk){
  case DHTLIB_OK:  
    break;
  case DHTLIB_ERROR_CHECKSUM:
    Serial.println("Checksum error, \t");
    break;
  case DHTLIB_ERROR_TIMEOUT:
    Serial.println("Time out error, \t");
    break;
  default:
    Serial.println("Unknown error, \t");
    break;
  }
  // Выводим показания влажности и температуры
  Serial.print("Humidity = ");
  Serial.print(DHT.humidity, 1);
  Serial.print(", Temp = ");
  Serial.println(DHT.temperature,1);
  

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


          
        myGLCD.setColor(VGA_WHITE);
        myGLCD.print(String(Temperature*0.1), 144,89);
        myGLCD.setColor(VGA_WHITE);
        
        myGLCD.print(String(DHT.temperature), 368,89) ;
        myGLCD.print("C ", 432,89 );
        myGLCD.print(String(DHT.humidity), 368,109);
        myGLCD.print("%", 432,109);
  delay (5000);
}
[/code]

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

asvitich пишет:

Пытаюсь переделать по свои нужды данный проект (надеюсь автор не против), но что то не так (первый раз имею с этим дело) может кто подсказать что не так? 

Только Вы  и никто другой. Объясните толком что с ним не так, тогда может быть Вам помогут.

asvitich
Offline
Зарегистрирован: 10.06.2016

нужно заставить работать реле 1 (включние по температуре 29 и отключение 32 градуса), оно не хочет.... один раз щелкнет при включении и все.

Lucius
Offline
Зарегистрирован: 08.07.2016

asvitich пишет:

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

Я тут тоже новичек, но может надо так.

 if (DHT.temperature <= 29) { digitalWrite(Relay_1,HIGH);// set the Relay ON
}
    else if (DHT.temperature > 32) { digitalWrite(Relay_1,LOW);// set the Relay Off
}
delay (2000);

Можно конечно еще добавить проверку если Low то перевести в High иначе ничего не делаем.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Lucius пишет:

asvitich пишет:

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

Я тут тоже новичек, но может надо так.

 if (DHT.temperature <= 29) { digitalWrite(Relay_1,HIGH);// set the Relay ON
}
    else if (DHT.temperature > 32) { digitalWrite(Relay_1,LOW);// set the Relay Off
}
delay (2000);

Можно конечно еще добавить проверку если Low то перевести в High иначе ничего не делаем.

Приведённые два куска кода будут сначала не включать реле, а выключать - если реле управляется по низкому уровню. Т.е. логика работы сменится с точностью до наоборот.