ESP8266/NodeMCU Lua

Тема в разделе "Arduino & Shields", создана пользователем Securbond, 26 мар 2016.

  1. Bubastic

    Bubastic Нерд

    цифры резисторов делителя взяты уже из даташита.
     
    ИгорьК нравится это.
  2. Securbond

    Securbond Гуру

    Оставлю тут для себя, что бы не потерять.
     

    Вложения:

    • LuaTutorial.zip
      Размер файла:
      9,5 КБ
      Просмотров:
      387
  3. Securbond

    Securbond Гуру

    6.Скрипт отправки сообщений на e-mail (gmail.com)
    *почти бесполезен, так как съедает практически всю память ESP8266
    Пришло в голову слать сообщения на e-mail если вдруг рухнет локальный сервер дома.
    Ночь посидел в поисках решения проблемы, примеры в интернете одни и те же и да же их пришлось допиливать до рабочего состояния. Представляю рабочий код скрипта... с моими комментариями.
    Код (Lua):
    local MY_EMAIL = "pupkin@gmail.com" -- ваш ящик на gmail.
    local MY_EMAIL_B64 = encoder.toBase64("pupkin@gmail.com")  -- перевод в двоичную систему Base64
    local EMAIL_PASSWORD_B64 = encoder.toBase64("1234567890") -- пароль от ящика

    local SMTP_SERVER = "smtp.gmail.com"
    local SMTP_PORT = "465"

    -- Адрес на который будем слать сообщения
    local mail_to = "yandex@yandex.ru"

    -- These are global variables. Don't change their values
    -- they will be changed in the functions below
    local email_subject = ""
    local email_body = ""
    local count = 0


    local smtp_socket = nil -- will be used as socket to email server

    function display(sck,response)
         print(response) -- Вывод ответа SMTP сервера в консоль
    end

    -- Функция do_next () используется для отправки SMTP-команд на SMTP-сервер в необходимой последовательности.

    function do_next()
                if(count == 0)then
                    count = count+2  ---  !!!!!!  Заменить на 1 и раскомментировать 3 строки ниже, если используете "STARTTLS" (требуется в некоторых почтовых сервисах)
                    local IP_ADDRESS = wifi.sta.getip()
                    smtp_socket:send("HELO "..IP_ADDRESS.."\r\n")
      --          elseif(count==1) then
      --              count = count+1
      --              smtp_socket:send("STARTTLS\r\n")
                elseif(count==2) then
                    count = count+1
                    smtp_socket:send("AUTH LOGIN\r\n")
                elseif(count==3) then
                    count = count + 1
                    smtp_socket:send(MY_EMAIL_B64.."\r\n")
                elseif(count==4) then
                    count = count + 1
                    smtp_socket:send(EMAIL_PASSWORD_B64.."\r\n")
                elseif(count==5) then
                    count = count+1
                   smtp_socket:send("MAIL FROM:<" .. MY_EMAIL .. ">\r\n")
                elseif(count==6) then
                    count = count+1
                   smtp_socket:send("RCPT TO:<" .. mail_to ..">\r\n")
                elseif(count==7) then
                    count = count+1
                   smtp_socket:send("DATA\r\n")
                elseif(count==8) then
                    count = count+1
                    local message = string.gsub(
                    "From: \"".. MY_EMAIL .."\"<"..MY_EMAIL..">\r\n" ..
                    "To: \"".. mail_to .. "\"<".. mail_to..">\r\n"..
                    "Subject: ".. email_subject .. "\r\n\r\n"  ..
                    email_body,"\r\n.\r\n","")
               
                    smtp_socket:send(message.."\r\n.\r\n")
                elseif(count==9) then
                   count = count+1
                     tmr.stop(0)
                     smtp_socket:send("QUIT\r\n")
                else
                   smtp_socket:close()
                end
    end

    function connected(sck)
        tmr.alarm(0,3000,1,do_next) -- пауза между отправками запросов на сервер
    end

    function send_email(subject,body) -- функция принимает два значения
         count = 0
         email_subject = subject -- тема письма
         email_body = body  -- стринг тела письма
         smtp_socket = tls.createConnection(net.TCP) -- применяется соединениt TLS при поддержке в случае обычного соединения
                                                     -- заменить на  net.createConnection(net.TCP)
         smtp_socket:on("connection",connected)
         smtp_socket:on("receive",display)
         smtp_socket:connect(SMTP_PORT,SMTP_SERVER)
    end

    -- Функция отправки почтового сообщения
    send_email(
    "Милый дом",
    [[Привет,
    В Богдаде всё спокойно, все ваши железяки работают в штатном режиме!
    Всегда Ваш,
    Wemos ))
    ]]
    )
     

    И даже в таком виде, скорее всего у вас ничего не заработает !!!
    0. Подразумевается что у Вас уже подключен WiFi и осуществляется его проверка, если нет, нужно обязательно добавить в скрипт!
    1. Для использования Base64 нужен модуль encoder (но можете попробовать сразу перевести данные через любой доступный онлайн сервис в Base64 и подставить в скрипт.)
    2. Для защищенного подключения обязательно при сборе прошивки ставьте галку TLS/SSL.
    3. Разные сервисы предъявляют разные требования к отправке, по этому внимательно читайте пояснения в коде, там всё есть!
    4. И самое главное. Gmail блокирует отправку с неизвестных источников типа ESP8266, и необходимо в настройках аккаунта снять это ограничение в настройках безопасности. По этому крайне рекомендую не использовать для этих целей основной ящик, а завести дополнительный !!!
     
    Последнее редактирование: 4 сен 2018
    Mitrandir и ИгорьК нравится это.
  4. Securbond

    Securbond Гуру

    Модуль отправки на e-mail рабочий, но для использования его в своём проекте нужно немного поломать голову.
    Проблема в том, что он прожорлив в плане оперативной памяти и в большом проекте выдаёт ошибку нехватки памяти. + к этому нужно делать флаги и останавливать работу других сетевых протоколов, на время передачи сообщения, иначе модуль выпадет в fatal error :D. Я далёк от познания дзена LUA, Надеюсь что мастер Йода - ИгорьК поможет нам допилить этот модуль до рабочего состояния и победить тёмную сторону силы.
     
  5. ИгорьК

    ИгорьК Гуру

    Смотри сюда: http://forum.amperka.ru/threads/esp...-мониторинг-и-mqtt-брокер-сигнализация.13672/

    Там ESP32 боролась с Телеграм по ssl и победила его. Однако, сколь-нибудь приемлемую железку сделать не удалось - шифрованный протокол жрет памяти немеряно. И это - ESP32, не чета ESP-8266.

    Еще оно здесь есть: http://forum.amperka.ru/threads/esp...-or-pushover-temerature-movement-siren.15124/

    Собственно, если задача отправлять письма любимой - без вариантов надо мучить почту. А если надо быстро доставить информацию, я варианты привел.
     
    Securbond нравится это.
  6. ИгорьК

    ИгорьК Гуру

    Смотри, направление для поиска.

    Есть память https://nodemcu.readthedocs.io/en/latest/en/modules/rtcmem/ rtcmem
    Туда можно писать данные и читать их - при программной перезагрузке они ДОЛЖНЫ (по крайней мере так было раньше) сохраняться.

    Таким образом, если в init.lua читать данные из памяти, то можно выбирать варианты загрузок.
    Если надо отправить письмо - втыкаем нужную цифру в rtcmem и перезагружаемся программно.
    init, прочитав, загружает голый модуль отправки письма. После отправки - повторяем операцию перезагрузки в рабочем варианте.

    Если (смотрю описание сейчас) программная перезагрузка трет данные - задействуем режим отправки в сон на секунду, например.
    В общем, для "поковыряться" - простор.
     
  7. Securbond

    Securbond Гуру

    Уже подумал об этом. Осталось реализовать :confused:
     
  8. panda-pod

    panda-pod Нерд

    Добрый день. получил esp8266, прошил, правда с параметром 0х000000, датчик ds18b20 и bme280 рядом лежат. Простой датчик температуры правильно подключил с резистором.
    Далее иду в ESPlorer, нашел проектик для простого ds18b20 на народный мониторинг, 4 файла залил (настройки wifi, отправка на narodmon, библиотека ds18b20, инит), все работает, все отлично.
    но стоило полезть искать вариант кода для bme280 я просто растерялся, все криво и косо и не работает, то ругается на запятые, то просто говорит что не видит массива bme280. Был хороший вариант, но почему-то в консоле постоянная ругань, что памяти нет свободной, как не пытался компилировать, не выходит. подскажите, пожалуйста, где взять рабочую библиотеку или что я не так делаю?(
     
  9. ИгорьК

    ИгорьК Гуру

    О как! Давно ищу что попроще, ссылкой не поделитесь?
     
    panda-pod нравится это.
  10. panda-pod

    panda-pod Нерд

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

    ИгорьК Гуру

    Нет у меня такого датчика. DS18b20 есть, HIH4000 есть, DS2438 есть, а BME280 - нет. DHT-xx датчиками не считаются.
     
  12. panda-pod

    panda-pod Нерд

     

    Вложения:

    • nm.zip
      Размер файла:
      2,1 КБ
      Просмотров:
      346
    ИгорьК нравится это.
  13. Securbond

    Securbond Гуру

    Уважаемый, вы пошивку с модулем BME280 собрали? Проверьте, датчик прекрасно работает..
     
  14. panda-pod

    panda-pod Нерд

    Код (C++):
    modules: adc,bit,bme280,ds18b20,file,gpio,i2c,mqtt,net,node,rtcmem,rtctime,spi,tmr,uart,wifi
     
    хватит?
    а датчик должен греться? сейчас припаял гребенку, чувствую как то тепло идет, а это целая батарея
     
  15. Securbond

    Securbond Гуру

    Нет, не греется, скорее всего вы что то не правильно подключили. Возможно что и датчик уже сдох...
     
  16. panda-pod

    panda-pod Нерд

    да) решил быстро изменить коммутацию и перепутал + и гнд)) ну ничего, исправил быстро, все работает исправно.
    немного изменился видимо синтаксис (когда прошивку собираешь на сайте nodemcu-build) немного переписал wifi код и исполнительный. Но теперь всё работает исправно, хочу успеть собрать всё в коробку и оставить на даче в выходные. всем спасибо, за участие
     
    Securbond нравится это.
  17. panda-pod

    panda-pod Нерд

    не знаете в чем может быть причина, подаю питание 5в на gnd и vin или на VU и gnd, диод моргает, но ничего не происходит. если же через micro-usb запитываю и от компьютера, то данные начинают отправляться. Есть ли какие то нюансы при запитывании не от usb?
     
  18. alp69

    alp69 Форумчанин

    Esp или nodemcu? Чем стыкуете порты (какой адаптер?).
    Выложите обе схемы подключения. 5 вольт для esp8266 (не nodemcu) без стабилизатора на 3,3 вольта это многовато...
     
  19. panda-pod

    panda-pod Нерд

    Nodemcu. Питаю от 5в. Нет у меня никаких адаптеров
     
  20. alp69

    alp69 Форумчанин

    Приведите схемы подключений. Из Вашего вопроса не совсем понятен порядок Ваших действий. В частности сложилось впечатление, что сначала подключается питание, а потом шнур в разъем micro-usb.
    Или Вы просто подключаете питание, а модуль ничего в эфир не отправляет? Но при этом при подключении micro-usb - все ОК? Если так, то замените блок питания на более мощный (гарантированно обеспечивающий не менее 2.0 ампер на выходе).