Умная теплица - почти готовый протатип
- Войдите на сайт для отправки комментариев
Ср, 04/03/2015 - 19:53
Добрый день уважаемые форумчане, сейчас делаю умную теплицу на ардуино
видео и скетч по адресу http://timurkarev.livejournal.com/2784.html
Буду рад вашему участию.
Добрый день. Очень интересная тема, на этом форуме в приниципе тоже из за теплицы, но только струго подхода реализации.
Тимур, скетч наверно есть смысл перенести сюда, если имеете желание, чтобы местное сообщество участвовало. А семисегментники кажется порочный путь для подобного девайса. В планах ведь не только форточку открывать?
Скетч пока очень грязный и без комментариев, поэтому не выложил, но мне не жалко смотрите:
#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); } }Для данной теплицы остается индикатор, из-за дешивизны и малого количества ног.
Извини не понял, что значит "но только струго подхода реализации."?
Для данной теплицы остается индикатор, из-за дешивизны и малого количества ног.
lcd1602 за 150р+ pcf8574 за 50р. Имеем 2 ноги и любое текстовое отображение. Дело ваше конечно.
Вопрос про сервопривод. Это конечно хорошо но этот маленький привод не сможет открыть масивную створку, которой еще предстоит бороться и ветровыми нагрузками. Для мощного сервопривода нужны еще и мощные контролеры причем несколько для каждой теплицы.
Честно говоря даже не рассматривал их из-за внутреннего убеждения в их дороговизне и большом количестве потребляемых ног))))
Спасибо за совет.
Хороший вопрос, мне он тоже пока не до конца ясен.
Этот маленький сервопривод взят просто для экспериментов, пока планирую использовать servo mg-995, надеюсь что он способен открыть дверки из поликарбоната. Питане на него будет приходить напрямую от аккумулятора, управляющий сигнал много не потребляет (я так думаю). Для борьбы с ветром планирую сделать металлический тросик.
Запасные варианты:
Мощьный двигатель выключающийся по таймеру, подлюченный через релюшки.
Отказаться от форточек в пользу вытяжных вентиляторов.
В запасной вариант добавлю движок от старого шуруповерта+шпилька+гайка и два концевика. Вентиляторы, ток если эл-во халявное.
Линейный сервопривод это вообще мечта ))) Где только взять 4 старых шуруповерта? Может у кого есть чертежи, простеньких линейных серв на двигателе постоянного тока?
Или есть идеи как приспособить под открывание форточек привод от центрального замка автомобильных дверей, уж больно ход у них маленький.
А вариант с механизмом стеклоподъемников электрических не рассмтривали?
вот думаю стоит ли покупать тосно тепицу по хорошей цене в этом интернет магазине http://tosno-zavod.ru/teplicy-iz-polikarbonata/ Хочу услышать Вашего совета - какую лучше приобрести себе теплицу???
вот думаю стоит ли покупать тосно тепицу по хорошей цене в этом интернет магазине http://tosno-zavod.ru/teplicy-iz-polikarbonata/ Хочу услышать Вашего совета - какую лучше приобрести себе теплицу???
Купи лучше сварочник, болгарку и профтрубу20х20 .))))
Я сею то же озадачен данной темой, пытаюсь как bwn советует, пока lCD1602 c I2C, ds3231 и DHT11 подружить, читаю и "экскрементиую", ну это дело наживное, надо время и читать, читать и читать. А вот тепличку из поликарбоната как то не планирую делать- здоровье дороже
"экскрементиую"
шта?
А вот тепличку из поликарбоната как то не планирую делать- здоровье дороже
Если надеетесь, что собирая готовую, времени и нервов потратите меньше, я вас разочарую. Сосед у меня первую купил, две следующих делал сам. Я купить не успел, две следующих делал сам. Одна по типу покупных, из пропиленовых труб, делается за день, но для нормальной эксплуатации зимой - труба не менее ф40, а в этом случае цена почти как у покупной (смысл теряется). Вторая, сварная, домиком, профтруба 25х25, эта сто лет простоит, правда три дня потратил.
шта?
Вероятно "экскрементирую". От слова "экскременты".
"Адьютант его превосходительства " вспоминайте- так там махновцы экскремент с офицерами проводили-"эксперемент" конечно и это не ошибка, пока только экскременты поучаются.
bwm только сам буду делать, если здоровья хватит и успею до последнего дембеля