суббота, 1 октября 2016 г.

ESP8266. Работа "вечного" Wi-Fi логгера на солнечную панель из... аморфного кремния

С целью снижения себестоимости автономного гаджета решил уменьшить общую емкость ионисторов Green-Cap, в связи с чем пришлось соответственно изменить режим "работа-сон" SoC-чипа ESP8266 с двух минут сна до 5-ти (все равно температура на улице достаточно инерционный параметр), а также количество попыток подключения к домашней Wi-Fi точке доступа с 6-х до 3-х. В итоге аптайм системы в рабочем режиме доведен до 630-730 мс (0.7 сек). В качестве корпуса конечного устройства идеально подошел конструктив садового фонаря (где места хоть "конем гуляй") из местного магазина хозтоваров. Дополнительным бонусом стали подоспевшие из китая пластины из аморфного кремния 150х150 мм, которые ранее заказывал для экспериментов с альтернативным питанием при плохой погоде. Особенность их в том, что несмотря на более низкий КПД (порядка ~10%) по сравнению с КПД поли- и монокристаллических модулей (22-25% при сроке эксплуатации 20-30 лет и 20% потере первоначальной мощности), этот тип солнечных панелей идеально подходит под нашу пасмурную погоду с тучками, особенно в осенне-зимний период. И это вовсе не блаж, СЭС на аморфном кремнии построены и работают в промышленном масштабе, доказав свою эффективность. Например подобная гибридная есть в Токмаке...

Так вот, не растекаясь мыслию по древу, для теста возьмем 4 последовательно включенных солнечных элемента по 0.5В и подключим на вход Step-UP DC-DC. Вы можете резонно отметить: "проще же поднимать этим бустером напряжение до рабочего после ионисторов, ведь по мере расходования заряда оно падает". Все так, однако данный повышающий DC-DC немало кушает на холостом ходу, порядка 12 мА, что, согласитесь, для автономного устройства непозволительная роскошь в темное время суток. Днем же у нас избыток солнечной энергии и ее с лихвой хватает как для работы преобразователя, так и заряда ионисторов. Схема "вечного" Wi-Fi логгера модифицирована следующим образом:


GPIO16, генерирующий аппаратный сброс модуля A1 (Hard Restart), объединен с RST модуля и подтянут на плюс питания через сопротивление порядка 10 кОм. Вход EN модуля A1 подтянут на плюс питания, аналогично линиям ввода-вывода GPIO0, GPIO2. Для входа в режим программирования по входу GPIO0 опционально установлена кнопка S1, подтягивающая его к нулевому уровню (общему проводу). Если вы используете версию модуля ESP выше 1-й, то GPIO15 следует подключать к общему проводу.

Также были добавлены:
  1. Диод Шоттки VD3 для предотвращения протекания обратного тока и разряда ионисторов через светодиод индикации работы DC-DC.
  2. Токоограничивающее сопротивление R2 порядка 51 Ом для ограничения нагрузки бустера разряженными ионисторами (дело в том, что в разряженном состоянии ионисторы дают практически КЗ по выходу преобразователя, при напряжении 3.3 В ток будет ограничен величиной порядка 64 мА).
  3. Супервизор DA2, запрещающий старт модуля A1 нулевым уровнем при напряжении питания менее 2.9 В и устраняющий зависание* чипа ESP8266 при медленном заряде ионисторов. 
* Что интересно, эффект зависания проявляется в основном при напряжении питания, близком к диапазону 2.8...2.9 вольт, но при этом модуль вполне себе работоспособен на участке ниже - от 1.75 (ниже 2.4 перестает работать внешний датчик DS18) до 2.75 вольт (что подтверждается трендами в режиме 24х7 в течении нескольких месяцев). Мы специально не использовали RESET модуля супервизором, так как этот вход уже задействован аппаратным сбросом с GPIO16, в то же время во время Hardware Reset резко увеличивается потребление модуля, а это потери драгоценной энергии.
По меньшей мере правильно было бы зашунтировать еще каждый элемент солнечной батареи тем же Шоттки при затенении одного из них, но панель малогабаритна по площади и отдаваемая мощность столь мизерна, что необходимости в этом нет.

Конструктив

Монтаж, конкретно для модуля ESP-12-E, выполнен с использованием SMD компонентов с обеих сторон печатной платы прямо на внешних контактных площадках:



Конструктив садового фонаря к тому же дает возможность в будущем смонтировать индикатор направления воздушных масс, а возможно и скорости ветра (движок вероятно возьму из CD-ROM):




Программная модификация

Касаетcя как части скрипта инициализации 'init.lua':
-- sleep us = 300 sec
COUNTSLEEP = 300000000
-- откл WLAN
wifi.sta.disconnect()
wifi.sta.autoconnect(0)
-- registr = 3, pin - GPIO0 na plus optron cherez 1 kOm
dpin=3
gpio.mode(dpin, gpio.OUTPUT);
gpio.write(dpin, gpio.HIGH);
-- GPIO2 (используем для настройки, подтянут к 1)
tpin=4
gpio.mode(tpin,gpio.INPUT,gpio.PULLUP)
-- читаем ADC до активации коннекта (вызывает сброс после)
wifi.sta.disconnect()
wifi.sta.autoconnect(0)
u=adc.readvdd33()/1000
print("U="..u)

print("Setting up Wi-Fi...")
wifi.setmode(wifi.STATION)
wifi.sta.config("SSID","pass")
wifi.sta.connect()
local cnt=0

tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip()==nil then
print("IP unavaiable, Waiting...")
cnt = cnt + 1
if (cnt > 3) then
tmr.stop(1)
-- откл WLAN
wifi.sta.disconnect()
wifi.sta.autoconnect(0)
print("Sleep 300 sec down...")
node.dsleep(COUNTSLEEP)
end
else
tmr.stop(1)
print("Config done, IP is "..wifi.sta.getip())
dofile("httpsender.lua")
collectgarbage()
end
end)
так и скрипта отправки данных на удаленный сервис и перехода в режим сна 'httpsender.lua':
local t={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} -- список датчиков
-- 0- температура на улице
-- 1- температура картошки
-- 2- температура в комнате
-- 3- температура на кухне

local APIKEY1="bla-bla" -- ключ на первые 8-датчиков
local APIKEY2="bla-bla-bla" -- ключ на вторые 8-датчиков
local r=tmr.now()
local g=gpio.read(dpin)


function reads18b20()
ds=require('ds18b20')
ds18b20.setup(tpin) -- GPIO2 ds18b20
adr=ds18b20.addrs()
n=table.getn(adr) -- кол-во датчиков
print("DS18B20 found: "..n.."\n")
for i=0, n-1, 1 do -- заполнение данными
t[i]=ds18b20.read(adr[i+1])
end
ds=nil
end

function msleep()
print("Sleep 300 sec down...")
node.dsleep(COUNTSLEEP)
end


function sendData2()
-- conection to thingspeak.com
print("Sending data to thingspeak.com")
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com
conn:connect(80,'184.106.153.149')
conn:send("GET /update?key="..APIKEY2.."&field1="..t[8].."&field2="..t[9].."&field3="..t[10].."&field4="..t[11].."&field5="..t[12].."&field6="..t[13].."&field7="..t[14].."&field7="..t[15].." HTTP/1.1\r\n")
conn:send("Host: api.thingspeak.com\r\n")
conn:send("Accept: */*\r\n")
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:on("sent",function(conn)
print("Closing connect")
conn:close()
end)
conn:on("disconnection", function(conn)
print("Disconnect thingspeak...")
msleep()
end)
end


function sendData()
-- conection to thingspeak.com
print("Sending data to thingspeak.com")
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com
conn:connect(80,'184.106.153.149')
conn:send("GET /update?key="..APIKEY1.."&field1="..t[0].."&field2="..t[1].."&field3="..t[2].."&field4="..t[3].."&field5="..t[4].."&field6="..t[5].."&field7="..t[6].."&field7="..t[7].." HTTP/1.1\r\n")
conn:send("Host: api.thingspeak.com\r\n")
conn:send("Accept: */*\r\n")
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:on("sent",function(conn)
print("Closing connect")
conn:close()
end)
conn:on("disconnection", function(conn)
print("Disconnect thingspeak...")
sendData2()
end)
end


reads18b20() -- fix предварительное чтение

-- Wait 2000 ms for Init DS18B20 and last send to thingspeak
tmr.alarm(0, 2000, 1, function()
tmr.stop(1)

reads18b20()
for i=0, 15, 1 do
if t[i]==nil then -- fix отсутствия датчиков
print("DS18B20-N"..i.." not connected\n")
t[i]=0
else print("Temperature-"..i..": "..t[i].." C\n") end
end

sendData()
end)
Обратите внимание:
  1. Добавлена возможность чтения нескольких датчиков DS18B20 на одной шине в локальный массив 't' и проверка их отсутствия перед отправкой данных. При возврате значения параметра 't[n]' как nil, выдаем в консоль диагностическую информацию, а на сервер передаем условный '0'.
  2.  Максимальное количество полей в сервисе thinkspeak для бесплатного аккаунта ограничено 8-ми, соответственно передать данные более этого количества за раз вы не сможете. В коде массив реализован с запасом для 16 датчиков на шине и для отправки всех значений понадобится создать два бесплатных аккаунта с 8-ю полями и своими API-ключами доступа (в нашем случае для тестов используется всего 4-ре параметра температуры, 1 параметр напряжения на ионисторах, 1 параметр статуса датчика типа "сухой контакт" и 1 параметр прошедшего времени активации).
  3. При подключении на одну 1-Wire шину более 8-ми датчиков, а также длины линии связи более двух метров, рекомендуем снизить подтягивающее сопротивление R8 до величины порядка 2.2 кОм для надежной работы.
Отчеты

Новый тренд Wi-Fi логгера во времени:

 
Видеообзор


Проекты на базе ESP8266
  1. Прозрачный мост UART/Wi-Fi --- Wi-Fi/UART на базе ESP8266 на Lua 
  2. Wi-Fi лампа. Контроль DIO модуля ESP-01 (ESP8266) по Wi-Fi  
  3. Монтаж мезонином прозрачного моста Wi-Fi-UART на ESP8266
  4. Автономный датчик температуры по Wi-Fi на базе ESP8266
  5. Аномальная разрядная кривая ионисторов проекта "вечный" Wi-Fi логгер. Луна однако
  6. Работа "вечного" Wi-Fi логгера на солнечную панель из... аморфного кремния 
  7. #ESP.Meteo: Wi-Fi логгер с автономным питанием в Twitter-e  
  8. Вывод отладочной информации с ESP-12 на дисплей SSD1306
  

2 комментария:

  1. Интересный проект, главное "an exclusive", такой не найти в интернете, спасибо за информацию, думаю повторить...

    ОтветитьУдалить

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.