0基础 不懂单片机一类的。目前因为摄影需求。想做一个自动快门线。经过一番了解知道了了esp8266这个东西。但是因为对编程啥都不懂,尝试看了几天教程。。实在头大!打算用esp8266接继电器控制3根快门线的通断。又了解了相机的快门线,就是3根线
地线 引脚1 引脚2 引脚1接地(相当于半安快门)就对焦 然后再把引脚2也接地(3根线接一起)就释放快门 1‘2号线都对地(相当于按下快门)的时候 相机会释放快门并且收回 但是在B门模式的时候 1·2号线接地后 快门释放直到1.2号线都与地线断开后才会收起快门。设想:通过esp8266 控制2个引脚电平 实现相机快门的对焦和拍摄。
普通延时拍摄时:esp8266控制1号引脚(假设接对焦线)对焦 然后延时30毫秒(给镜头对焦时间)然后控制2号引脚释放快门 中间延时1分钟(可以在手机上或者web页面中设置这个延时值)重复上面的动作。总结:也就是esp8266延时循环 控制1号 和 2号引脚输出高电平 之后通过继电器控制快门线的相应接通实现对焦拍摄功能!而两张延时照片中间的 延时时间可以在web界面或者手机中自己设定。B门长时间曝光模式:esp8266控制—1号引脚对焦 —延时30毫秒—控制2号引脚释放快门(因为在B门模式快门释放后不会自动收回,断开1·2号引脚的高电平后才会收回快门)—延时曝光时间(web中设置)—控制1·2号引脚输出低电平总结:与上面普通延时拍摄相比,就是普通延时拍摄 相机会在快门释放后自动收回快门。 而B门长曝光模式,相机释放快门后(相当于按下快门键)后等到1.2号引脚和地断开后(相当于松开快门键)才会收回快门。 按下与松开快门之间的这段时间需要手动设定。
哪位大哥能帮忙写下这个功能呢!或者指导下小弟呀!对单片机基本是一窍不通。买的这种全IO引出的!
官方固件需要勾选写什么功能呢?感谢坛友elecfunwb的耐心指导,以上功能已基本实现。期间遇到各种基本语法性问题 耽误了很多时间。 如果要直接用下面代码,请注意自己的模块io口默认情况是拉高还是拉低了的。如果出现该关的时候变成开了 就请调换下面代码中的low与HIGH的位置。 wifi.setmode(wifi.STATION)
wifi.sta.config("WiFi名字","密码")--你家里的路由或者手机开热点让模块链接。
print(wifi.sta.getip())
led1 = 12
led2 = 04 --这个是模块的io口号码,你看看你买的模块上面有哪些口可以已用知己改后面的号码。
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
gpio.write(led1, gpio.HIGH)
gpio.write(led2, gpio.HIGH)
local a
if (srv~=nil) then
srv:close()
end
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on("receive", function(client,request)
local buf = ""
print(request)
local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP")
if(method == nil)then
_, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP")
end
local _mode, _time, t
if (vars ~= nil)then
_, _, _mode, _time = string.find(vars, "(%w+)=(%d+)&*")
end
if(_mode == "m1")then
_, _, a = string.find(vars, "&*ZS=(%d+)")
t=_time*1000
print(t,a)
print("mode1")
tmr.stop(0)
tmr.alarm(0,t,1,AlarmMode1)
elseif(_mode == "m2")then
print("mode2")
t=_time*1000
tmr.stop(0)
gpio.write(led1, gpio.LOW)
tmr.delay(1000000)
gpio.write(led2, gpio.LOW)
tmr.alarm(0,t,0, function()
gpio.write(led1, gpio.HIGH)
gpio.write(led2, gpio.HIGH)
end
)
elseif(_mode == "stop")then
print("stop")
tmr.stop(0)
gpio.write(1, gpio.HIGH)
gpio.write(2, gpio.HIGH)
end
buf = buf.."<h1> Hello, NodeMcu.</h1>"
buf = buf.."延时<form><input type=\"text\" name=\"m1\" value=\"1\" pattern=\"[0-9]{2,4}\">秒 <input type=\"text\" name=\"ZS\" value=\"\" pattern=\"[0-9]{1,4}\">张 <input type=\"submit\" value=\"延时\" ></form>"
buf = buf.."<form><input type=\"text\" name=\"m2\" value=\"2\" pattern=\"[0-9]{1,4}\">秒 <input type=\"submit\" value=\"B门\" ></form>"
buf = buf.."<form><dir style=\"display: none;\"><input name=\"stop\" value=\"1\"></dir><input type=\"submit\" value=\"停止\" ></form>"
client:send(buf)
end)
conn:on("sent", function (c) c:close() end)
end)
function AlarmMode1()
gpio.write(led1, gpio.LOW)
tmr.delay(1000000)
gpio.write(led2, gpio.LOW)
tmr.delay(1000)
gpio.write(led1, gpio.HIGH)
gpio.write(led2, gpio.HIGH)
a=a-1
print(a)
if(a==0)then
tmr.stop(0)
end
end
模块上面就只需要,刷nodemcu 然后将上面的代码保持为init.lua文件 烧录到模块中去就行了(注意骚绿位置)
然后外部电路很简单 我就口述一下就行了。。
两个光耦串联,输入端(接模块一端)中间通过电阻接正极 两边分别接led1和led2对应的引脚 然后光耦另一边 同样窜连 中间接快门线的地线 两边分别接对焦线与快门释放线(对应关系请自己测试,就两根线不对就换一下)
就这样,我还没动手做外部电路。。不过应该没问题吧!光耦不行大不了换三极管或者续电器来触发快门线。
[ 此帖被handsome在2018-03-31 21:46重新编辑 ]