Умная теплица на базе Arduino Mega

Cyoko
Offline
Зарегистрирован: 22.08.2014

Если в первой строчке & то как свет будет светить с 0 до 2 ? Поэтому или .
Про вторую строку впринципе да , все условия в первой строке.

Можно поподробней про симистор с отловом 0 .

bwn
Онлайн
Зарегистрирован: 25.08.2014

Реактивные нагрузки дают помеху. Попробуйте на выходе реле RC цепочки, 100оМ+0,1мКф (>400в).

bwn
Онлайн
Зарегистрирован: 25.08.2014

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

Если денег не жалко, то твердотельные реле SSR. Они разные есть.

Cyoko
Offline
Зарегистрирован: 22.08.2014

Блин приклоняюсь перед людьми которые во всем этом разбираются :) 

Мне значит надо между реле и розетками под мои нагрузки цепочки поставить ? На обе реле ? Пойду гуглить как выглядят rc цепочки :) И почему больше 400 вольт , если в розетке 220 ? Этот вопрос так сказать для общего развития .

Cyoko
Offline
Зарегистрирован: 22.08.2014

То есть в твердотельных реле SSR уже и цепочки и отлов 0 ?

bwn
Онлайн
Зарегистрирован: 25.08.2014

Пиковое напряжение равно U* на корень из 3. А RC цепочка выглядит как последовательно включеные резистор и конденсатор, эта шняга параллельно нагрузке.

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

То есть в твердотельных реле SSR уже и цепочки и отлов 0 ?

Да, только по даташиту смотреть. Есть и без 0.

Cyoko
Offline
Зарегистрирован: 22.08.2014

типа конденсатор излишки себе берет ?

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

типа конденсатор излишки себе берет ?

физику точно не расскажу, типа подпитывает в момент просадки. часто приходится подбирать.

Cyoko
Offline
Зарегистрирован: 22.08.2014

Так , информации получил вагон , спасибо . Буду переваривать . Резюмируя , проблема вклчения выключения света при включении вентилятора из - за реактивных токов , которая лечится установкой RC- цепочки между выходом реле и нагрузкой или покупкой более совершенного реле. Так ?

Кстати экран тоже мигать начинал (ну на котором вся инфа и работает он от ардуины)

Cyoko
Offline
Зарегистрирован: 22.08.2014

Посмотрел реле , в самаре они по 300р , вроде не дорого . С учетом того что они на 16 или 25 А . А в китае я покупал за 2 бакса , с учетом того что думаю они 16А не выдержат .

http://eworld.ru/trends/pr/g:a519011bb84487a48627fed90050dcd7/g2:a519011...

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

Так , информации получил вагон , спасибо . Буду переваривать . Резюмируя , проблема вклчения выключения света при включении вентилятора из - за реактивных токов , которая лечится установкой RC- цепочки между выходом реле и нагрузкой или покупкой более совершенного реле. Так ?

Кстати экран тоже мигать начинал (ну на котором вся инфа и работает он от ардуины)

Обычно помогает, но не факт. Здесь какие то ветки читал, у людей до полного экранирования платы доходило. Но начать лучше с простых методов.

Тверд.реле токи лучше заряжайте 2-3х кратные на ДНАТ, хотя с ЭПРА это может и не так критично.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Cyoko пишет:

типа конденсатор излишки себе берет ?

Не совсем. Снабберная цепочка если и не гасит, то делает более пологим фронт импульса: симисторы критично относятся к высоким скоростям нарастания импульса - могут самопроизвольно открываться...

Cyoko
Offline
Зарегистрирован: 22.08.2014

Еще уточнение , глючит просто при включении второго реле , даже без подключения нагрузок к ним :(

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

При включении реле вентилятора (все происходит без подключения нагрузок к розеткам !!!) экран меркнет(подсветка светит , но цифр не видно) , реле света начинает включаться и выключаться. Вот какая фишка. Точно это реле ? Может я что не так подключил ? Но вроде все верно :(

https://www.dropbox.com/s/26jr56otsumbenb/2014-12-27%2012.09.21.jpg?dl=0

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

Еще уточнение , глючит просто при включении второго реле , даже без подключения нагрузок к ним :(

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

При включении реле вентилятора (все происходит без подключения нагрузок к розеткам !!!) экран меркнет(подсветка светит , но цифр не видно) , реле света начинает включаться и выключаться. Вот какая фишка. Точно это реле ? Может я что не так подключил ? Но вроде все верно :(

https://www.dropbox.com/s/26jr56otsumbenb/2014-12-27%2012.09.21.jpg?dl=0

А питание всего этого откуда? Кроме силовых цепей.

Вместо реле включите светики и проверьте работу кода. Если будет работать корректно, значит вам реле просаживают питание ардуины.

Cyoko
Offline
Зарегистрирован: 22.08.2014

Питание ардуины с блока питания . Тоже думаю что похоже на просаживание , но на нем написано 12 вольт полтора ампера. Я даже 5 вольт от одного реле в другой пин на ардуине вставил , тоже самое.

Cyoko
Offline
Зарегистрирован: 22.08.2014

И что с это просадкой делать ?

Cyoko
Offline
Зарегистрирован: 22.08.2014

подключил светодиоды , все работает как часы :) швейцарские )))))

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

подключил светодиоды , все работает как часы :) швейцарские )))))

Отдельный стабилизатор на питание реле. БП здесь скорее всего не при чем. Не справляется стабилизатор ардуины.

Его такими опытами и похоронить недолго.

Cyoko
Offline
Зарегистрирован: 22.08.2014

Таааак.... 

Обратил внимание что вкл,выкл реле с таймером. Также на мониторе время принимало какието значения в районе 165.165....

Почему же РТС ведет себя не корректно при включении реле ? Это ему получается не хватет энергии ? Но ведь у него батарейка есть на крайняк :)

И вот еще что РТС использует scl и sda , и монитор использует их же. При отключении этих двух проводов монитора от ардуины(питание монитора оставил) , все работает корректно . Получается дело в том что конфликтуют часы и монитор .  Как это победить ?

вот скетч :

//-------------------------------подключим все внешние либы----------------------------------------------------------
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>//библиотека для LCD по 4 проводам
#include <OneWire.h>
#include <DallasTemperature.h>//для датчика температуры
#include <DS1307new.h>//для часов реального времени
#include <TimeHelpers.h>//для простого задания таймеров
//-------------------------------------------------------------------------------------


//---------------------------------------pins--ноги распределим(что к какамоу пину подключено)--------------------
#define ONE_WIRE_BUS 2// пин подключения датчика температуры
#define Relay1_PIN 4 //пин управления реле света
#define Relay2_PIN 3 //пин управления реле вентилятора
//----------------------------------------------------------------------------------------------------------------



//--------------------------константы------------------------------------------------
#define TEMP_INTERVAL _SEC_(5)// таймер опроса датчика температуры
#define TIME_INTERVAL _SEC_(1)// таймер опроса времени
#define TempFanOff 27//температура выключения вентилятора
#define TempFanOn 29//температура включения вентилятора
#define TimeHHon 9
#define TimeHHoff 2
//#define TimeMMon 0
//#define TimeMMoff 0

//------------------------------------------------------------------------------------



//--------------------------переменные----------------------------------------------
//int yy;
//int mm;
//int dd;
//int hh;
//int mn;
//int ss;
//int VixodIzCicla;// переменная для выхода из цикла
//int TempMillisTime;
//---------------------------------------------------------------------------------

//------------------------значок градусов----------------------------------------
uint8_t temp_cel[8] =
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000
}; //закодировано в двоичной системе значек градуса


//--------------------------------------для часов---------------------------------------------------------------------
uint16_t startAddr = 0x0000;            // Start address to store in the NV-RAM
uint16_t lastAddr;                      // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55;            // Helper that time must not set again
//-------------------------------------------------------------------------------------



//-------------------инициализация устройств-------------------------------------
OneWire oneWire(ONE_WIRE_BUS);//куда подключен датчик
DallasTemperature sensors(&oneWire);// говорим что это датчик температуры
DeviceAddress insideThermometer;//адрес датчика , если их много

LiquidCrystal_I2C lcd(0x27,16,2);  // подключаем монитор
//-------------------------------------------------------------------------------






//--------------------------начальная загрузка---------------------------------
void setup(void)
{
  //запускаем порт(для отладки)
  Serial.begin(115200);
  Serial.println("Hello");
  Serial.print("Running Sensors...");
  //запускаем датчик температуры--------------------------------------------
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" sensors");
  // смотрим как подключены
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); 
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();
  sensors.setResolution(insideThermometer, 9); 
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC); 
  Serial.println();
  //запускаем монитор-----------------------------------------------------------------
  lcd.init();  
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Hello!");
  lcd.createChar(1, temp_cel); // я так понял подгружаем наш значок в экран
  //выключаем наши реле--------------------
  pinMode(Relay1_PIN, OUTPUT);
  pinMode(Relay2_PIN, OUTPUT);
  //------установка времени------------------
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08 

/*
   Uncomment the next 2 lines if you want to SET the clock
   Comment them out if the clock is set.
   DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
   AFTER SETTING THE CLOCK ONCE.
*/
  //TimeIsSet = 0xffff;
  //RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));  

/*
  Control the clock.
  Clock will only be set if NV-RAM Address does not contain 0xaa.
  DS1307 should have a battery backup.
*/
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  if (TimeIsSet != 0xaa55)
  {
    RTC.stopClock();
        
    RTC.fillByYMD(2014,12,25);
    RTC.fillByHMS(9,48,0);
    
    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();
  }
  else
  {
    RTC.getTime();
  }
}


//--------------------------основной цикл программы-----------------------------------------
void loop(void)
{ 
  //----------Опрос времени для вывода на экран----------------------------------------------------------------  

  DO_EVERY( TIME_INTERVAL , takeTime());
  
      
//-------------------------------------------------------------------------------------------



   //-----------------------Опрос Датчика температуры и отслеживание реле----------------------------
  DO_EVERY( TEMP_INTERVAL , {
    Serial.print("Requesting temperatures...");
    sensors.requestTemperatures(); // Send the command to get temperatures
    printTemperature(insideThermometer); // Use a simple function to print out the data
    Serial.println("DONE");
    
});
//-----------------------------------------------------------------------------------------------------

}





//----------------------------------------------------подпрограммы вызываемые многократно ----------------------------------------------
// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
     }
     
}


// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  int tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  lcd.setCursor(10, 0);
  lcd.print("t:");
  lcd.print(tempC);
  char temp2[]={'\1', 67, '\0'}; //Отрисовка градусов Цельсия
    lcd.print(temp2);
    lcd.print("C");
  if ( tempC < TempFanOff ) digitalWrite(Relay1_PIN, LOW); //если температуры меньше заданной выключаем реле вентилятора
  else if ( tempC > TempFanOn ) digitalWrite(Relay1_PIN, HIGH);// если температура поднялась выше заданной включаем реле вентилятора
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}



//----------------------------функция отображения времени------------------------------------
int takeTime(){
  RTC.getTime();
  //lcd.clear();
   lcd.setCursor(0, 0);
  if (RTC.hour < 10)                    // correct hour if necessary
  {
    Serial.print("0");
    Serial.print(RTC.hour, DEC);
    lcd.print("0");
    lcd.print(RTC.hour, DEC);
  } 
  else
  {
    Serial.print(RTC.hour, DEC);
    lcd.print(RTC.hour, DEC);
  }
  Serial.print(":");
  lcd.print(":");
  if (RTC.minute < 10)                  // correct minute if necessary
  {
    Serial.print("0");
    Serial.print(RTC.minute, DEC);
    lcd.print("0");
    lcd.print(RTC.minute, DEC);
  }
  else
  {
    Serial.print(RTC.minute, DEC);
    lcd.print(RTC.minute, DEC);
  }
  Serial.print(":");
  lcd.print(":");
  if (RTC.second < 10)                  // correct second if necessary
  {
    Serial.print("0");
    Serial.print(RTC.second, DEC);
    lcd.print("0");
    lcd.print(RTC.second, DEC);
  }
  else
  {
    Serial.print(RTC.second, DEC);
    lcd.print(RTC.second, DEC);
  }
  Serial.print(" ");
  lcd.print(" ");
  lcd.setCursor(0, 1);
  if (RTC.day < 10)                    // correct date if necessary
  {
    Serial.print("0");
    Serial.print(RTC.day, DEC);
    lcd.print("0");
    lcd.print(RTC.day, DEC);
  }
  else
  {
    Serial.print(RTC.day, DEC);
    lcd.print(RTC.day, DEC);
  }
  Serial.print("-");
  lcd.print("-");
  if (RTC.month < 10)                   // correct month if necessary
  {
    Serial.print("0");
    Serial.print(RTC.month, DEC);
    lcd.print("0");
    lcd.print(RTC.month, DEC);
  }
  else
  {
    Serial.print(RTC.month, DEC);
    lcd.print(RTC.month, DEC);
  }
  Serial.print("-");
  lcd.print("-");
  Serial.print(RTC.year, DEC);          // Year need not to be changed
  lcd.print(RTC.year, DEC);
  Serial.print(" ");
  lcd.print(" ");
  switch (RTC.dow)                      // Friendly printout the weekday
  {
    case 1:
      Serial.print("MON");
      lcd.print("MON");
      break;
    case 2:
      Serial.print("TUE");
      lcd.print("TUE");
      break;
    case 3:
      Serial.print("WED");
      lcd.print("WED");
      break;
    case 4:
      Serial.print("THU");
      lcd.print("THU");
      break;
    case 5:
      Serial.print("FRI");
      lcd.print("FRI");
      break;
    case 6:
      Serial.print("SAT");
      lcd.print("SAT");
      break;
    case 7:
      Serial.print("SUN");
      lcd.print("SUN");
      break;
  }
  Serial.print(" seconds since 1.1.2000:");
  Serial.print(RTC.time2000, DEC);
  uint8_t MESZ = RTC.isMEZSummerTime();
  Serial.print(" MEZ=0, MESZ=1 : ");
  Serial.print(MESZ, DEC);  
  
  Serial.print(" - Address in NV-RAM is: ");
  //RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
  //Serial.print(lastAddr, HEX);
  //lastAddr = lastAddr + 1;              // we want to use it as addresscounter for example
  //RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
  //RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
 // if (TimeIsSet == 0xaa55)              // check if the clock was set or not
  //{
  //  Serial.println(" - Clock was set!");
  //}
  //else
  //{
  //  Serial.println(" - Clock was NOT set!");
  //}    
  if ( RTC.hour >= TimeHHon || RTC.hour <= TimeHHoff ) digitalWrite(Relay2_PIN, HIGH); //если время больше или равно времени включения или меньше или равно времени выключения , то светим
  else if ( RTC.hour < TimeHHon & RTC.hour > TimeHHoff ) digitalWrite(Relay2_PIN, LOW);// если время меньше времени включения и больше времени выключения не светим 
}
//------------------------------------------------------------------------------------------------

 

Cyoko
Offline
Зарегистрирован: 22.08.2014

при отключенных проводах scl sda монитора и выключеном реле вентилятора , на экране видны черные квадраты. При включении реле вентилятора , они пропадают.

bwn
Онлайн
Зарегистрирован: 25.08.2014

Развяжите сперва питание. Что там на ардуине происходит в момент просадки, знает только она. Как включено сейчас, питать все равно нежелательно.

Cyoko
Offline
Зарегистрирован: 22.08.2014

ОК. Значит что мне надо сделать ? Отдельный выход 5вольт с ардуины на отдельный стабизизатор , а снего на 2 реле ?

Cyoko
Offline
Зарегистрирован: 22.08.2014

и что это за ардуина , которая имеет кучу выходов и не может управлять тремя из них ?

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

ОК. Значит что мне надо сделать ? Отдельный выход 5вольт с ардуины на отдельный стабизизатор , а снего на 2 реле ?

Отнюдь, ардуина осталась как сейчас, а с БП на отдельный стабилизатор и на реле.

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

и что это за ардуина , которая имеет кучу выходов и не может управлять тремя из них ?

Она может управлять всеми выходами, но не предназначена для питания нагрузок. А реле для нее уже нагрузка. То же относится к двигателям, сервам и прочим подобным вещам.

Cyoko
Offline
Зарегистрирован: 22.08.2014

Я конечно не электронщик, но считал что реле служит для питание нагрузки :) 

Вообщем 5 вольт на реле подавать с блока питания отдельного ?

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

Я конечно не электронщик, но считал что реле служит для питание нагрузки :) 

Вообщем 5 вольт на реле подавать с блока питания отдельного ?

Реле исполняет роль выключателя, но и само при этом кушает достаточно много. Кстати на SSR у вас этой проблемы не будет. Там вместо катушки вы просто зажигаете светодиод.

Cyoko
Offline
Зарегистрирован: 22.08.2014

И вот еще что странно , сейчас вот отключил scl и sda монитора, и все работает. Но ведь питание осталось как и было. Питание монитора оставил , он светится , реле работают , таймер тоже. Напрягает только то что темные квадраты при включении второго реле исчезают , это говорит в пользу нехватки мощности так сказать.
И ведь для ардуины продают целую батарею из нескольких релюх и что то нигде не видел чтоб писали питать их отдельным БП :(

bwn
Онлайн
Зарегистрирован: 25.08.2014

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

Cyoko
Offline
Зарегистрирован: 22.08.2014

В чипдипе SSR стоят заоблачно чтото . Их буду брать после праздников уже. Сейчас буду думать где взять папу для подключения реле от БП. Спасибо вам за толковые разъяснения ламеру.

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

И вот еще что странно , сейчас вот отключил scl и sda монитора, и все работает. Но ведь питание осталось как и было. Питание монитора оставил , он светится , реле работают , таймер тоже. Напрягает только то что темные квадраты при включении второго реле исчезают , это говорит в пользу нехватки мощности так сказать.
И ведь для ардуины продают целую батарею из нескольких релюх и что то нигде не видел чтоб писали питать их отдельным БП :(

А они про это и не напишут. Это подразумевается в самой концепции ардуины.

Cyoko
Offline
Зарегистрирован: 22.08.2014

я думаю маму купить , ее воткнуть в штекер БП , а с контактов мамы подпоятся двумя + и двумя - к релюхам. Так ? Или землю можно оставить с ардуины ?

bwn
Онлайн
Зарегистрирован: 25.08.2014

Вы паять хоть немного умеете? Берете КРЕН5, по фашистским аналогам надо даташит смотреть, которая на 5В. Там три детали всего. Радиатор скорее всего не понадобится.

bwn
Онлайн
Зарегистрирован: 25.08.2014

Ваши релюшки на фото плохо видно, а я такие шилды не юзал. Там как разъемы обозначены?

Cyoko
Offline
Зарегистрирован: 22.08.2014

Да у меня БП на 5вольт валяется валом от всяких телефонов планшетов , дамаю папу купить и к нему подпоять провода для релюх. Так можно ?

Cyoko
Offline
Зарегистрирован: 22.08.2014

+ - сигнал

Cyoko
Offline
Зарегистрирован: 22.08.2014

получится + и - с БП , а сигнал с ардуины .

Cyoko
Offline
Зарегистрирован: 22.08.2014

В принципе можно штекер откусить , но БП портить неохото 

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

Да у меня БП на 5вольт валяется валом от всяких телефонов планшетов , дамаю папу купить и к нему подпоять провода для релюх. Так можно ?

Можно так, можно просто к проводам подпаятся (если уже не нужен). Только в этом варианте GND соединить.

Cyoko
Offline
Зарегистрирован: 22.08.2014

О , нашел БП от Нокии на 5 вольт с уже отрезаным штекером , но он на 350мА. Пойдет ?

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

получится + и - с БП , а сигнал с ардуины .

"-" соединить с "-" ардуины, остальное правильно.

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

О , нашел БП от Нокии на 5 вольт с уже отрезаным штекером , но он на 350мА. Пойдет ?

Должен подойти, только полярность не попутайте.

Cyoko
Offline
Зарегистрирован: 22.08.2014

а как узнать какой + ? :) тестер есть 

Cyoko
Offline
Зарегистрирован: 22.08.2014

походу черный + , белый минус ?

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

а как узнать какой + ? :) тестер есть 

Померяйте на ардуине +5 и GND, при замере на БП знак должен быть такой же.

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

походу черный + , белый минус ?

А это зависит от настроения китайца, который все это распаивал.

Cyoko
Offline
Зарегистрирован: 22.08.2014

понял спс

Cyoko
Offline
Зарегистрирован: 22.08.2014

а минус с БП просто воткнуть в любой граунд ардуины ?

bwn
Онлайн
Зарегистрирован: 25.08.2014

Cyoko пишет:

а минус с БП просто воткнуть в любой граунд ардуины ?

Да