31 декабря 2016 в 16:14

Умная теплица в Telegram из песочницы

Добрый день. На нашем участке имеется теплица. Её главная проблема — перегрев в жаркое время, т.к. рассчитана в первую очередь на сибирскую весну. Единственный выход — постоянно открывать/закрывать двери и окна, чтобы поддерживать температуру. Но это не всегда возможно. А если это не сделать, то температура поднимается до +50 градусов, что явно не хорошо. А вечером всё можно заморозить. Так и началась её автоматизация.

image

В первую очередь мы купили Raspberry Pi 2. Разобравшись с ним, подключили датчик DS18B20 по этой статье. Затем были куплены два б/у автомобильных стеклоподъёмника. Как и все DC двигатели, они движутся в зависимости от полярности. Поэтому к каждому двигателю подключаем два реле: одно для открытия, другое для закрытия. Эти реле уже через транзисторы подключаем к самим портам GPIO. И питаем это всё дело аккумулятором 12V. Так же, чтобы не сжечь двигатели, в крайних положениях окна были установлены концевые выключатели, и в случае, если окно открылось/закрылось полностью рвут сеть.

image

image

А для связи мы используем WiFi адаптер TP-LINK с усовершенствованной антенной «Двойной квадрат» для уверенного приёма соседского WIFI домашнего WIFI роутера, который находится на расстояние 40 метров.

image

Теперь пишем программу для управления этими приводами. Был выбран язык Python, т. к. у него нормальная поддержка Raspberry Pi и конкретно GPIO портов. Для того, чтобы открыть окно, нам нужно подать +3.3V на транзистор, который активирует реле, и то начнёт открывать окно. Чтобы его закрыть, делаем то же самое, только в это случаем наше реле подключено наоборот к приводу. Но на Raspberry мы просто подаём ток то на один порт, то на другой. Мы решили, что если температура больше 26 открываем окно в течение 1 секунды. Затем ждём 3 минуты. Если опять жарко, то открываем второе окно в течение секунды. Ждём опять 3 минуты, и делаем заново. То же самое с закрытием, только тут температура должна быть ниже 24 градусов. А вот и код:

temp.py
import RPi.GPIO as GPIO
import time
import os
import datetime

GPIO.setmode(GPIO.BOARD)
GPIO.cleanup()
GPIO.setup(31, GPIO.OUT)
GPIO.setup(33, GPIO.OUT)
GPIO.setup(35, GPIO.OUT)
GPIO.setup(37, GPIO.OUT)

#Получаем температуру
def gettemp():
  if os.path.isdir("id датчика"): #Если датчик подключён, то считываем значение
    tfile2=open("/sys/bus/w1/devices/id датчика")
    ttext2=tfile2.read()
    tfile2.close()
    temp2=ttext2.split("\n")[1].split(" ")[9]
    t2=float(temp2[2:])/1000
    print t2
  else: #если нет, то задаём дефолтное
    print ('File not found')
    t2==24
  return t2

t2=24 #Задаём дефолтное значение для датчика
while True: вечный цикл
t2=gettemp()
  if    t2<24: #Если температура меньше 24, то закрываем окно в течение секунды
 
        GPIO.output(37, 1)
        print ("close1")
        time.sleep(1)
        GPIO.output(37, 0)

  elif  t2>26: #Если больше 26, то открываем окно в течение секунды
        GPIO.output(35, 1)
        print ("open1")
        time.sleep(2)
        GPIO.output(35, 0)
        
  else: #Иначе ничего не делаем
        print ("none1")
  time.sleep(180)#Ждём 3 минуты

#Опять читаем температуру
t2=gettemp()

#Всё то же самое, только со вторым окном.
  if    t2<24:
        GPIO.output(33, 1)
        print ("close2")
        time.sleep(1)
        GPIO.output(33, 0)

  elif  t2>26:
  
        GPIO.output(31, 1)
        print ("open2")
        time.sleep(1)
        GPIO.output(31, 0)
     

  else:
        print ("none2")


#Опять ждём 3 минуты
  time.sleep(180)



А теперь начинается шоу для тех, кому физика не интересна.

Установив Apache на дистрибутив Raspbian, мы в течение месяца не могли достучаться до странички из интернета. Что только не делали. Настраивали порты, открывали их, ничего не помогала. Причём в локальной сети всё работали. Потом мы узнали печальную правду: мы находимся за NAT. И услуг по выделенному IP наш оператор не предоставляет (Привет сотрудникам Регион Телекома). Перебирали много обходных методов, но ничего не выходило. Пытался сделать веб интерфейс на хостинге, но для синхронизации базы данных тоже нужен IP. Брокер IPv6 к тому времени уже закрылся. А делать VPN дорого, ведь хочется всё бесплатно. И тут решили использовать Telegram бота. Как оказалось он имеет два режима: постоянный опрос сервера и отправка сообщений прямо к нам. Первый вариант подходил, т.к. не требует от нам IP адреса. Покопавшись в интернете нашёл библиотеку: pytelegrambotapi. И принялся за написание кода. Правда выходили и проблемы. Еле найденная MySQL библиотека отказывалась писать в базу данных, но при это читала из неё всё нормально. Пришлось делать костыль: передавать данные в файл, хранящийся в ОЗУ, затем запускать bash скрипт, который считает данные и занесёт в БД.

Делаем файл config.ini, туда кидаем:

[mysql]
host = localhost
database = telegram
user = root
password = secret

Не забываем данные заменить на свои.

Создаём файл python_mysql_dbconfig.py, со следующим содержимым:

from configparser import ConfigParser
 
def read_db_config(filename='config.ini', section='mysql'):
    """ Read database configuration file and return a dictionary object
    :param filename: name of the configuration file
    :param section: section of database configuration
    :return: a dictionary of database parameters
    """
    # create parser and read ini configuration file
    parser = ConfigParser()
    parser.read(filename)
 
    # get section, default to mysql
    db = {}
    if parser.has_section(section):
        items = parser.items(section)
        for item in items:
            db[item[0]] = item[1]
    else:
        raise Exception('{0} not found in the {1} file'.format(section, filename))
 
    return db

Так же нам нужно создать файл python_mysql_connect2.py, с вот таким содержимым:

from mysql.connector import MySQLConnection, Error
from python_mysql_dbconfig import read_db_config

def connect():
    """ Connect to MySQL database """

    db_config = read_db_config()

    try:
        print('Connecting to MySQL database...')
        conn = MySQLConnection(**db_config)

        if conn.is_connected():
            print('connection established.')
        else:
            print('connection failed.')

    except Error as error:
        print(error)

    finally:
        conn.close()
        print('Connection closed.')

if __name__ == '__main__':
    connect()

Теперь мы всё подготовили для работы с БД.

Отвлечёмся немного от базы данных и перейдём непосредственно к общению с ботом. Ну как обычно, пишем @BotFather, и берём у него токен. Создаём файл config.py, и пишем в него две строчки:

# -*- coding: utf-8 -*-
token = 'Ваш токен'

Я решил реализовать в боте три функции:

  • Получение температуры
  • Получение снимков
  • Управление окнами

С первым всё просто, по запросу читаем файл с температурой, и отправляем это пользователю.

Со снимками посложнее. Я использую утилиту Motion. В её параметрах проси класть в папку в оперативной памяти снимки, ну допустим каждые 30 секунд. И делаем файлы с одинаковыми имена, и они просто заменяют друг друга. А потом по запросу отправляем файл пользователю.

Ну и третий, самый сложный модуль: управление окнами. У меня главная задача: чтобы работала автоматика, но если нужно, то мы её можем отключить. Делал я это так. Создал в оперативной памяти очередной файл. Когда мы отправляем запрос на открытие/закрытие, приоткрытие, призакрытие окна или на включение/выключение автоматики бот пишет в этот файл номер команды. Каждые пять секунд программа управления окнами считывает этот файл, и если распознаёт команду, выполняет её. После выполнение в этот же файл пишет, что всё прошло успешно. Бот опять читает файл, и уведомляет нас, что команда выполнена.

Ну а теперь исходный код. Сначала та же самая программа для открывания окон, только уже переделанная под бота(temp.py):

temp.py
import RPi.GPIO as GPIO
import time
import os
import datetime

GPIO.setmode(GPIO.BOARD)
GPIO.cleanup()
GPIO.setup(31, GPIO.OUT)
GPIO.setup(33, GPIO.OUT)
GPIO.setup(35, GPIO.OUT)
GPIO.setup(37, GPIO.OUT)

#Пишем в файл, что готовы к работе
f = open('/mnt/raw/wind', 'w')
f.write('OK')
f.close()

#Пишем, что автоматика включена
f = open('/mnt/raw/pos', 'w')
f.write('1')
f.close()

#получаем температуру
def gettemp():
  if os.path.isdir("/sys/bus/w1/devices/id датчика"): #Если датчик подключён, то считываем значение
    tfile2=open("/sys/bus/w1/devices/id датчика/w1_slave")
    ttext2=tfile2.read()
    tfile2.close()
    temp2=ttext2.split("\n")[1].split(" ")[9]
    t2=float(temp2[2:])/1000
    print t2
  else: #если нет, то задаём дефолтное
    print ('File not found')
    t2==24
  return t2

#Включаем автоматику по дефолту
i=1
#Дефолтная температура
t2=24

#Читаем команды от бота
def info():
    f = open('/mnt/raw/wind')
    com = f.read()
    f.close()
    return com

#Отвечаем боту, что всё успешно
def ans():
    f = open('/mnt/raw/wind', 'w')
    f.write('OK')
    f.close()
    print ("OK")

#Анализируем команды
def rob():
    c = info()
    if c=="10":
        GPIO.output(37, 1)
        print ("close1")
        time.sleep(3)
        GPIO.output(37, 0)
        ans()
    elif c=="11":
        GPIO.output(35, 1)
        print ("open1")
        time.sleep(2)
        GPIO.output(35, 0)
        ans()
    elif c=="12":
        GPIO.output(37, 1)
        print ("close1")
        time.sleep(3)
        GPIO.output(37, 0)
        ans()
    elif c=="13":
        GPIO.output(35, 1)
        print ("open1")
        time.sleep(1)
        GPIO.output(35, 0)
        ans()
    elif c=="20":
        GPIO.output(33, 1)
        print ("close2")
        time.sleep(3)
        GPIO.output(33, 0)
        ans()
    elif c=="21":
        GPIO.output(31, 1)
        print ("open2")
        time.sleep(3)
        GPIO.output(31, 0)
        ans()
    elif c=="22":
        GPIO.output(33, 1)
        print ("close2")
        time.sleep(1)
        GPIO.output(33, 0)
        ans()
    elif c=="23":
        GPIO.output(31, 1)
        print ("open2")
        time.sleep(1)
        GPIO.output(31, 0)
        ans()
    elif c=="30":
        global i
        i=0
        ans()
        f = open('/mnt/raw/pos', 'w')
        f.write('0')
        f.close()
        print('30')
        global i
        i=0
        ans()
    elif c=="31":
        f = open('/mnt/raw/pos', 'w')
        f.write('1')
        f.close()
        print('31')
        global i
        i=1
        ans()
        
while True:

#Читаем и выполняем команды
 rob()

#Проверяем, включена ли автоматика
 if i==1:

  gettemp()

  if    t2<24:
 
        GPIO.output(37, 1)
        print ("close1")
        time.sleep(1)
        GPIO.output(37, 0)

  elif  t2>26:

        GPIO.output(35, 1)
        print ("open1")
        time.sleep(2)
        GPIO.output(35, 0)

  else:
        print ("none1")
       
  #Ожидаем 3 минуты, и в течение этого времени читаем команды
  j=0
  while(j<36):
      rob()
      time.sleep(5)
      j=j+1
      if i==0:
          break
  gettemp()

  if    t2<24:
        GPIO.output(33, 1)
        print ("close2")
        time.sleep(1)
        GPIO.output(33, 0)
       
  elif  t2>26:
  
        GPIO.output(31, 1)
        print ("open2")
        time.sleep(1)
        GPIO.output(31, 0)

  else:

        print ("none2")

  j=0
  while(j<36):
      rob()
      time.sleep(5)
      j=j+1
      if i==0:
          break



Но а теперь поговорим про самого бота. Как я уже говорил, я использую библиотеку PyTelegramBotApi. Если обратиться к документации на GitHub, то можно понять что для обработки команд бот использует хендлеры. Хендлер — это событие в нашей программе, определяющие действие. В нашей случае это определенная фраза в сообщение. А действие это всё что мы можем сделать в языке python. В данном случае мы будет присылать пользователю какую-нибудь информацию пользователю или записывать команды для окон в файл. В основном наша программа состоит из этих самых хендлров и команды опроса сервера.

Но так же я сам написал и добавил ещё одно интересную вещь: блок авторизации. Ну как понятно из названия, он сделан для защиты нашей теплицы от несанкционированного доступа. Он работает просто. При первом подключение к боту он запрашивает у нас пароль. Если мы его вводим правильно, бот добавляет нас в базу данных, и при следующих подключениях нам уже авторизироваться не нужно. Бот узнаёт нас при помощи chat-id. Chat-id последнего пользователя храним в переменно, чтобы всё время не дёргать базу.

Теперь создаём файл daba.py и пишем туда вот это:

daba.py
from mysql.connector import MySQLConnection, Error
from python_mysql_dbconfig import read_db_config
import time

def getkey(): #Читаем пароль для бота
    try:
        dbconfig = read_db_config()
        conn = MySQLConnection(**dbconfig)
        cursor = conn.cursor()
        cursor.execute("SELECT key2 FROM tkey where id=0")

        row = cursor.fetchone()

        return row
        print(row)
  

    except Error as e:
        print(e)

    finally:
        cursor.close()
        conn.close()
def sendup(): #Отправляем время запуска бота (не работает)
    stime=time.time()
    query = "INSERT INTO uptime(datetime, also) " \
    "VALUES(now(), 20)"
    args=(stime)
    try:
        dbconfig = read_db_config()
        conn = MySQLConnection(**dbconfig)
        cursor = conn.cursor()
        cursor.execute(query)

        row = cursor.fetchone()

        return(row)
        print(row)
  

    except Error as e:
        print(e)

    finally:
        cursor.close()
        conn.close()
def getid(idi): #проверяем есть ли id пользователя в базе
    query="SELECT accecpt FROM users WHERE chatid ='"+str(idi)+"'"
    try:
        dbconfig = read_db_config()
        conn = MySQLConnection(**dbconfig)
        cursor = conn.cursor()
        cursor.execute(query)

        row = cursor.fetchone()
        #print (str(row))
        if str(row)=="None":
            return 0;
            print (0)
        else:
            return 20;

  

    except Error as e:
        print(e)

    #finally:
        #cursor.close()
        #conn.close()
def newuser(idi): #Добавляем пользователя в базу данных
    query = ("INSERT INTO users SET `chatid`='12345'")
    try:
        dbconfig = read_db_config()
        conn = MySQLConnection(**dbconfig)
        cursor = conn.cursor()
        cursor.execute(query)

        row = cursor.fetchone()

        print(row)
  

    except Error as e:
        print(e)
        return(e)

    finally:
        cursor.close()
        conn.close()

if __name__ == '__main__':
    query_with_fetchone()



Так же давайте сразу сделаем ещё несколько вспомогательных скриптов. Создаём файл newuser.sh и пишем в него:

#!/bin/bash
a=`cat /mnt/raw/user`
cat /dev/null > /mnt/raw/user

mysql -u root -pkoshak << EOF
use telegram;
INSERT INTO users(chatid) VALUES('$a');
EOF

И создадим два скрипта для запуска бота и программы окон:

#!/bin/bash
i=0
while [ $i = 0 ]
do
echo New python
sleep 5
python3 bot.py
done

И ещё один:

#!/bin/bash
i=0
while [ $i = 0 ]
do
echo New python
sleep 5
python3 temp.py
done

«Зачем мы это делаем?» спросите вы. А тут дело в том, что иногда из-за нестабильного интернет соединения, или ошибки на сервера Telegram программа может вылететь. А скрипт её гоняет в вечном цикле: вылетела — запустил через 5 секунд снова. А для окон я сделал это на всякий пожарный: вдруг тоже из-за сбоя программа вылетит, а нас в теплице нет, вернёмся и будет у нас томатный суп или помидорное мороженное.

Ну и теперь самое главное, скрипт самого бота:

bot.py
# -*- coding: utf-8 -*-
import config
import telebot
import subprocess
import time
from telebot import types
import datetime
import os
from daba import getkey
from daba import sendup
from daba import getid
#from daba import newuser
#from temp import tep
import os

#Создаём файл
f = open('/mnt/raw/user', 'tw', encoding='utf-8')
f.close()

global par
par=0

#Текст для неавторизированного пользователя
global a
a="Вы не авторизированны. Пройдите авторизацию командой /auth [пароль]"

#Функция получение температуры
def get_temp():
  if os.path.isdir("/sys/bus/w1/devices/id датчика"):

    tfile2=open("/sys/bus/w1/devices/id датчика/w1_slave")
    ttext2=tfile2.read()
    tfile2.close()
    temp2=ttext2.split("\n")[1].split(" ")[9]
    t2=float(temp2[2:])/1000
    return t2

  else:
    print ('File not found')
  
#Пароль
keyword=str(getkey())[2:-3]

#Конфигурация токена
bot = telebot.TeleBot(config.token)
print (sendup())
#Создание кастомной клавиатуры

#########################Клавиатура авторизации##########################################
markup2 = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True) #Активация, название, колва кнопок в одной ряду
markdown = types.ReplyKeyboardHide() #Деактивация
itembtn5 = types.KeyboardButton(' Авторизация') #Название кнопки 5
markup2.add(itembtn5) #Занесение кнопок в матрицу
#########################Клавиатура авторизации##########################################


#########################Клавиатура главного меню##########################################
markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True) #Активация, название, колва кнопок в одной ряду
itembtn1 = types.KeyboardButton(' Прислать снимок') #Название кнопки 1
itembtn4 = types.KeyboardButton(' Управление окнами')
itembtn2 = types.KeyboardButton(' Прислать температуру') #Название кнопки 2
markup.add(itembtn1, itembtn4, itembtn2) #Занесение кнопок в матрицу
#########################Клавиатура главного меню##########################################


#########################Ещё кнопки##########################################

markup3 = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True) #Активация, название, колва кнопок в одной ряду
itembtn10 = types.KeyboardButton(' Выключить автоматику ') #Название кнопки 10
itembtn11 = types.KeyboardButton('️ Ручное управление')
itembtn12 = types.KeyboardButton(' Назад')
markup3.add(itembtn10, itembtn11, itembtn12) #Занесение кнопок в матрицу

markup4 = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True) #Активация, название, колва кнопок в одной ряду
itembtn13 = types.KeyboardButton(' Включить автоматику ') #Название кнопки 13
markup4.add(itembtn13, itembtn11, itembtn12) #Занесение кнопок в матрицу

markup5 = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True) #Активация, название, колва кнопок в одной ряду
itembtn14 = types.KeyboardButton(' Первое окно') #Название кнопки 14
itembtn15 = types.KeyboardButton(' Второе окно') #Название кнопки 15
itembtn16 = types.KeyboardButton('️ Назад') #Название кнопки 16
markup5.add(itembtn14, itembtn15, itembtn16) #Занесение кнопок в матрицу

markup6 = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True) #Активация, название, колва кнопок в одной ряду
itembtn17 = types.KeyboardButton('️ Открыть окно ') #Название кнопки 17
itembtn18 = types.KeyboardButton('️ Закрыть окно ') #Название кнопки 18
itembtn19 = types.KeyboardButton(' Приоткрыть окно ') #Название кнопки 19
itembtn20 = types.KeyboardButton(' Призакрыть окно ') #Название кнопки20
itembtn21 = types.KeyboardButton('️ Назад') #Название кнопки 21
markup6.add(itembtn17, itembtn18, itembtn19, itembtn20, itembtn21) #Занесение кнопок в матрицу

markup7 = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True) #Активация, название, колва кнопок в одной ряду
itembtn22 = types.KeyboardButton('️ Открыть окно ') #Название кнопки 22
itembtn23 = types.KeyboardButton('️ Закрыть окно ') #Название кнопки 23
itembtn24 = types.KeyboardButton(' Приоткрыть окно ') #Название кнопки24
itembtn25 = types.KeyboardButton(' Призакрыть окно ') #Название кнопки25
markup7.add(itembtn22, itembtn23, itembtn24, itembtn25, itembtn21) #Занесение кнопок в матрицу
#########################Ещё кнопки##########################################
bot.send_message(45215125, "Перезагрузка")#Вставьте сюда ваш chat-id


    
#Узнаем состояние автоматики окон
def pos():
    f = open('/mnt/raw/pos')
    com = f.read()
    f.close()
    return com

#Авторизация
def avtor(idi):
    global par#Если пользователь храниться в переменной возвращаем ноль
    if par==idi:
            return 0
    else:#Запрашиваем наличие пользователя в БД, если он там есть, возвращаем 0
            if getid(str(idi))==20:
                par=idi#Заносим пользователя в переменную
                return 0
            else:#Пишем что мы не знаем пользователя
                bot.send_message(idi, "Вы не авторизированны. Пройдите авторизацию командой /auth [пароль]", reply_markup=markup2)
                return 1    
        


@bot.message_handler(regexp=" Авторизация")
def auth(message):
    bot.send_message(message.chat.id, "Введите /auth [пароль]")

#Тоже аворизация
@bot.message_handler(commands=['auth'])
def start2(message):
    if message.text[6:]==keyword:#Вырезаем пароль из сообщения
      if getid(str(message.chat.id))==20:#Проверяем пароль в базе данных, если пользователь там уже есть нам вернётся код 20
        bot.send_message(message.chat.id, "Вы уже авторизированы")
      else:
        global par
        bot.send_message(message.chat.id, "Успешно", reply_markup=markup)
        par=message.chat.id
        #Отправляем chat-id в базу данных
        f = open('/mnt/raw/user', 'w')
        f.write(str(message.chat.id))
        f.close()
        os.system('newuser.sh')
        print (message.chat.id)
        print (par)
    else:
        bot.send_message(message.chat.id, "Неверно")
        print (keyword)
        print (message.text[6:])
        print (message.chat.id)


# Команда /start
@bot.message_handler(commands=['start'])
def start(message):
     global par
     if avtor(message.chat.id)!=0:
         print (par)
         bot.send_message(message.chat.id, " Вы не авторизированны. Пройдите авторизацию командой /auth [пароль]", reply_markup=markup2)
     else:
	     bot.send_message(message.chat.id, " Вы авторизированный пользователь. Наберите /help, для того, чтобы узнать список команд.")



#Команда запроса помощи - /help
@bot.message_handler(commands=['help'])
def help(message):
  if avtor(message.chat.id)==0:
     mas=' Данный бот управляет теплицей на моём участке. \n Список команд для помощи, в управление этим ботом:  \n Получить справку - /help \n Остальное всё управляется при помощи клавиатуры :)'
     bot.send_message(message.chat.id, mas, reply_markup=markup)
     print (message.chat.id, message.text)

	
 
#Заменить интерфейс командной строки на клавиатуру
@bot.message_handler(commands=['show'])
def show(message):
  if avtor(message.chat.id)==0:
     mas='Клавиатура включена'
     bot.send_message(message.chat.id, mas, reply_markup=markup)
     print (message.chat.id, message.text)



#получить температуру
@bot.message_handler(regexp=" Прислать температуру")
def temp(message):
  if avtor(message.chat.id)==0:
     tp=get_temp()
     mas='  Температура в теплице: '+str(tp)+'°C'
     bot.send_message(message.chat.id, mas)
     print (message.chat.id, message.text)
    

#прислать снимок
@bot.message_handler(regexp=" Прислать снимок")
def photo(message): 
     if avtor(message.chat.id)==0: 
         path='/mnt/raw/photo/foto.jpg' #Путь к папку со снимком
         try:
             f = open(path, 'rb') #Открытия файла - снимка
             bot.send_photo(message.chat.id, f) #Отправка снимка
             print (message.chat.id, message.text)
         except:
             bot.send_message(message.chat.id, "Фоток нет :(")


#Переход в меню окон
@bot.message_handler(regexp=" Управление окнами")
def windows(message):
   if avtor(message.chat.id)==0:
       print ("window")
       print (pos())
       if str(pos())[0]=='1':
           bot.send_message(message.chat.id, "Ок", reply_markup=markup3)#Если автоматика включена, то выводим клавиатуру с надписью «Выключить автоматику»
       else: 
           bot.send_message(message.chat.id, "Ок", reply_markup=markup4)#А здесь всё с точность наоборот

#Кнопка назад
@bot.message_handler(regexp=" Назад")
def windows(message):
   if avtor(message.chat.id)==0:
       bot.send_message(message.chat.id, "Ок",  reply_markup=markup)

#Выключение автоматики
@bot.message_handler(regexp=" Выключить автоматику ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')#Открываем файл
       f.write('30')#Пишем туда код команды, в данный момент это 30
       f.close()#Закрываем файл
       k="No"#Дефолтное значение переменной
       while k[0:2]!="OK":#Проверяем ответ 
           time.sleep(5)#Ждём 5 секунд
           f = open('/mnt/raw/wind')#Открываем файл
           k = f.read()#Читаем ответ
           f.close()#Закрывает
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup4)

@bot.message_handler(regexp=" Включить автоматику ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')
       f.write('31')
       f.close()
       k="No"
       while k[0:2]!="OK":
           time.sleep(5)           
           f = open('/mnt/raw/wind')
           k = f.read()
           f.close()
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup3)

@bot.message_handler(regexp="️ Ручное управление")
def windows(message):
   if avtor(message.chat.id)==0:
       bot.send_message(message.chat.id, "Ок",  reply_markup=markup5)

@bot.message_handler(regexp="️ Назад")
def windows(message):
   if avtor(message.chat.id)==0:
       if str(pos())[0]=='1':
           bot.send_message(message.chat.id, "Ок", reply_markup=markup3)
       else: 
           bot.send_message(message.chat.id, "Ок", reply_markup=markup4)

@bot.message_handler(regexp="️ Назад")
def windows(message):
   if avtor(message.chat.id)==0:
       bot.send_message(message.chat.id, "Ок",  reply_markup=markup5)

#Бегаем по меню
@bot.message_handler(regexp=" Первое окно")
def windows(message):
   if avtor(message.chat.id)==0:
       bot.send_message(message.chat.id, "Ок",  reply_markup=markup6)
@bot.message_handler(regexp=" Второе окно")
def windows(message):
   if avtor(message.chat.id)==0:
       bot.send_message(message.chat.id, "Ок",  reply_markup=markup7)

@bot.message_handler(regexp="️ Открыть окно ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')
       f.write('11')
       f.close()
       k="No"
       while k[0:2]!="OK":
           time.sleep(5)           
           f = open('/mnt/raw/wind')
           k = f.read()
           f.close()
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup6)

@bot.message_handler(regexp="️ Закрыть окно ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')
       f.write('10')
       f.close()
       k="No"
       while k[0:2]!="OK":
           time.sleep(5)           
           f = open('/mnt/raw/wind')
           k = f.read()
           f.close()
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup6)

@bot.message_handler(regexp=" Приоткрыть окно ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')
       f.write('13')
       f.close()
       k="No"
       while k[0:2]!="OK":
           time.sleep(5)           
           f = open('/mnt/raw/wind')
           k = f.read()
           f.close()
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup6)

@bot.message_handler(regexp=" Призакрыть окно ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')
       f.write('12')
       f.close()
       k="No"
       while k[0:2]!="OK":
           time.sleep(5)           
           f = open('/mnt/raw/wind')
           k = f.read()
           f.close()
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup6)

@bot.message_handler(regexp="️ Открыть окно ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')
       f.write('21')
       f.close()
       k="No"
       while k[0:2]!="OK":
           time.sleep(5)           
           f = open('/mnt/raw/wind')
           k = f.read()
           f.close()
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup7)

@bot.message_handler(regexp="️ Закрыть окно ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')
       f.write('20')
       f.close()
       k="No"
       while k[0:2]!="OK":
           time.sleep(5)           
           f = open('/mnt/raw/wind')
           k = f.read()
           f.close()
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup7)

@bot.message_handler(regexp=" Приоткрыть окно ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')
       f.write('23')
       f.close()
       k="No"
       while k[0:2]!="OK":
           time.sleep(5)           
           f = open('/mnt/raw/wind')
           k = f.read()
           f.close()
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup7)

@bot.message_handler(regexp=" Призакрыть окно ")
def windows(message):
   if avtor(message.chat.id)==0:
       f = open('/mnt/raw/wind', 'w')
       f.write('22')
       f.close()
       k="No"
       while k[0:2]!="OK":
           time.sleep(5)           
           f = open('/mnt/raw/wind')
           k = f.read()
           f.close()
           print(k[0:2])
       bot.send_message(message.chat.id, "Успешно",  reply_markup=markup7)

#Реакция на команды, не приведённые выше
@bot.message_handler(content_types=["text"])
def repeat_all_messages(message):
   if avtor(message.chat.id)==0:
         bot.send_message(message.chat.id, "Я не знаю такой команды. Набери /help, чтобы получить список команд")
         print (message.chat.id, message.text)

#Отпрашиваем сервер на наличие новых сообщений
if __name__ == '__main__':
        bot.polling()




Не забываем указать здесь id датчика, chat-id и путь к разделу в оперативной памяти. Теперь у нас почти всё готово. Качаем этот дамп, и заливаем базу данных на свой сервер, и не забываем смонтировать раздел в оперативной памяти, думаю 10 МБ хватит по горло. Запускаем два наших скрипта-стартера и радуемся. Пароль по умолчанию: telbot. Меняем его в таблице tkey базы данных.

СМС информирование


Так же сделал СМС информирование на случай перегрева. Создаём файл sms.py:

sms.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
 
""" Автор Титов А.В. t_aleksandr_v@inbox.ru 17.02.2015 """
 
""" Скрипт предназначен для отправки СМС через сайт sms.ru """
""" Принимает следующие аргументы:"""
 
""" -i или --idsender - id пользователя на sms.ru"""
""" -t или --to - номер телефона получателя в формате 79219996660"""
""" -s или --subject - текст сообщения на латинице"""
 
 
from urllib2 import urlopen
from optparse import OptionParser
 
 
def sendsms(idsender,subject,to):
 
    subject = subject.replace(" ","+")
    url="http://sms.ru/sms/send?api_id=%s&text=%s&to=%s" %(idsender,subject,to)
    res=urlopen(url)
 
if __name__ == '__main__':
 
    parser = OptionParser()
 
    parser.add_option("-i", "--ваш ключ", dest="idsender", default="ваш ключ", help="ID user on sms.ru", metavar="IDSENDER")
    parser.add_option("-t", "--ваш телефон", dest="to", default="ваш телефон", help="to telephone number", metavar="TO")
    parser.add_option("-s", "--temperatyra 32", dest="subject", default="Jara tut, otkroy okno", help="Name of subject", metavar="SUBJECT")
 
    (options, args) = parser.parse_args()
 
    sendsms(options.idsender,options.subject,options.to)




Регистрируемся на sms.ru и берём там API-key в разделе для программистов. Так же не забываем указать в скрипте ваш номер телефона.

В программе для управления окон объявляем переменную:

Vr=0

Затем вставляем в вечный цикл этот код:

d = datetime.today()
V = d.strftime('%H')
V = int(V)
 if    (t2>32 and Vr!=V): 
        print (V)
        Vr=V
        os.system('/home/samba/sms.py')

В данный момент температура порога 32, смс будут отправляться в случае высокой температуры раз в час, пока она не спадёт.

P.S. В планах на будущее установить управляемый обогреватель и сделать автоматический полив.

Спасибо всем тем, кто дочитал до конца.
Никита @nikitos_2002
карма
15,5
рейтинг 0,0
Студент — увлекаюсь программированием
Похожие публикации
Самое читаемое

Комментарии (125)

  • +3
    Вместо релюшек проще было использовать драйвер двигателей — он умеет в обе стороны крутить (он же специально для этого и сделан).
    L293, например: http://robocraft.ru/blog/electronics/563.html
    • +1
      Я думаю Вы правы, но выдержит ли микросхема такой высокий ток, который нужен стеклоподъёмникам? Питаю от автомобильного аккумулятора.
      • –1
        Выдержит. Там ток менее 0.5А (сам измерял). Микросхема до ампера.
        • +2
          вообще то двигатели от стеклоподъемника в момент включения 16А едят
          • –1
            Вы не перепутали со стартером? Впрочем, и с такими токами легко справятся соответствующие микросхемы:
            http://robot-kit.ru/product_info.php/info/p593_Draiver-motorov-na-mikrosheme-BTN7971B--do-68A---DC-Motor-Driver--RKP-BTN7971B-.html
            • +1

              стартерный ток 3 сотни амер запросто достигает, особенно в момент самого пуска.

              • 0
                Если про момент пуска говорить, то это, в некотором роде, дельта-функция, интегральной энергии не хватит, чтобы спалить транзистор драйвера. Но можно 0.1 Ом резистор вставить последовательно, если есть опасения, да и служить драйвер дольше будет. Хотя проще и дешевле действительно купить реле, что автор и сделал. Это же теплица, а не щелканье релюшек ночью в спальне, в полной тишине :)
  • 0
    Доброго времени!

    Давно обдумываю подобное устройство. Для меня главная проблема — как сделать надежный привод для дверей/окон, то есть «механика». На Вашем фото видно, что он у вас заводского изготовления (скорее всего). Где найти подобный? Или как сделать?
    • 0
      Если попробовать прочесть внимательно, то можно узнать, что автор использует автомобильные стеклоподъёмники.
      • 0
        Я это прочитал :-).

        Но я понял эту фразу так, что «стеклоподьемники» — это только двигатель. А меня интересует именно «железяка», что на 3 фотографии. Если они «в комплекте» с двигателем, то тогда все становится понятно. Но я таких никогда не видел — в моей машине такого нет. Тогда вопрос — от какой машины искать стеклоподьемники такой конструкции?
        • +1
          Искать по запросу: «Ножничные ЭСП», я, помнится, когда-то в волгу себе такие внедрял
          • 0
            Спасибо, теперь буду знать, что нужно спрашивать в магазине :-)
            • 0
              Вероятнее всего найти это можно на барахолке.
    • 0
      Брал стеклоподъёмники б/у на авито за 500 рублей.
  • +2
    А если прикрутить к окнам противовесы, можно существенно облегчить жизнь подъемникам.
  • 0
    Думал о проветривании теплицы электроприводами, но потом понял что слишком это ненадежно, в связи с отключениями электричества. Хочу приспособить для проветривания гидроцилиндры. И работают в заданных диапазоне температур и полная автономия.
  • +1
    Идете в ближайший хозмаг и за 3 копейки покупаете гидравлические подъемники, откалиброванные на 25 градусов цельсия (уже при 30 градусах пыльца томатов теоретически погибает). И они без затей, без электричества, без аккумуляторов, без датчиков, без вайфая и даже без распбери легко и непринужденно открывают и закрывают форточку, регулирую температуру.
    • +1
      /me минут пять пытался понять, что за магия описана в этом комменте, но так и не смог понять, что это за гидравлический подъемник, работающий без источника питания, откалиброванный на что-то, но при этом не имеющий датчика этого чего-то, плюс продающийся в хозмаге задешево…
      • 0
        А я даже загуглить пытался, но тоже ничего не нашлось…
        • +4
          В продаже имеются подъёмники. Механические. Например такие: http://aquadusya.ru/item.php?id=8
          И это не единственный вариант. Не реклама. У меня самого стоят похожие.
          Друзья, уважаю любой труд. Но этот проект поражает своей… нелогичностью. Пушкой по воробьям. Не пушкой — ракетой.
          • НЛО прилетело и опубликовало эту надпись здесь
            • +1
              Что же Вас тут пугает. Этот проект до конца ещё не доработан, будут добавляться новые функции. Техника вся относительно дешёвая. Конечно возможно было бы выгодней использовать какой-нибудь микроконтроллер, но так уж вышло, что с сначала я познакомился с Raspberry Pi, интересная игрушка. Уже после установки этого оборудования в теплицу, я начал интересоваться микроконролерами.
            • 0
              Это демонстрация самому себе технологической мощи цивилизации :)
              Дальше этот ПИД-регулятор будет заменен сервисом от IBM Watson, для предсказания температуры на основе прошлых данных, чтобы не ждать повышения-понижения температуры, а заранее открывать-закрывать окошко ма-а-а-ленькими порциями, с учетом динамики реального изменения температуры — это сэкономит энергию аккумулятора, отдаваемую на движки.
              Хотя и такой простенький экстраполятор можно на МК за пару-тройку долларов сделать :)
            • 0
              Совершенно верно. И я вообще не понял, зачем тут вайфай, сервер и прочие ненужные премудрости.
              Для этой задачи хватит элементарного 8-ми разрядного микроконтроллера (МК)
              К МК подключить два 7-ми сегментных индикатора и две кнопки (чтоб можно было температуру уставки задавать), термодатчик DS18b20 или аналогичный, и 4 выхода для управления двумя H-мостами на MOSFET для управления эл.двигателями приводов.
              МК вполне способен сам дать команду на измерение температуры, принять результат измерения и решить, надо ли открывать-закрывать форточки.
              Да для этой задачи хватит чего-нибудь наподобие «народного» ATmega8, еще и ресурсы в виде памяти программ и линий портов ввода-вывода останутся.
              • –2
                Но так же не интересно, ни камеру прикрутить, не бота не завести.
                • 0
                  Ну, не знаю. Я инженер, меня учили решать поставленную задачу наиболее оптимальным и простым способом. Бритва Оккама — знаете? Ненужные сущности следует отсечь.
                  Зачем прикручивать камеру именно к контроллеру управления форточками теплицы?
                  Или это сейчас модно — прикрутить к изделию ненужные «финтифлюшки» и «свистоперделки» для того, чтобы продать дороже? :-) Но у Вас же вроде не коммерческое изделие…

                  Как Вы вообще при данной реализации собираетесь передавать видеопоток от камеры? Сообщениями Telegram? По идее, если на садовом участке есть интернет и хочется камеры, то их проще подключить отдельно.
                  • 0
                    Снимки делаются каждые 5 минут, хранятся на Яндекс.Диске, так же можно посмотреть прямую трансляцию через веб интерфейс, находясь в локальной сети.
              • 0

                Хватит биметаллической пластины, которая будет открывать и закрывать окошко.
                В аквариумных терморегуляторах уже лет 50 такое реализовано.

      • +1
        Человек имел в виду «термопривод для теплицы» — наподобие автомобильных газовых упоров, только внутри цилиндра вещество, плавящееся при определённой температуре.
        У меня на даче такой привод всего два года прожил.
        • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            Линейные актуаторы — штука классная. Только они стоят, как крыло от самолёта.
            • НЛО прилетело и опубликовало эту надпись здесь
          • 0

            А чем плох моторчик, наматывающий на ось веревку, которая открывает окошко?

      • 0
        Устройство — простейшее: гидроцилиндр (диаметром 20-30 мм), присоединённый к резервуару с гидромаслом (кусок трубы). Работает совершенно независимо — просто от теплового расширения масла.
        Мой брат сделал такое больше 10 лет назад. И даже книжку написал (между прочим, ровно так и называется — «Умная теплица»):
    • –1
      Объясняю, почему не механические гидроцилиндры и тому подобные вещи.
      1. Нет возможности настроить
      2. Низкая скорость реакции (пока нагреется жидкость и откроется окно всё уже свариться в теплице)
      3. Нельзя запустить обогрев
      • +3
        Эмммм…
        Мне кажется, Вы не до конца разобрались.
        1. Настройка не требуется.
        2. Скорость невысокая, да. Так и солнце по небосводу не ахти как быстро движется. Одно другому соответствует.
        3. А это как связано?
        Пишу исключительно на основе своего опыта теплицестроительства.
        • –1
          1. А если я хочу потом поменять температурный режим
          2. Нагревается очень быстро
          3. В планах на будущее прикрепить обогреватель
          • +1
            Заинтересовался темой. Ваше решение как айтишнику нравится. Спасибо, что поделились и опубликовали статью, отличный опыт!
            Но в бой, пожалуй, тоже бы выбрал гидроцилиндры.

            Насчёт ваших вопросов выше:

            1.

            Гидроцилиндры (или пневмоцилиндры) вполне бывают настраиваемые. В том числе и самодельные. Например, настраиваемые регулировочным болтом. Пример. Впрочем, вариантов много можно придумать.

            Хотя, честно говоря, не очень понятно зачем перестраивать температурный режим теплицы, если по сути растения из года в год в ней одни и те же.
            Разве что для подстройки системы из-за возможной саморасстройки (люфты, утечки, аварии) со временем.

            2.

            Уверен, скорости реакции системы гидроцилиндра на изменение температуры вполне достаточно. Если же правда необходима более резвая реакция — уверен, «компьтерные» радиаторы решают, даже алюминиевые. Хотя опять же, не видел, чтоб кто-то радиаторы присобачивал, — видимо вполне хватает «глупой и беспощадной» голой поверхности гидроёмкости и цилиндра.

            Здесь может быть хорошей мыслью на тему «быстрого» гидроцилиндра — в качестве теплообменной гидроёмкости использовать первый попавшийся б/у автомобильный радиатор.

            И кстати, на роль гидравлической жидкости вполне может пойти не только масло, но и обыкновенный тосол. (У минеральных масел, к слову, коэффициент теплового расширения примерно такой же)
            расчёт
            Например, тосол 65 (замерзание при -65). Его коэффициент теплового расширения для характерного диапазона тепличных температур составляет 0,6%..0,7% на градус цельсия. У прочих распространённых антифризов примерно такой же.
            Допустим, у нас гидроцилиндр на основе упора багажника, тормозного шланга и радиатора как гидроёмкости. Площадь цилиндра в упоре пусть 4 см2, макс длина выдвижения штока 25 см. (Нарочно беру довольно большие величины, чтоб получить максимальную оценку объёма гидроёмкости.)
            Значит, объём, на который необходимо расшириться, чтобы вытолкнуть упор и открыть окно, составляет 4 * 25 = 100 см3 = 0,1 л.
            Допустим, мы хотим, чтобы крыша была закрыта при +25 и полностью открыта при +30. Тогда объём гидроёмкости должен составлять 0,1 / ((30 — 25) * 0,0006...0,0007) ~= 28..33 л.

            На самом деле, нам не требуется здесь такой огромный ход поршня в 25 см — гидравлическое давление достаточно высоко, чтобы испольовать рычаги с малым плечом, и вполне достаточно будет хода в 10 раз меньше. Площадь цилиндра характерного упора багажника не 4 а 3 см2.
            спойлер
            Приемлемый диапазон температур в теплице можно взять вдвое шире, +20..+30, — но мы этого делать не будем, т.к. уже подошли к нормальным объёмам.


            Итоговый объём гидроёмкости должен составить порядка 2,5 литров.
            Для двух упоров с форточками, соответственно — 5 л.
            Более чем реалистично.
            И вполне подойдёт как «быстрая» теплообменная гидроёмкость тот самый б/у авто радиатор.
            замечание для больших систем
            Если теплица огромная, или теплиц много, или упоров надо много и мощных — резонно, например, брать отработанное автомобильное масло, которое народ массово выкидывает / сливает на ТО. Недорого, если не бесплатно.


            3.

            Идея добавить в систему обогреватель отличная. Но в принципе, эта идея вполне автономная — обогреватель может работать сам по себе в зависимости от температуры, а проветривание при превышении температуры само по себе. В чём заключается дополнительная надёжность по известному правилу, — чем проще конкретная изолированная система, тем надёжнее.

            Кстати, и обогревателем вполне можно управлять через гидроцилиндр (хоть тот же, хоть отдельный) через пружинный выключатель на включение:
            — пока «тепло» цилиндр штоком нажимает выключатель, цепь разорвана, обогреватель не работает,
            — когда «холодно» шток отходит от выключателя, цепь включается, обогреватель греет.

            4.

            И добавлю от себя полезную простую идею. Чтобы теплица остывала медленнее и нагревалась быстрее, — сделайте то же самое, что природа делает для обеспечения мягкого климата вместо континентального. Добавьте воды. А именно, расположите чёрную бочку для полива внутри теплицы.
            Практически от этого только плюсы — и подогрев воды солнцем до «тёплой», что приветствуют огурцы-помидоры, и «смягчение климата» по температуре.
            Для автоматического пополнения запасов воды просто подключите шланг к системе «смыв унитаза», который закрепите сверху бочки — воды всегда будет ровно сколько нужно. Можно всяких краников добавить по усмотрению.

            Успехов в благородном тепличном деле! :)
            • 0
              "… остывала медленнее и нагревалась быстрее" — тут конечно же ошибся, не вычитал вовремя и не успел исправить.

              Правильно: «остывала медленнее и нагревалась медленнее».
            • 0
              Все ваши высказывания разумны и обоснованы, спасибо за советы. В теплице стоит чёрная бочка с водой, но использовать её в качестве аккумулятора — это идея. Надо наверное поставить вторую.
              • 0
                Всегда пожалуйста.

                А из суровых идей могу ещё такую предложить.

                5.
                Перед установкой теплицы по периметру будущей теплицы прорыть ров шириной в 2-3 лопаты (ориентироваться в ширине по личному «удобно») и глубиной 1,5-2 метра. Сбить короб из деревяшек к внешним стенкам рва. Замостить теплоизолятором. Пеноплекс, пенопласт или что удобно. Как вариант, дополнительно заложить подходящую систему подогрева. И засыпать грунтом ров обратно.
                Диапазон пригодных тепличных месяцев так можно существенно расширить, вплоть до круглогодичного. При годном верхе, конечно.
      • 0
        1. Настройка — просто передвижением точки крепления гидроцилиндра к каркасу теплицы. Настраивается момент начала открывания фрамуги, скажем, на +25 градусов.
        2. Если всё сделано правильно, скорость реакции вполне приемлема (десятки секунд): солнце скрылось за тучу — фрамуга прикрылась, солнце выглянуло — снова открылась.

        P.S. Книжка «Умная теплица» (2006 г.): http://kurdyumov.ru/knigi/teplica/teplica01.php
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Если не трудно — напишите пост о том, как МК заменял Raspberry, думаю не мне одному будет интересно =)
      Я на нём много программировал, но не знал, что он умел реле переключать…
      • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        МК не заменяет Малину. МК измеряет температуру, и подает/снимает питание с приводов по установкам. Что здесь удивительного. МК для этого и предназначен.
        • 0

          "Эмбеддеру на заметку: микроконтроллеров для мультивибратора нужно два" :)


          Неоправданно усложнять систему могут лишь студенты, которые не знают, что даже с виду простые датчики температуры DS18B20 имеют несколько версий и эррату.
          http://www.microchip.su/archive/index.php/t-1990.html
          Чем сложнее программно-аппаратный глюкодром — тем выше вероятность сбоев.
          https://geektimes.ru/post/283804/

      • 0
        А в чём сложность переключать реле? Настраиваем ногу МК на вывод, подключаем к ней транзистор, а к транзистору уже реле. Всё так же, как и я делаю.
        • 0
          Ну вообще то там еще диодик должен быть хотя бы, для подавления тока самоиндукции. У Dihalt хорошая статья на эту тему есть.
          • 0
            В платах с релюшками, если их, конечно на Алиэкспресс брать, диоды, ключевые транзисторы и остальное уже присутствуют. В малых количествах дешевле именно готовую плату с реле взять, отдельно россыпь продается либо партиями, либо за доставку надо платить, а это иногда стоит больше самой детальки.
            Но это чисто особенность Али, ее надо просто знать
            • 0
              Так у автора вообще то не готовый платки, суда по фото.
            • 0
              У него там дарлингтон типа ULN. Не готов спорить по ценам, ведь это спорная тема, ведь реле можно купить почти всегда в радиомагазине, да и микросхему ту же. Хотя вот реализация всего этого на макетке выглядит аляповато, я бы сделал плату, хотя бы ЛУТом. Работы на пару часов, за то результат бы выглядел на много лучше.
              А если поговорить о схемотехнике, то тут я бы вообще развязал это все через оптроны, ибо очень дорогие порты у контроллера и есть большая опасность статики.
              • 0
                Не статика, а ЭДС самоиндукции, я полагаю :) Статике в теплице взяться неоткуда, там влажность большая.
                Можно платку и с оптронами взять, без разницы. Было бы желание…
                • 0
                  нет, именно статика, потому что теплица большая пластиковая поверхность, статики там валом.плюс гроза. А эдс самоиндукции в свою очередь.
                  • 0
                    Пластик в земле одним концом + железные стойки, на которые натянут пластик, вкопаны в землю + влажность.
                    А гроза — это по другому ведомству, там выгорит все, что с оптроном, что без. У оптрона напряжение пробоя изоляции маленькое для грозы, погуглите: 5 кВ, и это еще нормальным считается.
                    • 0
                      Теплица деревянная, на потолок и одну сторону натянут пластик.
                      • +1
                        Ну и ладно (шмыгая носом), ставьте ваши оптроны… :)
    • –1
      Конечно для этого можно использовать 8-битный МК типа Arduino, но:
      1. У меня там стоит камера, которая делает снимки
      2. На МК запустить Telegram бота проблематично
      Ну так же там есть система мониторинга температуры и хочется быстро редактировать программу без перепрошивки
      Про моторчик не знаю, окна тяжёлые
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0

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

          • 0

            тогда можно использовать esp8266, на какой нибудь плате nodemcu, через mqtt отслеживать показания датчиков, и работу автоматики с любого телефона, если интересует видеонаблюдение, то какая нибудь ip камера все это слихвой всё сделает.

            • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            Тогда остается один выход. КВ трансивер и любая цифровая мода. Никакой привязки к операторам связи. Полная независимость. Большие расстояния. На малой мощности тем же WSJT или PSK маил сервер. Дома автономку от солнце/ветро/дизельной системы.
            • 0

              Опсосы — худшие из провайдеров услуг. Больше так гадить своим клиентам никто себе не позволяет.
              Может еще сбербанк только с ними может сравниться.

        • 0
          Например, перегрев, или Температура ниже минимальной и нагрев ХХ времени не помогает.

          Хорошо, перегрев, и что Вы сделаете, если дача в 50 км от Вас?

          или Температура ниже минимальной и нагрев ХХ времени не помогает.

          И что Вы сделаете, даже если будете на даче? Костер в теплице разведете?

          Или воды нет, или электричества больше ХХ часов

          И что вы сделаете, если нет воды — с собой в канистре привезете? А если нет электричества, то опять же что Вы сделаете — с собой его привезете?

          Я к тому, что все эти проблемы надуманы. Не должен контроллер управления форточкой чего-то там отсылать, это не его функции.
          Вообще, я хочу напомнить, что сад/дача подразумевает регулярное там присутствие человека. Допустим, полив автоматизировать можно, но как автоматизировать выдергивание сорняков и сбор тех же огурцов, которые если вовремя не сорвать, то дня через 3 они уже перезреют и станут негодны в пищу?
          А здесь, как мне кажется, сначала пытаются придумать проблемы, чтобы потом искать пути их решения.
          • 0
            Но ведь система может выйти из строя: насос сгореть (с нашей скважиной это не редкость), привод заесть/сломаться и многое другое. Живём в частном доме, до теплицы не далеко
    • 0

      контактных термометров и больших реле вполне хватало

  • 0
    А делать VPN дорого, ведь хочется всё бесплатно.
    Эм… можно объяснить, что конкретно дорогого в том, чтобы совершенно безвазмездна (с) поднять OpenVPN сервер на дешевом роутере где-то и цепляться к нему? Или у вас просто физически нет такого места, где бы этот роутер мог стоять с доступом к нему извне?

    Пытался сделать веб интерфейс на хостинге
    Стоп, у вас еще и VPS есть где-то? Тогда я вообще не понимаю, что «дорогого» в бесплатном VPN…
    • +1
      К сожалению роутера нет с белым IP. Нет внешнего VPS нет, но есть бесплатный хостинг для сайта с базой данных
      • 0
        Есть такой протокол MQTT. Его применение снимает вагон головной боли с серыми адресами, причем на обоих концах провода. Ряд бесплатных брокеров позволяют соединять устройства быстро и надёжно.
      • 0
        Существует вот такая вещь. Можете попробовать, судя по описаниям, для ваших целей скорее всего отлично подойдет. На 842-м TP-Link люди поднимали сабж.
      • 0
        550р в год за VPS OpenVZ с белым айпишником. Куда уж дальше-то… Одна релюшка дороже стоит, если ее в местном магазине покупать :)
  • +3
    Эх. Когда Пай убьет SD-шку — будет не весело…
  • 0
    Интересно… У меня была подобная задумка, но было банально не до нее. Что собирался делать:
    До теплицы около 70 м, поэтому Wi-Fi/BT отваливаются. Наш выбор —
    1. Интересно и дешево, но долго: n24l01 (300 метров дальность) + ардуина + шилд с реле 10А + аккумулятор. Канал связи 1 кбит/сек вполне достаточен — команды телеметрии от теплицы, если что-то идет не так, плюс канал управления от, скажем так, хоста — ардуина + n24l01, подцепленная через USB к Raspberry/компу
    2. Быстро и дорого: PowerOverEthernet + Raspberry +
    • 0
      В теории на дистанции 70м двойной квадрат может ловить сеть. Да и при желании витую пару туда можно провести. Так же есть технологии по передачи данных через электрическую сеть 220В (но на сколько я понял, у вас теплица не электрофицирована). Так же в Китае можно купить дешёвый GSM модуль начиная от 150 рублей, а у некоторых российских операторов есть тарифы с бесплатным трафиком (у Мегафона кажеться 20 МБ в день).
      • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Не дописал, и случайно ушло на модерацию :)
        Я именно про витую пару с PoE и обмен данными по Ethernet. Можно, конечно, прокинуть туда 220В и данные по ней, но это надо бросать кабель в той оболочке, которую нельзя пробить лопатой (такой будет стоить как все остальное, вместе взятое), потом влажность в теплице может привести к поражению током, при том, что под ногами — голая влажная земля. В общем, это категорически нельзя делать. Например, залезет вор в темноте, схватится за провод — и ближайшие 5 лет хозяин проведет в местах, совершенно исключающих занятие электроникой.
        PoE дает мощность 15 ватт в пределе, можем уверенно взять половину от этой мощности. 2.5Вт потребляет Raspberry (а Ардуина еще меньше), соответственно, 5 ватт вполне допустимо отдать на двигатель, который через редуктор может открывать-закрывать форточку. Открывать он ее будет полчаса, что вполне допустимо. Тем более, что необязательно открывать ее на полную
      • 0
        Не понимаю эти заморочки с двойным квадратом при расстоянии менее 150-200 метров.
        На двух дешёвых tp-link'ах (TD-W8951ND и TD-W8901N) в режиме Wi-Fi моста работает на ~130 метрах у меня один магазин и второй магазин на ~95 метров мост. Естественно со стоковыми антеннами.
        Зимбабве выбрал как место нахождение в настройках Wi-Fi.
  • –2
    [лицо Лаврова,jpg]
    Про SSH, наверное, родители забыли рассказать.
    • +2
      Хочу вас расстроить. Но я ясно писал в статье, что наш роутер находится за NAT. То есть любые попытки подключиться к Raspberry Pi из Интернета проваливаются, в том числе и по SSH. Конечно для загрузки кода программ, настройки и т.д. я использую SSH, потому что нахожусь в пределах локально сети. Но согласитесь, даже если бы NAT не было, управлять всем этим по SSH с мобильного телефона не очень удобно.
      И давайте будем соблюдать правила сайта, и не будет унижать человека по внешним признакам.
      • –2
        Я разве сказал, что надо подключаться по SSH к Raspberry Pi?
        Ну а идея управлять чем-то важным через насквозь дырявые и притом закрытые протоколы и сервисы, принадлежащие невесть кому — это, ну… Только это лицо и вспоминается.
        • 0
          Про SSH, наверное, родители забыли рассказать.

          Что вы хотели этим сказать?
          • –1
            Многие почему-то до сих пор думают, что SSH — это такой Telnet через SSL, и ничего более. Удалённая консоль, конечно, весьма популярный способ использования этого протокола, но это только часть его возможностей. Вот примерно это хотел напомнить.
            В частности, SSH умеет пробрасывать порты — это раз. Во-вторых, вы упоминали некий хостинг — а там есть белый IP. То есть можно не только легко синхронизировать базы, но и напрямую пробросить любой порт с белого IP на «малинку».
            • 0
              Ну как сказать хостинг, при желании можно взять бесплатный веб-хостинг, а там никакого SSH естественно нет
              • 0
                Я бы в таком случае просто сливал бы данные с малинки на хостинг через HTTPS. Даже SSH не нужен, чёрт бы с ним.
                В общем, я о том, что боты — это, конечно, модно сейчас, но не нужно. Всё решается более простыми средствами, зачастую штатными.

                Ещё момент: не всегда обязательно что-то дополнительно арендовать, чтобы иметь белый IP. К примеру, я сам живу в таких же условиях, как вы описали: отдалённая деревня, интернет в лучшем случае по технологии 3G и никакого белого IP. Но в городе у меня есть как минимум три человека, которые не откажутся разместить у себя мою железку, при условии, что она не будет жрать много электричества и громко жужжать. Интернет в городе быстрый и безлимитный. Этим я и воспользовался не только для организации доступа в домашнюю сеть извне, но и для администрирования некоторых точек с аналогичными условиями. Оттуда, из-под NAT, автоматически устанавливается SSH-соединение с пробросом портов. В свою очередь по этому проброшенному порту я могу соединиться по SSH с удалённой точкой и делать там что душе угодно вплоть до SOCKS-проксирования в тамошние локалки. Всё просто и не требует ни установки VPN-сервера, ни каких-либо сложных плясок с бубном, SSH-сервера и весь этот функционал во всех нормальных операционках установлен и работает«из коробки».

                Ну а ещё на той железочке установлен XMPP-сервер, который я собираюсь применять для своих будущих домашних и агротехнических девайсов по спецификациям XEP-0323..0326. Под это всё я неспешно пилю что-то вроде SCADA-платформы… Впрочем, это я уже совсем отвлёкся.

                Главное — при этом никаких посторонних серверов, необходимости сообщать кому-то номер своего мобильного телефона и т.п. Вся «кухня» только в моих руках. О том, что сервисы, так или иначе использующие мобильную связь для авторизации, весьма небезопасны, вы, надеюсь, знаете? По такой схеме я не рискнул бы даже лампочкой в туалете управлять, не то что теплицей или, упаси ЛММ, системой отопления.
      • 0
        VPN прокинуть можно, и после творить все, что душа пожелает
        • 0
          У меня нет своего роутера с белым IP, на аренду тратиться не хочу
  • 0
    Если в заголовке фото Вашей теплицы, то может и не имеет смысла, так как она маленькая, но при бОльших размерах теплиц имеет смысл поставить (чуть ниже потолка, но выше верхнего уровня растений) вентилятор для перемешивания воздуха, который так же следует завязать на температуру и влажность (о датчиках влажности воздуха Вы не писали в статье). Что касается системы полива, то её лучше сделать строго по часам, но можно попытаться мудрить с датчиком влажности почвы — но калибровать его, думается мне, будет та ещё задачка.
    На фото камеры и антенны виден, если не ошибаюсь усб-хаб. Ни камера, ни хаб не защищены от осадков — или в этом месте навес есть, который не попал в кадр?
    • 0
      Отвечаю по порядку:
      1. Планируем прикрепить вентилятор для очень жаркой погоды, в случае если окна справляться не будут (иногда для выброса тепла открываем дверь, но её автоматизировать тяжело, поэтому вентилятор как вы заметили правильное решение)
      2. Можно конечно по часам, но в зависимости от разных условиях земля высыхает не всегда в одно и тоже время, уже закупили датчики влажности. Полив по системе «дырявый шланг».
      3. Да, подключено через USB хаб с подводкой дополнительного питания, чтобы не грузить малинку
      4. Всё оборудование стоит в теплице, до окна далеко, влага попадать не должна.
      • 0
        Если поливать будете не водой, а раствором, то необходимо продумать систему перемешивания раствора перед поливом, так же стоит задуматься над контролем температуры поливочного раствора (воды).
        В теплице влажность высокая, как следствие, и приборы могут выйти из строя из-за этой влажности (обычно то, что стоит в теплице пылевлаго защищенное). Оборудование, которое «управляет» теплицей размещают вне её, в так называемой технологической зоне, не такой агрессивной среде, как теплица.
  • –1
    /Случайно написал комментарий /
  • 0
    На осень/весну можно сделать обогрев почвы, самодельный (на youtube много видео).
    • 0
      Хочу сделать контроллер теплицы по температуре, с открыванием фрамуг, одной, двух, если совсем жарко, по температуре и влажности, с управляемым капельным поливом. Может быть кто нибудь встречал пример реализации логики работы этого всего, там блок схемы? Я то просто не ботаник, и мне тяжело подобрать оптимальные режимы, да и учесть все факторы.
  • +2
    Делал для черногорских братьев подобную фигню. Все проще и дешевле.
    8 теплиц для цветов размером 50х6 м каждая. В каждой стоит типа arduino mini + SX1278 модуль за 6$. Небольшая панель солнечная и аккумулятор на 500-700 mA. Рамы с противовесами и моторы небольшие. Датчики конечно понатыканы температуры, влажности. Воду полива правда не включают — не нашли дешевых электрический клапанов в этой стране, но у них в планах есть на весну. Все эти ардуины соединяются через 433MHz с центральным (макс расстояние 700 м) в доме (ODROID-W но сейчас таких не продают, но есть подобные за 5$ Rpi Zero). А он уже сигнализирует обо всем, что можно и нужно главному цветоводу и его помощникам.Моторы они сами брали где-то, а остольное обошлось ~250$. Чудесно с мая работает — пару раз выключали 220В — тогда вручную закрывают/открывают, но батарейки хватает примерно на сутки мерять параметры и отправлять. Тоже стоит за NAT, но это не помешало за 2 часа сделать отправку данных на сервер (бесплатный используется), что бы заказчики могли контролировать — у них там строго с технологией производства.
  • 0
    На raspberry pi с помощью post запросов через wget или curl можно вести твиттер или блог теплицы, raspberry постила бы туда свежую информацию о температуре, фото огурчиков.
  • 0
    Если конечно совмещать интерес к программированию и желание автоматизировать теплицу то идея прекрасна. Но если задача проветривать теплицу чем не угодили гидроцилиндры?
    • 0
      Повторяю уже не в первый раз, почему не использую гидроцилиндры.
      1. Тяжело а порой и невозможно настроить на нужную температуру (можно купить настроенный, но потом изменить настройки на другую температуру не выйдет)
      2. Медленное прогревание цилиндра, соответственно окно открывается медленно
      3. Помидоры растут внизу, а гидроцилиндр вверху, по законам физики температура вверху выше, чем внизу
  • 0
    Я мож невнимательно прочитал, но отчего-то не понял, почему автор не заюзал dyndns?
    • 0
      Из-за технологии NAT коммутатор у провайдера блокирует все порты
    • 0
      Так он поможет только при сером ip, а не при nat.
      • 0
        Не при сером, а при динамическом. Серый — это и есть NAT.
        • 0
          Да, ошибся
  • 0
    Для регулирования температуры лучше использовать ПИД регулирование https://habrahabr.ru/post/145991/
    Я бы, конечно, подобные вещи на plc реализовывал. Есть недорогие, например http://www.owen.ru/catalog/programmiruemij_logicheskij_kontroller_oven_plk73/opisanie
    Входы и выходы есть, ПИД регулятор, дисплей с кнопками, промышленное исполнение и не так уж дорого.
    • 0
      Кстати, у овена есть недорогие измерители-регуляторы http://www.owen.ru/catalog#53276211 Их можно вполне использовать для подобных целей. У некоторых есть rs-485, который можно полевкой или витой парой не одну сотню метров кинуть. Модбас можно разобрать самостоятельно на компе или использовать их скаду.
  • –1
    Установив Apache на дистрибутив Raspbian, мы в течение месяца не могли достучаться до странички из интернета. Что только не делали. Настраивали порты, открывали их, ничего не помогала. Причём в локальной сети всё работали. Потом мы узнали печальную правду: мы находимся за NAT.

    Простите, на этом моменте у меня рука закрыла лицо, и дальше читать не смогу. Так и пишу.
    • 0
      Что конкретно не так?
      • –1
        В 2016 году месяц понимать, что вы за натом.
        • 0
          Скажу честно, что до того как я начал собирать теплицу я с сетевыми технологиями был знаком не очень. Во вторых я просто с выходом в интернет никуда не торопился. Время было только на выходных, что только не пытались сделать, перебрали много способов, копались в портах. Потом когда всё уже перепробовали, стало понятно, что дело пахнет NATом. Звонок провайдеру это подтвердил.
  • 0
    Года полтора назад любой проект без ардуино — не проект) Сейчас, что ни статья, то с уклоном на автоматизацию через ботов Телеграмммм…
    Я лентяй — переплатил бы 5 баксов в месяц и поставил простой и надежный VPN на VDS, пусть не бесплатно, но проще и понятнее.
    • –1

      А через 3-4 года высохший импульсный БП роутера или "абдурины" погубит юные растения.
      Терморезистора и компаратора хватило бы, с трансформаторным блоком питания.


      Советую прочесть В.Гуревича "Надёжность микропроцессорных устройств..." и древнюю байку про неоправданные усложнения.


      О тостере и инженере-электрике


      Давным-давно, в тридевятом царстве, в тридесятом государстве король вызвал к себе двух своих мудрецов-советников и задал им хитрую задачку.


      Он показал им блестящую железную коробочку с двумя прорезями сверху, переключателем-ручкой и рычагом и спросил: «Что это?»


      Один из мудрецов, инженер-электрик, ответил первым: «Это тостер».


      Король спросил: «Как к нему приделать компьютер?»


      Мудрец ответил: «С помощью четырехбитного микроконтроллера я напишу простенькую программу, которая будет считывать данные с ручки, устанавливающей 16 степеней зажарки: от белого-пребелого до угольно черного. В программе будет простая табличка, сопоставляющая требуемый уровень зажарки тостов и длительность работы таймера. Она будет включать тостер и запускать таймер в соответствии с выбранной степенью зажарки.
      По окончании она будет выключать тостер и выбрасывать готовые тосты.
      Через неделю будет готов работающий прототип».


      Второй мудрец, программист, немедленно увидел опасность такого недалекого подхода к решению задачи. Он сказал: «Тостеры не только превращают хлеб в тосты, но и разогревают замороженные вафли. На самом деле перед вами прибор для приготовления завтраков. По мере того как, ваше величество, ваши подданные будут становиться всё более и более утонченными, они будут требовать все больше новых возможностей. Им нужен будет прибор для приготовления завтраков, который также сможет пожарить им колбасу, бекон и яичницу. Тостеры, которые умеют поджаривать только тосты, выйдут из употребления. Если сейчас не задуматься о будущем, через несколько лет нам нужно будет разрабатывать новый тостер! Если мы взглянем на проблему под таким углом, то мы сможем найти более разумный подход к решению этой задачи. Начнем с создания класса продуктов для завтрака. Разобьем его на подклассы зерновых, мясные и птицу. Далее для каждого подкласса повторим процесс деления на подуровни: в зерновые войдут тосты, кексы, блины, вафли; мясные разделятся на сосиски, колбасу, бекон, а птица будет включать в себя яйца вкрутую, в мешочек, всмятку, яичницу-глазунью и целую подгруппу омлетов. Надо также будет предусмотреть специальные подгруппы рубленой ветчины и сырного омлета, так как они будут пересекаться с разными подгруппами. Таким образом, поставленная задача не может быть решена без множественного наследования. Во время своей работы программа должна создать верный объект и выполнить для него директиву «готовься». Семантика такой директивы, конечно же, зависит от объекта. «Готовься» по отношению к тосту и крутому яйцу будут значить абсолютно разные вещи. Рассмотрев процесс на этой фазе, мы понимаем, что базовое оборудование должно иметь возможность готовить любой вид завтрака. Переходя непосредственно к дизайну мы обнаруживаем наличие производных требований, а именно разработки объектно-ориентированного языка со множественным наследованием. Конечно же, пользователи не захотят, чтобы их яичница остыла к тому моменту, как поджарится бекон, отсюда появляется требование многозадачности. Нельзя забывать и о пользовательском интерфейсе: рычагу, опускающему продукт к нагревательным элементам, не хватает универсальности, а ручка, устанавливающая степень зажарки, недостаточно информативна. Пользователь не будет пользоваться продуктом без привлекательного графического интерфейса. При включении агрегата для готовки завтрака на экране должна появляться анимация, щелчок на которую будет демонстрировать надпись «загрузка Windows XX» (к тому моменту, когда продукт будет готов к выходу на рынок, выйдет и Windows XX).
      Посредством ниспадающих меню пользователи смогут выбирать тип готовящихся продуктов. Приняв эти важнейшие решения о разработке программного обеспечения, мы должны перейти к выбору адекватного аппаратного обеспечения на фазе реализации проекта. Компьютер с процессором Интел Пентиум, с 2-мя гигабайтами оперативной памяти, жестким диском в 120 гигабайт и SVGA монитор вполне подойдут для наших целей. Как только мы выберем многозадачный объектно-ориентированный язык, поддерживающий множественное наследование, в который будет встроен графический интерфейс, написание такой программы не займет много времени».


      Король мудро обезглавил программиста, и все стали жить-поживать да добра наживать.

  • +2
    По поводу не-записи в базу данных через модуль: предполагаю, что проблема в том, что не было commit после транзакции (или auto-commit опции если такая есть).
  • 0
    Мне кажется что малина тут нецелесообразна, с такими простыми задачами справится esp8266
    Быстрый старт телеграм бота я описывал тут http://mysku.ru/blog/china-stores/48213.html
    Думаю, нужна ли статья на хабре? (в более развернутом виде)
  • 0

    В росии халявное тепло выветривать — расточительство. можно вот так аккумулировать: https://www.youtube.com/watch?v=3dUoxINkQys тут правда больше строительства чем автоматики, но и с механикой ничего городить не нужно.
    При обычном проветривании перегретой теплицы есть риск пересушить ее (лучше всего тепло уносит вода при испарении, как ни странно) и если помидоры еще переживут, то огурцы быстро уши повесят при такой автоматизации. При определенных условиях возникает странный микроклимат: корни вроде плавают, а листья в условиях сахары.

    • 0
      О, благодарю за напоминание. Тоже хочу когда-нибудь подобное построить, но всё упирается в финансы.
      Подземный накопитель энергии можно выполнить в виде большого теплоизолированного резервуара, это и дом согревать поможет.
      Там тоже микроконтроллеры и IoT задействованы. Наша, гиковская тема, в общем.
  • 0
    А делать VPN дорого, ведь хочется всё бесплатно.

    Пока у меня не появился собственный VDS для организации связи пользовался сервисом lan2lan.ru. До 3-х клиентов бесплатно.
  • 0

    Давно есть у меня идея сделать автопроветриватель окон для дома в зимнее время года.
    Спасибо за интересную статью.

    • 0
      Ну зачем усложнять систему механизмами (я сам механик, но не приветствую нагромождение шестеренок и рычагов без объективной необходимости). Может проще приточный клапан по принципу КИВ-125.
  • +1
    Как-то очень давно смотрел передачу в которой проветривание теплицы было сделано на гидроцилиндрах в которых жидкость расширялась или сжималась от температуры и таким образом открывалались или закрывались окна. Всё было сделано удивительно просто…
    • –1
      Вы не первый человек, высказавший такую умную мысль, поэтому ответ читайте выше.
  • 0
    На Алиэкспрессе есть готовые линейные приводы (актуаторы), правда не по 500 рублей, а от 2500 рублей, как-раз для окон.
  • 0
    А зачем мучались с управлением в интернете, а не сделали именно автоматизацию по температуре? Датчик температуры уже есть, ЦП для мозга есть.
    • 0
      Автоматизация я описывал в самом начале. телеграм это уже дополнение.
  • 0
    Друзья, вы конечно молодцы но на лицо нечеловеческий оверинжиниринг. Для проветривания теплиц существует целый ряд автоматических проветривателей, для форточек и дверей любого размера, выдерживающих любые нагрузки.
    Я использую так называемый «термопривод» (ссылку не даю, гуглите) — отработал 2 сезона без нареканий, просто идеально. Никакой интернет и электричество ему не требуется) Стоит неприлично дешево. Гарантия 10 лет. Да и ломаться там просто нечему.
    Поэтому считаю что вы молодцы, но не в том месте, в котором требуется =)
    Лучше придумайте систему автоматического полива для теплицы/огорода. Вот там есть где развернуться! Одна реализация датчиков влажности почвы чего стоит)

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