Arduino IDE用于nodemcu ESP8266模块程序。
-
下载最新版本的Arduino IDEhttps://www.arduino.cc/en/main/software
-
使用ESP8266 Arduino IDE按照下面给出的步骤,
-
开始Arduino和打开选项窗口。
-
进入<strong>“http://arduino.esp8266.com/staging/package_esp8266com_index.json</strong>”到额外的董事经理URL字段。
-
开董事会经理从工具>板菜单和安装ESP8266平台
-
选择nodemcu 1(ESP 12e模块)从工具>板菜单板安装后
-
由Markus Sattler素描>安装WebSockets图书馆包括图书馆>管理图书馆
-
请参阅下面的链接开始Arduino IDE ESP8266
https://github.com/esp8266/arduino
-
从提供的链接下载源代码,https://github.com/agkonale/multichannel-wireless-dimmer/tree/master/arduino
-
源包含以下文件
-
trailing_edge_dimmer_v5.ino
-
调光器,H
-
hw_timer C。
-
hw_timer。H
-
使用长延迟非常气馁而使用ESP8266作为许多代码需要运行在芯片上除了素描当WiFi连接可能会导致频繁的WDT复位。因此我们使用hw_timers拯救自己从这困境。
-
这个hw_timer。C、H hw_timer。文件提供必要的功能,使用硬件定时器在ESP8266。
-
<strong>hw_timer_init</strong>(frc1_timer_source_type source_type,U8 REQ)函数初始化定时器ESP8266,如果请求的说法是0定时器将开始在非汽车荷载模式还将启动自动加载模式。
-
调光器,H
包括必要的库文件。
#包括<< esp8266wifi。H >
#包括<< wificlient。H >
#包括<< esp8266webserver。H >
#包括<< esp8266mdns。H >
#包括<< esp8266httpupdateserver。H >
#包括<< Arduino。H >
#包括<< websocketsserver。H >
#包括<<哈希。”<BR>
接下来我们定义的<strong>调光模块性能</strong>。
#定义num_channels 2
#定义zero_crossing_int_pin 12
#定义三角4 / /(t_zero_crossing - t_interrupt)/ step_time
#定义step_time 78 / 128 lvls(美国)(65为50 Hz)
/ / 128级亮度控制
int dimming_lvl [ num_channels ] = { 0 };//(0-127)
int drive_pin [ num_channels ] = {个};
int状态[ num_channels ] = { 0 };
/ WiFi接入点设置
字符串SSID =“-----------”;
字符串密码=“-----------”;
挥发性布尔都处理了[ num_channels ] = { 0 };
<strong>num_channels</strong>可以按你的需要增加,但你会在需要的地方进行必要的重复。(这样的设计可扩展到2多个频道!!)
<strong>step_time</strong>定义时间间隔的定时器中断服务程序反复调用。它的计算公式如下:
step_time:1 /(2 *频率* numlvls)×10 ^ 6
默认:
频率为50赫兹numlvls = 128
SSID:网络SSID
密码:网络密码
<strong>drive_pin</strong>:阵列组成的针数的nodemcu(请使用正确的密码)<strong>zero_crossing_int_pin</strong>:中断引脚
<strong>三角洲</strong>:可能有一些固定的失配之间实际的零和中断,这是除去这个常数。
—
—
接下来我们添加一个连接ESP8266模块的WiFi接入点。
国际connecttowifi()
{
WiFi。开始(SSID。c_str(),密码。c_str());
int i = 0;
而(!= wl_connected)
{
如果(我= = 30)
{
返回1;
}
延迟(1000);
debug_print(“。”);
我+ +;
}
debug_println(“”);
debug_println(“连接”);
debug_println(SSID);
debug_println(“IP地址”);
debug_println
—
—
现在开始的WebSocket连接<strong>websocketconnect()</strong>函数定义。
/ / WebSocket连接
无效websocketconnect()
{
WebSocket。begin();
WebSocket。事件(websocketevent);
—
—
<strong>zero_crossing_int()</strong>是ISR连接到zero_crossing_int_pin检测过零点。
无效zero_crossing_int()
{
如果(numactivechannels > 0){
numhandled = 0;
为(int i = 0;i < num_channels,我+ +)
{
都处理了[我] = 0;
如果(状态[我] = = 1)
{
digitalwrite(drive_pin [我],高);
} }
—
—
<strong>dimtimerisr()</strong>是定时器中断服务程序所服务的每一step_time useconds。我们保持计数器每个活动通道和比较/更新他们的每一个周期。
无效dimtimerisr()
{
如果(zero_cross = = 1)
{
为(int i = 0;i < num_channels;i++)
{
如果(状态[我] = = 1)
{
如果(lvl_counter [我] > dimming_lvl [我] +三角)
{
digitalwrite(drive_pin [我],低);
lvl_counter [我] = 0;
都处理了[我] = 1;
numhandled + +;
如果(numhandled = = numactivechannels)
{
zero_cross = 0;} }
else if(都处理了[我] = = 0)
{
lvl_counter [我]
—
—
<strong>管理状态</strong>(开/关)的通道下面的函数定义。
无效update_state(int on_off,int channel_number)
{
如果(国家[ channel_number ] = = 0和on_off = = 1)
{
numactivechannels + +;
}
else if(状态[ channel_number ] = = 1和on_off = = 0)
{
numactivechannels --;
}
[ channel_number状态
—
—
<strong>websocketevent()</strong>功能开发的通信协议之间的ESP8266和客户。
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length)
{
switch (type) {
case WStype_DISCONNECTED:
break;
case WStype_CONNECTED:
{
IPAddress ip = webSocket.remoteIP(num);
lastChangeTime = millis();
isSynced = 0;
DEBUG_PRINTLN(ip);
}
break;
case WStype_TEXT:
{
String text = String((char *) &payload[0]);
lastChangeTime = millis();
isSynced = 0;
if(text.startsWith("a"))
{
String aVal=(text.substring(text.indexOf("a")+1,text.length()));
int Lvl_0 = aVal.toInt();
Dimming_Lvl[0] = Lvl_0;
DEBUG_PRINTLN(Lvl_0);
}
if(text.startsWith("b"))
{
String bVal=(text.substring(text.indexOf("b")+1,text.length()));
int Lvl_1 = bVal.toInt();
Dimming_Lvl[1] = Lvl_1;
DEBUG_PRINTLN(Lvl_1);
}
if(text=="ON_0")
{
Update_State(1,0);
debug_println(“通道0!!”);}
如果(文= =“off_0”)
{
update_state(0,0);
digitalwrite(drive_pin [ 0 ],
debug_println(低)!!”);}
如果(文= =“on_1”)
{
update_state(1,1);
debug_println(”!!”);}
如果(文= =“off_1”)
{
update_state(0,1);
digitalwrite(drive_pin [ 1 ],
debug_println(低)!!”);} } //
WebSocket。sendtxt(num,有效载荷长度);
/ WebSocket。broadcasttxt(有效载荷长度);
打破;
案例wstype_bin:
hexdump都(载荷、长度);
/ WebSocket。sendbin(num,有效载荷长度
—
—
timer_init()功能:
icache_flash_attr timer_init虚空(void)
{
/ frc1_source / nmi_source
hw_timer_init(frc1_source,1);
hw_timer_set_func(dimtimerisr);
hw_timer_arm(step_time
-
trailing_edge_dimmer_v5.ino文件
#包括“hw_timer。H”
#包括“暗淡。”
无效setup()
{
系列。开始(115200);
pinmode(zero_crossing_int_pin,输入);
为(int i = 0;i < num_channels,我+ +)
{
pinmode(drive_pin [我],输出);<BR> digitalwrite(drive_pin [我],低);
}
connecttowifi();
websocketconnect();
mdnsconnect();
httpupdateconnect();
nointerrupts();
timer_init();
attachinterrupt(zero_crossing_int_pin,zero_crossing_int,上升);
interrupts();
}
无效loop()
{
如果!
(责任编辑:admin)