Рубрики
Без рубрики

вступление работать с ESP8266

Первоначально опубликовано здесь TL; DR Я строю экологические датчики, используя ESP8266, SUPE … Tagged с Dev, Python, Microcontroller, Micropython.

Первоначально опубликовано здесь

TL; DR

Я строю датчики окружающей среды, используя ESP8266, супер дешевый микроконтроллер с поддержкой Wi-Fi, который может запускать микропитон. Это руководство проходит через написание кода драйвера для 8266 для сбора данных с датчика влажности DHT и почвы и перенести их обратно через сеть в серверное приложение, которое собирает данные для использования позже. Код проекта доступен Здесь Анкет

Итак, я живу на Среднем Западе, где в течение зимы все становится исключительно холодно. Я также наслаждаюсь садоводством и свежими овощами. Эти факты не слишком хорошо смешиваются. К счастью, такие места, как Университет Миннесоты Иметь программы расширения, работающие с глубокими зимними теплицами, предназначенными для выращивания растений в мертвых зимы.

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

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

Это руководство/devblog/учебное пособие сформирует информацию, доступную из Micropython ESP8266 Учебник , что является феноменально хорошей ссылкой, а также некоторой документацией о датчиках, которые я использую.

Части

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

Программного обеспечения

Все утилиты, которые я использовал, были на основе Python; Так что я предполагаю, что у вас есть работающая установка Python 3 вместе с PIP. Вам понадобится несколько пакетов PIP:

pip install adafruit-ampy esptool

Вам также понадобится копия самой последней стабильной прошивки микропитона для ESP8266 из Micropython Page Анкет

Я использую серийный инструмент Picocom поговорить с советом по USB; Вы можете использовать любой ваш любимый инструмент последовательного соединения, пока он, как вы знаете, работает.

Почему ESP8266?

Итак, только начал работать с микроконтроллерами, я мало что знаю о них сумасшедших Но я скажу вам, что я знаю о 8266.

Первоначально для этого проекта я собирался использовать Arduino, подключенный через USB с Raspi. Arduino будет собирать показания датчиков через порт GPIO и сообщить об их обратном Raspi через сериал на USB. PI проанализирует входящие данные, соланит их и отправит на контрольный сервер. Была пара проблем с этим дизайном:

  1. Требуется Raspi для власти и общения с Arduino, с физической связью. Это затруднило бы разместить много датчиков мониторинга вокруг теплицы, так как сейчас мне нужно запустить кабель. Также увеличивает стоимость, поскольку на каждые 4 датчика Arduinos мне нужен один Raspi для власти и контроля их.
  2. Мне пришлось написать программу для Arduino в C. Я вроде ожидал, поскольку C определенно является самым хорошо подходящим языком для микроконтроллеров, но также отстой, поскольку C-боль в заднице, особенно для новичка.

Я мог бы смягчить проблему 1, подключив чип Wi -Fi к Arduino, и продумав данные по сети. Я не наслаждался этим с C, но это было технически возможно; Quick Research указывало мне в направлении чипа под названием ESP8266, который, по -видимому, был очень популярен среди людей, желающих использовать микроконтроллеры с Wi -Fi. Я пропустил во время первого прохода, так это то, что ESP8266 – это микроконтроллер по -своему справа Анкет Он не нуждается в Arduino, и обладает собственными возможностями GPIO. Фактически, 8266 превышает Arduino в доступной памяти.

Таким образом, я переключил галстуки с построения Arduino, подключенного к RASPI, над USB, и решил использовать флот из 7266S Beaming Data обратно в один центральный Raspi через Wi -Fi.

Начиная

ESP8266S я заказал от EBay утверждается, что отправляется в AT Firmwhewhe, где вы можете выпустить команды по сериалу в ESP8266 для таких вещей, как подключение к сети, открытие сокета TCP/IP, данные о силоке, принятие входящих данных и т. Д. К сожалению для меня, либо у них не было прошивки, прошивка не была Я ожидал, что я или я был слишком некомпетентным, чтобы правильно его использовать, поэтому я потратил около трех часов, пытаясь убедить проклятые вещи делать то, что я хотел, а затем столкнулся с проектом Micropython.

Следуя инструкциям из их супер полезного учебника ESP8266, я пошел на охоту за устройством в своем /Дев ; бег ls/dev/tty* И ищу вещи, которые заканчиваются в USB0 или Acm0 указат вам в правильном направлении.

Как только я выяснил, на каком порту он был, я скопировал прошивку микропитона в чип:

$ esptool.py --port /dev/ttyUSB0 --baud 460800 write\_flash --flash\_size=detect -fm dio 0 esp8266-20171101-v1.9.3.bin

Затем я подключился к чипу серийным терминалом:

$ picocom /dev/ttyUSB0 -b115200

И меня приветствуют с помощью микропитона реплики! Фантастика!

Подключение датчиков

Большинство моих сенсорных платформ будут датчиком влажности почвы, работающим с чипом компаратора LM393 и датчиком DHT 11 или DHT 22.

DHT выбрасывают цифровой датчик по одному интерфейсу проволоки, поэтому вы подключаете их положительный лидий к 3,3 В. ESP8266.

Датчик влаги, к сожалению, дает только аналоговый сигнал в зависимости от того, насколько влажной является почва, от 0 до 1 вольт. Это будет читать как значение от 0 до 1024, используя модуль ADC в микропитоне-мы вернемся к этому позже.

Как и в случае с датчиком DHT, положительный свинец достигает 3,3 В на ESP8266, отрицательный свинец выходит на землю, а аналог из чипа выходит на аналог в контакте 8266-только один аналоговый вход В верхнем слева от диаграммы распина. Он помечен как «ADC0» или «A0» на доске, которую я использую.

Одна вещь, которую следует отметить о чипе LM393, он содержит потенциометр, который посылает цифровой сигнал, когда аналоговое значение пересекает порог-«0» для ниже, а «1»-выше порога. Потенмер можно отрегулировать с помощью отвертки и некоторого терпения. Для моего использования я больше забочусь о том, чтобы иметь аналоговое значение.

Теперь вы заметите, что мы использовали две из доступных трех 3,3 рельсов ESP8266. Возможно, можно было бы разделить эти линии на несколько направлений, но я не инженер -электрик и понятия не имею, будет ли это TWOK, так что продолжайте с осторожностью.

Я также планирую обеспечить питание для 8266 через его USB -порт. Ваши планы могут быть разными, но я простой парень.

Написание программы

Таким образом, в качестве бонуса использования микропитона, мне не нужно писать C -код. Поскольку я буду иметь дело с сетевыми взаимодействиями и сбором данных, я очень доволен этим.

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

MicropyThon предлагает несколько необычных модулей, чтобы делать то, что мне нужно для сбора данных датчиков и сетевой связи. Бинарник для 8266 также включает в себя функции, которые можно легко заселить в сеть. Я рекомендую потратить некоторое время в Reply через последовательную ссылку, когда вы сначала проткнули свой двоичный файл, чтобы чувствовать себя комфортно с доступными функциональными возможностями.

Подключение к сети

Возможно, это мясо и картофель ESP8266, и почему вы используете его в первую очередь: чертовски 2,4 ГГц Wi -Fi. MicropyThon знает об этом и внедряет быстрые инструкции по подключению в помощь( ) Функция, доступная из Repl, и их документы включают эту функцию:

def do_connect():
    import network
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)
        sta_if.connect('', '')
        while not sta_if.isconnected():
            pass
    print('network config:', sta_if.ifconfig())

Эта функция, когда вы вызываете из вашей программы, будут блокировать выполнение до тех пор, пока 8266 не подключается к сети Wi -Fi с указанным паролем.

Я немного изменил это, чтобы моргнуть встроенный светодиод на моей плате во время подключения, поэтому я могу получить приблизительное представление о состоянии устройства. ( Странная примечание: По какой -то причине, led.on () выключит светодиод, а led.off () включит его. Не знаю почему.) Вы также отметите, что я вытягиваю имя сети и пароль в переменные, которые я загружаю из файла конфигурации:

def do_connect():
    global led_state
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)
        sta_if.connect(NETNAME, NETPASS)
        while not sta_if.isconnected():
            if led_state:
                status_led.on()
                led_state = False
            else:
                status_led.off()
                led_state = True
            time.sleep(0.25)
    print('network config:', sta_if.ifconfig())
    status_led.off()

Видеть? Хороший и безболезненный. (Разве ты не рад, что это не С?)

Подключение к датчикам

Датчики DHT

Правильно, так что вы связаны с Wi -Fi. Вы еще не говорите ни с чем в сети, но это нормально, мы приедем к этому позже.

Бинарник из микропитона, который мы используем, включает библиотеку для использования датчиков DHT, поскольку они, очевидно, безумные популярные. У меня есть DHT11, который немного дешевле и имеет отвратительно большие ошибки в чтениях (2 градуса C!). DHT22 немного дороже (DHT11 составляет ~ 2 долл. США/за, DHT22 составляет ~ 3,5 долл. США/за), но более точный, за счет того, как часто вы можете читать с датчика. Мы тоже приедем к этому.

Итак, подключить датчики DHT глупо. Мы втягиваем модуль машины, чтобы получить доступ к аппаратному штифту, и модуль DHT, чтобы общаться с тем, что находится на этом PIN:

d = dht.DHT11(machine.Pin(5))

Вау, это было легко.

Теперь, Важное примечание: Номер, который вы передаете на машину. PIN -код – это число из 8266 PIN , не какую -либо удобную доску, которую вы используете. Обратите внимание на свои диаграммы распины, если у вас проблемы с подключением датчика.

В любом случае, теперь, когда у нас есть этот объект DHT11, мы можем сказать ему измерение:

d.measure()

Что обновляет эти значения:

d.temperature(); d.humidity();

Другое примечание, на DHT11, вы можете позвонить в меру только раз в секунду или около того. На DHT22 вы можете читать только раз в две секунды. Я не знаю, почему это конкретно, или каковы последствия не подчиняются этому. Опять же, используйте осторожность, если вы раскрашиваете вне линий.

Датчик влажности почвы

Как я упоминал ранее, датчик влажности почвы-как мы его подключили-получили аналоговый сигнал. Мы собираемся попросить ESP8266 интерпретировать этот сигнал как цифровое значение.

Здесь мы делаем объект ADC из этого PINE: Python

adc = machine.ADC(0)adc.read()

adc.read () даст значение от 0 до 1024. По -видимому, 1024 означает «сухой», а «0» означает «более влажная, чем вода», так как я сунул датчик в чашке воды и получил только чтение чего -то вроде 300. Я не знаю, почему это так, но это так. Используйте как хотите.

Сетевая коммуникация

Итак, у нас есть наши данные, мы подключены к Wi -Fi, теперь нам нужно взять данные из микроконтроллера, на котором мы находимся, и засунуть их где -то полезно. Микропитон включает сокет модуль, который ведет себя так же, как нормальный модуль в [macro]? Python. В моем коде у меня есть IP -адрес и порт приложения сервера, записанные в файле конфигурации, и поэтому мы открываем сокет и начинаем забивать данные:

socket_connected = False

while True:

    while not socket_connected:
        try:
            s = socket.socket()
            s.connect((SERVIP, SERVPORT))
            s.send("Initializing link...\n")
            socket_connected = True
        except OSError:
            print("Socket connection failed... waiting.")
            # pulse LED to indicate problem
            status_led.on()
            time.sleep(0.1)
            status_led.off()
            time.sleep(0.1)
            status_led.on()
            time.sleep(0.1)
            status_led.off()
            time.sleep(0.1)
            status_led.on()
            time.sleep(0.1)
            status_led.off()

    status_led.on()
    d.measure()
    msg = "Soil: " + str(adc.read()) + "; temp: " + str(d.temperature()) + "; hum: " + str(d.humidity()) + "; from " + mac + "\n"
    print(msg)
    try:
        q = s.send(msg)
    except OSError:
        socket_connected = False
    print("Sent ", q, " bytes.")
    status_led.off()
    time.sleep(2)

Пройдя через это:

Мы переходим в вечный цикл, поэтому мы собираем и передадим данные до конца времени.

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

(Мне нужно обновить этот код, чтобы также проверить и убедиться, что у нас все еще есть ссылка Wi-Fi-нет точки, пытаясь передать данные, если мы все равно не подключены.)

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

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

Я также добавляю MAC -адрес этой платы, чтобы я мог определить, от какого датчика поступают показания, когда я на сервере. Я получаю MAC -адрес с этой строкой. который я украл Отсюда :

mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()

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

Сон в конце дает датчик температуры на момент восстановления и дает нам разумную скорость потока данных.

Итак, с этим, у вас есть датчик окружающей среды микроконтроллера, который может отправлять данные по сети!

Вы можете просмотреть весь код моего проекта Здесь Анкет

Оригинал: “https://dev.to/bocajnotnef/intro-to-working-with-with-esp8266-3bno”