Умная теплица - почти готовый протатип

Timurkarev
Offline
Зарегистрирован: 04.03.2015

Добрый день уважаемые форумчане, сейчас делаю умную теплицу на ардуино

видео и скетч по адресу http://timurkarev.livejournal.com/2784.html

Буду рад вашему участию.

гошик54
Offline
Зарегистрирован: 05.03.2015

Добрый день. Очень интересная тема, на этом форуме в приниципе тоже из за теплицы, но только струго подхода реализации. 

 

bwn
Offline
Зарегистрирован: 25.08.2014

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

Timurkarev
Offline
Зарегистрирован: 04.03.2015

Скетч пока очень грязный и без комментариев, поэтому не выложил, но мне не жалко смотрите:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Servo.h> 

#define ONE_WIRE_BUS 8// Подключение цифрового вывода датчика к 10-му пину Ардуино.
OneWire oneWire(ONE_WIRE_BUS);// Запуск интерфейса OneWire для подключения OneWire устройств.
DallasTemperature sensors(&oneWire);// Указание, что устройством oneWire является термодатчик от  Dallas Temperature.


//const boolean TRUE = 1;
//const boolean FALSE = 0;

//Пин подключен к ST_CP входу 74HC595
int latchPin = 12;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 13;
//Пин подключен к DS входу 74HC595
int dataPin = 11;

Servo myservo;

int valve1 = 4;
int sens1 = 2;

int cifra[10]  = {0b10000001, 0b11110011, 0b01001001,0b01100001,0b00110011,
                  0b00100101, 0b00000101, 0b11110001,0b00000001,0b00100001};

int curCount;
char curSymb[5] = {0b10001101,0b11110011, 0b01001001,0b01100001,0b00110011};
int curVal[5] = {20,0,0,0,0};

int setCount;
char setSymb[6] = {0b00010010,0b10001110,0b11110010, 0b01001000,0b01100000,0b00110010};
int setVal[6] = {25,15,20,17,18,19};

int delta = 2;

const int butUp = 0;
const int butDown = 1;
const int butSet = 2;
const int butManual = 3;
const int butUnknown = 4;

boolean isManual;
//boolean isNeedUpdate;
boolean isSetMode;

int x1 = 14;
int x2 = 2;
int y1 = 15;
int y2 = 3;

void butPress(int butCode);
void showDisp();

boolean getTouch(int *x, int *y){
  pinMode( x1, OUTPUT );    // Аналоговый вывод 0 
  digitalWrite( x1, LOW );  // Используем аналоговый вывод 0 как подключение к GND
  pinMode( x2, OUTPUT );    // Аналоговый вывод 2 
  digitalWrite( x2, HIGH ); // Используем аналоговый вывод 2 как подключение к +5V connection  
  digitalWrite(y1,LOW);
  digitalWrite(y2,LOW); 
  pinMode( y1, INPUT );     // Аналоговый вывод 1 
  pinMode( y2, INPUT );     // Аналоговый вывод 3 
 // delay(5);                 // Ждём стабилизации напряжения
  *x = analogRead( y1-14 );   // Читаем значение X

  pinMode( y1, OUTPUT );    // Аналоговый вывод 1 
  digitalWrite( y1, LOW );  // Используем аналоговый вывод 1 как подключение к GND
  pinMode( y2, OUTPUT );    // Аналоговый вывод 3 
  digitalWrite( y2, HIGH ); // Используем аналоговый вывод 3 как подключение к +5V 
  digitalWrite(x1,LOW);
  digitalWrite(x2,LOW); 
  pinMode( x1, INPUT );     // Аналоговый вывод 0 
  pinMode( x2, INPUT );     // Аналоговый вывод 2 
 // delay(5);                 // Ждём стабилизации напряжения 
  *y = analogRead( x1 - 14 );   // Читаем значение Y

  if (*x > 140 && *y > 80)
   return TRUE; 
  else 
    return FALSE;
}

int getButCode(int x, int y){
   /* Serial.print(" X =  ");
    Serial.print(x);  
    Serial.print(" , ");  
    Serial.print(" Y =  ");
    Serial.println(y);*/  
    
    if (x>530 && x<820 && y>100 && y<290) return butUp;
    if (x>160 && x<410 && y>100 && y<290) return butDown;
    if (x>600 && x<820 && y>640 && y<900) return butManual;
    if (x>160 && x<410 && y>450 && y<900) return butSet;

  return butUnknown;
}

void setup() 
{ 
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(valve1,OUTPUT);
  myservo.attach(9);
  sensors.begin(); // Запуск сенсора.
  compareTemp();
  
  digitalWrite(valve1, HIGH);
  //isNeedUpdate = 1;
  Serial.begin(38400);
} 

//int count;

void loop() {
  int xVal, yVal;

  if (millis() % 250 == 0){
  if (getTouch(&xVal, &yVal))
       butPress(getButCode(xVal,yVal));
   }

  if (!isManual){
    
      if (millis()%5000 == 0)
        compareTemp();
      
      if (millis()%200 == 0){
        curVal[1] = analogRead(sens1);
        //Serial.println(curVal[1]);
        if (curVal[1] > setVal[2]+delta)
            digitalWrite(valve1,HIGH);
        if (curVal[1] < setVal[2]-delta)
            digitalWrite(valve1,LOW);
      }
  }
   showDisp();
}

void compareTemp(){
           showDisp(0);
          getTemperature();
          
          if (curVal[0] > setVal[0])
                 myservo.write(170);
          else
                 myservo.write(10);
}

void getTemperature(){
      sensors.requestTemperatures();
      curVal[0] = sensors.getTempCByIndex(0);
}

  void butPress(int butCode){
    if (!isManual){
      switch (butCode) {
        case butUp:
        if (!isSetMode){
            curCount ++;
            if (curCount > 4)
                curCount = 0;
        } else {
           setVal[setCount] ++;
        }
            break;
        
        case butDown:
          if (!isSetMode){
              curCount --;
              if (curCount < 0)
                  curCount = 4;
          } else {
              setVal[setCount] --;
          }
        break;
        
        case butSet:
        //Serial.println(" but set  ");
            if (!isSetMode){
               isSetMode = TRUE;
              // Serial.print(isSetMode);
            } else {
              setCount ++;
              if (setCount > 5){
                 isSetMode = FALSE;
                 setCount = 0;
              }
            }
        break;
      }
    }
    if (butCode == butManual){
         isManual = !isManual;
         isSetMode = FALSE;
         setCount = 0;
         curCount = 0;
    }

 //   isNeedUpdate = TRUE;
  }
 
 void showDisp(){
   int value[2];
   int symb;
   
   if (!isManual)
       if (!isSetMode){
            /*Serial.print(curSymb[curCount]);
            Serial.print(" ");
            Serial.println(curVal[curCount]);*/
            value[0] = cifra[curVal[curCount]/10];
            value[1] = cifra[curVal[curCount]%10];
            symb = curSymb[curCount];
        } else {
            /*Serial.print(setSymb[setCount]);
            Serial.print(" :-: ");
            Serial.println(setVal[setCount]);*/
            value[0] = cifra[setVal[setCount]/10];
            value[1] = cifra[setVal[setCount]%10];
            symb = setSymb[setCount];
        }
     else { 
        //Serial.println("- - - ");
        symb = 0b01111111;
        value[0] = symb;
        value[1] = symb;
     }
     /*Serial.print(setSymb[setCount]);
     Serial.print(" :-: ");
     Serial.println(setVal[setCount]);*/
     MyPrint(symb, value);

//   isNeedUpdate = 0;
 }
 
  void showDisp(boolean x){
   int value[2] = {0b11111111, 0b11111111};
   int symb = 0b11111111;
   MyPrint(symb, value);
  }
 
 void MyPrint(int simbol, int *number){
    int sector[3] = {0b00000001, 0b00000010, 0b00000100};
    
    digitalWrite(latchPin, LOW);
    // передаем отсчет для вывода на зеленые светодиоды
    shiftOut(dataPin, clockPin, MSBFIRST, sector[0]); 
    // передаем обратный отсчет  для вывода на красные светодиоды
    shiftOut(dataPin, clockPin, MSBFIRST, simbol);
    //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    digitalWrite(latchPin, HIGH);

  for (int i=0; i<2; i++){
      // устанавливаем синхронизацию "защелки" на LOW
    digitalWrite(latchPin, LOW);
    // передаем отсчет для вывода на зеленые светодиоды
    shiftOut(dataPin, clockPin, MSBFIRST, sector[i+1]); 
    // передаем обратный отсчет  для вывода на красные светодиоды
    shiftOut(dataPin, clockPin, MSBFIRST, *(number+i));
   
    //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    digitalWrite(latchPin, HIGH);
    // пауза перед следующей итерацией
   // delay(5);
    } 
}
  

 

Timurkarev
Offline
Зарегистрирован: 04.03.2015

Для данной теплицы остается индикатор, из-за дешивизны и малого количества ног. 

Timurkarev
Offline
Зарегистрирован: 04.03.2015

Извини не понял, что значит "но только струго подхода реализации."?

bwn
Offline
Зарегистрирован: 25.08.2014

Timurkarev пишет:

Для данной теплицы остается индикатор, из-за дешивизны и малого количества ног. 

lcd1602 за 150р+ pcf8574 за 50р. Имеем 2 ноги и любое текстовое отображение. Дело ваше конечно.

гошик54
Offline
Зарегистрирован: 05.03.2015

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

 

Timurkarev
Offline
Зарегистрирован: 04.03.2015

Честно говоря даже не рассматривал их из-за внутреннего убеждения в их дороговизне и большом количестве потребляемых ног))))

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

Timurkarev
Offline
Зарегистрирован: 04.03.2015

Хороший вопрос, мне он тоже пока не до конца ясен.

Этот маленький сервопривод взят просто для экспериментов, пока планирую использовать servo mg-995, надеюсь что он  способен открыть дверки из поликарбоната. Питане на него будет приходить напрямую от аккумулятора, управляющий сигнал много не потребляет (я так думаю). Для борьбы с ветром планирую сделать металлический тросик.

Запасные варианты:

Мощьный двигатель выключающийся по таймеру, подлюченный через релюшки.

Отказаться от форточек в пользу вытяжных вентиляторов.

bwn
Offline
Зарегистрирован: 25.08.2014

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

Timurkarev
Offline
Зарегистрирован: 04.03.2015

Линейный сервопривод это вообще мечта  )))   Где только взять 4 старых шуруповерта? Может у кого есть чертежи, простеньких линейных серв на двигателе постоянного тока?

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

zolotov
Offline
Зарегистрирован: 22.02.2015

А вариант с механизмом стеклоподъемников электрических не рассмтривали?

nikitatl6
Offline
Зарегистрирован: 13.09.2015

вот думаю стоит ли покупать тосно тепицу по хорошей цене в этом интернет магазине http://tosno-zavod.ru/teplicy-iz-polikarbonata/ Хочу услышать Вашего совета - какую лучше приобрести себе теплицу???

bwn
Offline
Зарегистрирован: 25.08.2014

nikitatl6 пишет:

вот думаю стоит ли покупать тосно тепицу по хорошей цене в этом интернет магазине http://tosno-zavod.ru/teplicy-iz-polikarbonata/ Хочу услышать Вашего совета - какую лучше приобрести себе теплицу???

Купи лучше сварочник, болгарку и профтрубу20х20 .))))

YRA
Offline
Зарегистрирован: 10.01.2015

Я сею то же озадачен данной темой, пытаюсь как bwn советует, пока  lCD1602 c I2C, ds3231 и DHT11 подружить, читаю и "экскрементиую", ну это дело наживное, надо  время и читать, читать и читать. А вот тепличку из поликарбоната как то не планирую делать- здоровье дороже

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

YRA пишет:

"экскрементиую"

шта?

bwn
Offline
Зарегистрирован: 25.08.2014

YRA пишет:

А вот тепличку из поликарбоната как то не планирую делать- здоровье дороже

Если надеетесь, что собирая готовую, времени и нервов потратите меньше, я вас разочарую. Сосед у меня первую купил, две следующих делал сам. Я купить не успел, две следующих делал сам. Одна по типу покупных, из пропиленовых труб, делается за день, но для нормальной эксплуатации зимой - труба не менее ф40, а в этом случае цена почти как у покупной (смысл теряется). Вторая,  сварная, домиком, профтруба 25х25, эта сто лет простоит, правда три дня потратил.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Клапауций 001 пишет:

шта?

Вероятно "экскрементирую". От слова "экскременты".

YRA
Offline
Зарегистрирован: 10.01.2015

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

bwm только сам буду делать, если здоровья хватит и успею до последнего дембеля