roc2

  • 2019-10-15
  • 发表了主题帖: 【零知ESP8266教程】快速入门9-根据光的变化控制声音

    上次我们已经做出可以发出声音的作品了,拓展一下,来控制我们的声音。这次我们使用一个新的元素——光敏电阻,当然也需要运用到我们第八课的知识哦! 本实验中使用的知识在很多电子制作中都是非常常见的,基于这一点可以制作出很多炫酷的作品,那么我们就一起来实现光照控制声音的效果。 一、工具原料 电脑,windows系统 零知ESP8266开发板 micro-usb线 光敏电阻1个 蜂鸣器1个 10KΩ 电阻1个 面包板一个+若干跳线 二、硬件连接     三、方法步骤 1、打开零知实验室软件开发工具,然后新建项目,输入以下代码: /** *    文件: 光控声音测试.ino *    作者: 零知 *    时间: 2019/05/29 19:11 *    说明: **/    int buzzerPin = 0;    int value = 0;//读取的光敏电阻的模拟数值    void buzzerOut(int value) {         //buzzer 以一定的频率进行输出                    digitalWrite(buzzerPin, HIGH);         delay(value);         digitalWrite(buzzerPin, LOW);         delay(value); }    // the setup routine runs once when you press reset: void setup() {     // put your setup code here, to run once:         pinMode(buzzerPin, OUTPUT); }    // the loop routine runs over and over again forever: void loop() {     // put your main code here, to run repeatedly:            //读取光敏电阻的模拟值         value = analogRead(A0);//光敏电阻连接到了A0模拟脚         if(value < 700)         {                 buzzerOut(value);         } } 2、按照之前的方式先【验证】,然后【上传】到开发板中。 四、成果展示 上面步骤成功完成后,当我们把光敏二极管盖住的时候,此时光线比较暗,声音就没有了,当我们打开手机电筒给它光照,就可以听到声音了,我们在不同的光照强度下就可以听到不同频率的声音。基于这个我们还可以用光控制其他各种模块。 开拓一下思维,让创意无处不在哦!

  • 2019-10-14
  • 发表了主题帖: 【零知ESP8266教程】快速入门8-读取模拟数值

    上次我们一起做了抢答器后,脑回路是不是特别快啦。这时候我们趁热打铁,思考一下。在前面我们一直使用的是数字引脚(比如:开发板上标注的D0、D1、D2等),但是很多情况下我们需要测量一个模拟量,比如读取某个变化的电压值,这时候就需要模拟引脚的功能了(如:A0),下面我们在电路中加入一个电位器,看看随着电位器的变化,读取到的模拟数值变化。 一、工具原料 电脑,windows系统 零知ESP8266开发板 micro-usb线 电位器 面包板一个+若干跳线 二、硬件连接 三、方法步骤 1、打开零知实验室软件开发工具,然后新建项目,输入以下代码: /** *    文件: 电位器测试.ino *    作者: 零知 *    时间: 2018/06/25 17:59 *    说明: **/    int value = 0;//读取的值    // the setup routine runs once when you press reset: void setup() {     // put your setup code here, to run once:         pinMode(LED_BUILTIN, OUTPUT);//设置板子上的LED灯引脚         Serial.begin(9600);//打开串口,可以在串口监视器中查看测量的数值 }    // the loop routine runs over and over again forever: void loop() {     // put your main code here, to run repeatedly:            value = analogRead(A0);         Serial.println(value);                    //读取一次后,我们让开发板上的LED灯闪烁一次,表示一次读取完成         digitalWrite(LED_BUILTIN, HIGH);         delay(80);         digitalWrite(LED_BUILTIN, LOW);         delay(80);                    //延时一会儿,让串口输出慢一点便于观察         delay(500); } 2、按照之前的方式先【验证】,然后【上传】到开发板中。 四、成果展示   上面步骤成功完成后,我们就可以看到预期的结果了,打开零知开发工具的【调试】,然后我们把电位器从开始调到最大,可以看到如下数据变化。 五、扩展 在上面我们读取的数值有些人可能比较迷惑,我们现在把这些原始模拟值转换为实际的电压值,编写如下代码: /** *    文件: 电位器测试.ino *    作者: 零知 *    时间: 2019/05/28 17:59 *    说明: **/    int value = 0;//读取的原始模拟数值 int voltage = 0;//实际电压值    // the setup routine runs once when you press reset: void setup() {     // put your setup code here, to run once:         pinMode(LED_BUILTIN, OUTPUT);//设置板子上的LED灯引脚         Serial.begin(9600);//打开串口,可以在串口监视器中查看测量的数值 }    // the loop routine runs over and over again forever: void loop() {     // put your main code here, to run repeatedly:            value = analogRead(A0);         //次函数就可以把数值进行范围映射,可以测量的最大值为4095,而我实际的最大测量电压为3.3v         voltage = map(value, 0, 1024, 0, 330);         Serial.println((float)voltage/100.00); //保留两位小数                    //读取一次后,我们让开发板上的LED灯闪烁一次,表示一次读取完成         digitalWrite(LED_BUILTIN, HIGH);         delay(80);         digitalWrite(LED_BUILTIN, LOW);         delay(80);                    //延时一会儿,让串口输出慢一点便于观察         delay(500); } 然后重新验证代码后上传到开发板中,然后打开串口监视器可以看到当我们旋转电位器的时候,实际的电压变化:

  • 回复了主题帖: 【零知ESP8266教程】快速入门7-制作一个抢答器

    rgbgirl 发表于 2019-10-12 12:17 每天都来学习一下
    每天都需要你支持一下

  • 2019-10-12
  • 发表了主题帖: 【零知ESP8266教程】快速入门7-制作一个抢答器

    根据我之前的分享,我们已经学会使用按键控制LED灯的亮与暗,这次我们运用学到的知识,把它投射到现实生活中!相信你们都看过综艺节目,节目中的抢答器就是运用这一点实现的。那么今天,我们一起建立一个抢答器运作的model。 设计功能如下:当主持人按下开始按键后,三个人抢答开始,看谁先按下按键,最先按下按键的人相应的LED灯亮,主持人就可以根据灯的状态选择谁先回答问题。 一、工具原料 电脑,windows系统 零知ESP8266开发板 micro-usb线 LED灯红色、绿色、黄色各一个 按键4个 220Ω 电阻3个 10kΩ 电阻4个 面包板一个+若干跳线 二、硬件连接   三、方法步骤 1、打开零知实验室软件开发工具,然后新建项目,输入以下代码: /** *    文件: LED-qiangda.ino *    作者: 零知 *    时间: 2019/05/29 16:22 *    说明: 当主持人按下开始按键后,三个人抢答开始,看谁先按下按键, *                  最先按下按键的人相应的LED灯亮,主持人就可以根据灯的状态选择谁先回答问题。 **/     int LED_Y =        D1;//三个颜色LED引脚连接 int LED_G =        D2; int LED_R =        D4;     int KEY_START = D0;        //开始按键 int KEY_Y        = D5;        //控制黄色按键 int KEY_G        = D6; int KEY_R        = D7;     int red = 0;    //读取按键的值 int green = 0; int yellow = 0;     void clear_led(); void RED_YES(); void YELLOW_YES(); void GREEN_YES();     // the setup routine runs once when you press reset: void setup() {     // put your setup code here, to run once:         pinMode(LED_Y, OUTPUT);         pinMode(LED_G, OUTPUT);         pinMode(LED_R, OUTPUT);                     //初始状态都关闭         digitalWrite(LED_R, HIGH);         digitalWrite(LED_G, HIGH);         digitalWrite(LED_Y, HIGH);                     pinMode(KEY_Y, INPUT);         pinMode(KEY_G, INPUT);         pinMode(KEY_R, INPUT);         pinMode(KEY_START, INPUT);     Serial.begin(9600); }     // the loop routine runs over and over again forever: void loop() {     // put your main code here, to run repeatedly:             red=digitalRead(KEY_R);         yellow=digitalRead(KEY_Y);         green=digitalRead(KEY_G);             Serial.println(red); //保留两位小数 //       delay(500);         if(red==HIGH)                 RED_YES();            if(yellow==HIGH)                 YELLOW_YES();         if(green==HIGH)                 GREEN_YES(); }     void RED_YES()//一直执行红灯亮,直到复位键按下,结束循环 {   while(digitalRead(KEY_START)==0)   {                           digitalWrite(LED_R,LOW);                 digitalWrite(LED_G,HIGH);                 digitalWrite(LED_Y,HIGH);       delay(200);   }   clear_led(); } void YELLOW_YES()//一直执行黄灯亮,直到复位键按下,结束循环 {   while(digitalRead(KEY_START)==0)   {   digitalWrite(LED_R,HIGH);   digitalWrite(LED_G,HIGH);   digitalWrite(LED_Y,LOW);       delay(200);   }   clear_led(); } void GREEN_YES()//一直执行绿灯亮,直到复位键按下,结束循环 {   while(digitalRead(KEY_START)==0)   {   digitalWrite(LED_R,HIGH);   digitalWrite(LED_G,LOW);   digitalWrite(LED_Y,HIGH);       delay(200);   }   clear_led(); } void clear_led()//清除LED {   digitalWrite(LED_R,HIGH);   digitalWrite(LED_G,HIGH);   digitalWrite(LED_Y,HIGH);        } 2、按照之前的方式先【验证】,然后【上传】到开发板中。 四、成果展示 上面步骤成功完成后,我们就可以看到预期的结果了,如下: 主持人,请出题吧!

  • 2019-10-11
  • 发表了主题帖: 【零知ESP8266教程】快速入门6-让你的作品发出声音

    上次我们一起做了一个交通灯,我们再尝试一个新的元素吧。这次要让我们的作品发出声音来。现在我们就一起做出一个有声音的作品吧! 一、工具原料 电脑,windows系统 零知ESP8266开发板 micro-usb线 蜂鸣器1个 面包板一个+若干跳线 二、硬件连接 三、方法步骤 1、打开零知实验室软件开发工具,然后新建项目,输入以下代码: /** *    文件: buzzer-TEST.ino *    作者: 零知 *    时间: 2019/05/28 17:20 *    说明: **/    int buzzerPin = 0;    int count = 0;//计数    // the setup routine runs once when you press reset: void setup() {     // put your setup code here, to run once:         pinMode(buzzerPin, OUTPUT); }    // the loop routine runs over and over again forever: void loop() {     // put your main code here, to run repeatedly:         count = 0;         //先输出一个频率的声音         while(count++<100)         {                 digitalWrite(buzzerPin, HIGH);                 delay(15);                 digitalWrite(buzzerPin, LOW);                 delay(15);         }         count = 0;         //这里改变了延时时间,输出的频率就改变了,声音效果就不同了         while(count++<100)         {                 digitalWrite(buzzerPin, HIGH);                 delay(20);                 digitalWrite(buzzerPin, LOW);                 delay(20);         } } 2、按照之前的方式先【验证】,然后【上传】到开发板中。 四、成果展示 上面步骤成功完成后,我们就听到清脆的声音了。 发出声音的作品,完成!

  • 2019-10-10
  • 发表了主题帖: 【零知ESP8266教程】快速入门5-使用按键来控制你的灯

    上节课,我们已经学习了如何制作一个简易交通灯,那么如何去控制一个LED的亮或者灭呢?此次试验采用按键来控制我们的LED,实现LED的简单控制。(ps:由于版主移动了我的帖子,所以想看全部教程的小伙伴,可以关注我,查看全部文章。) 一、工具原料 电脑,windows系统 ESP8266开发板 micro-usb线 LED灯一个 按键开关1个 220Ω 电阻1个 10kΩ 电阻1个 面包板一个+若干跳线 二、硬件连接   三、方法步骤 1、打开零知实验室软件开发工具,然后新建项目,输入以下代码: /**    *    文件: KEY-LED-test.ino    *    作者: 零知    *    时间: 2019/05/28 11:38    *    说明:    **/      int ledPin = 3;//LED连接到零知开发板的3脚    int keyPin = 6;//按键连接到零知开发板的6脚用于检测按键的状态      int inputValue = 0;      // the setup routine runs once when you press reset:    void setup() {        // put your setup code here, to run once:              pinMode(ledPin, OUTPUT);            pinMode(keyPin, INPUT);            digitalWrite(ledPin, HIGH);    }      // the loop routine runs over and over again forever:    void loop() {        // put your main code here, to run repeatedly:              inputValue = digitalRead(keyPin);//读取7脚的电平状态            delay(200);            inputValue = digitalRead(keyPin);            if(inputValue == HIGH)//按键按下            {                    digitalWrite(ledPin, LOW);            }else{        //按键释放                    digitalWrite(ledPin, HIGH);            }    }   2、按照之前的方式先【验证】,然后【上传】到开发板中。 四、成果展示 上面步骤成功完成后,我们就可以看到预期的结果了,如下:

  • 2019-10-09
  • 发表了主题帖: 【零知ESP8266教程】快速入门4-制作一个交通灯

    上次的分享文章中,我们已经学会了如何制作一个流水灯,这次我们运用到生活实践中,制作一个交通灯,当然,不止这一个用途,比如:状态指示灯,环花彩灯等等。 一、工具原料 电脑,windows系统 ESP8266开发板 micro-usb线 LED灯红色、绿色、黄色各一个 220Ω 电阻3个 面包板一个+若干跳线 二、连线     三、代码如下: /**     *    文件: 3LED-test.ino     *    作者: 零知     *    时间: 2019/05/27 20:03     *    说明:     **/             #define LED_G 1     #define LED_Y 2     #define LED_R 3             // the setup routine runs once when you press reset:     void setup() {         // put your setup code here, to run once:             pinMode(LED_G, OUTPUT);             pinMode(LED_Y, OUTPUT);             pinMode(LED_R, OUTPUT);     }             // the loop routine runs over and over again forever:     void loop() {         // put your main code here, to run repeatedly:             digitalWrite(LED_G, LOW);////点亮 绿灯             delay(5000);//延时5秒             digitalWrite(LED_G, HIGH); //熄灭 绿灯             for(int i=0;i<3;i++)//闪烁交替三次,黄灯闪烁效果             {                     delay(500);//延时0.5 秒                     digitalWrite(LED_Y, LOW);//点亮  黄灯                     delay(500);//延时0.5 秒                     digitalWrite(LED_Y, HIGH);//熄灭  黄灯             }             delay(500);//延时0.5 秒             digitalWrite(LED_R, LOW);//点亮 红灯             delay(5000);//延时5 秒             digitalWrite(LED_R, HIGH);//熄灭 红灯     } 四、结果如下

  • 2019-10-08
  • 发表了主题帖: 【零知ESP8266教程】快速入门3-制作一个流水灯

    我们在上一篇中成功的点亮了一个LED灯,在这篇我们使用之前的知识,应用5个LED灯组合制作一个简单的流水灯作品。 一、工具原料 电脑,windows系统 ESP8266开发板 micro-usb线 LED灯5个 220Ω 电阻5个 面包板一个+6根跳线 二、硬件连接原理图如下: PS:注意3.3v连接+极LED长脚 三、方法步骤 1、打开零知开发工具,新建一个工程,名字为LED5-test,编辑如下代码: /**     *    文件: LED5-test.ino     *    作者: 零知     *    时间: 2019/05/27 16:35     *    说明:     **/                     // the setup routine runs once when you press reset:     void setup() {         // put your setup code here, to run once:             int x;             for(x=1; x<=5; x++)                     pinMode(x, OUTPUT);     }             // the loop routine runs over and over again forever:     void loop() {         // put your main code here, to run repeatedly:             int i;             for(i=1; i<= 5; i++)             {                     digitalWrite(i, LOW);//依次打开1-5灯,并延时一会儿                     delay(200);             }             for(i=1; i<= 5; i++)             {                     digitalWrite(i, HIGH); //依次关闭1-5号灯,并延时一会儿                     delay(100);             }     }   验证,上传就可以看到结果咧   效果视频:点我传送

  • 2019-10-07
  • 发表了主题帖: 【零知ESP8266教程】快速入门2-点亮外部LED灯

    一、工具原料 电脑,windows系统 ESP8266开发板 micro-usb线 LED灯1个 220Ω 电阻1个 面包板一个+若干跳线 二、硬件连接 三、方法步骤 1、打开零知开发工具软件,并新建一个项目,名字为:LED1-test,然后编写如下代码: /**     *    文件: LED1-test.ino     *    作者: 零知实验室     *    时间: 2018/06/23 11:46     *    说明:     **/                     // the setup routine runs once when you press reset:     void setup() {         // put your setup code here, to run once:             pinMode(1, OUTPUT);             digitalWrite(1, LOW);     }             // the loop routine runs over and over again forever:     void loop() {         // put your main code here, to run repeatedly:             } 验证,上传我们就会发现灯亮了。   四、扩展 我们现在修改一下代码,让这个灯闪烁起来。我们添加代码如下: /**     *    文件: LED1-test.ino     *    作者: 云上上云     *    时间: 2019/05/27 17:17     *    说明:     **/                     // the setup routine runs once when you press reset:     void setup() {         // put your setup code here, to run once:             pinMode(1, OUTPUT);             digitalWrite(1, LOW);     }             // the loop routine runs over and over again forever:     void loop() {         // put your main code here, to run repeatedly:             digitalWrite(1, HIGH);//关闭LED             delay(300);//延时一段时间,这里为300ms             digitalWrite(1, LOW);//打开led             delay(300);//延时一段时间,这句代码执行完后会再次到digitalWrite(1,HIGH);这句代码执行     } 再次重复验证,上传我们就会发现LED闪烁起来了 接下来我给大家简单的讲一下闪烁的原理 他是通过控制LED两边的电频高低来控制开关LED灯,两边均为高时灯灭,一高一低时灯亮。然后再用loop()循环这个操作,并在灯灭和灯亮之后延时300毫秒,就能做到亮300毫秒,灭300毫秒的效果。 五、效果视频 点我传送哦

  • 2019-10-06
  • 发表了主题帖: 【零知ESP8266教程】快速入门1-让你的开发板向世界说hello

    本帖最后由 roc2 于 2019-10-6 17:10 编辑 JAVA的第一句代码是 System.out.println("Hello, World!"); PHP的则是 echo "Hello world"; 而Python是 print ("Hello, World") 一、工具原料 电脑,windows系统 零知ESP8266开发板 micro-usb线 二、方法步骤 1、首先打开“零知Lab”软件。打开后界面如下: 2.这是我们ESP8266模块的官方自带示例 3.接下来我们新建一个test1项目 输入以下代码: /**     *    文件: LED1-test.ino      *    作者: 云上上云     *    时间: 2019/05/27 11:46     *    说明:     **/     // the setup routine runs once when you press reset:     void setup() {         // put your setup code here, to run once:             Serial.begin(9600); //打开串口并设置波特率为9600     }        // the loop routine runs over and over again forever:     void loop() {         // put your main code here, to run repeatedly:         Serial.println("HELLO, ESP8266");             delay(300);//延时300毫秒,否则打印的太快 } 验证代码,正确之后,连接,上传程序   然后打开调试我们就会看到,控制台打印以下内容 四、自己动手 现在我们在上面的基础上制作出自己的作品,我们的需求是,当发送不同的字符给开发板后,开发板会给你回应不同的信息与你进行简答的交互。请按照下面步骤完成: 1、在开发工具中选择【新建工程】,这样我们就可以建立自己的项目进行编写代码了。 点击【新建工程】后,界面如下,我们然后在项目名称中填入一个合适的名字,我这里叫做“HELLO-lingzhilab”: 2、现在我们把下面的代码全部复制到代码显示区中: /**     *    文件: HELLO-lingzhilab.ino     *    作者: 零知实验室     *    时间: 2018/06/22 20:46     *    说明: 让你的开发板与你进行简答的交互     **/                     // the setup routine runs once when you press reset:     void setup() {         // put your setup code here, to run once:             Serial.begin(9600); //打开串口并设置波特率为9600     }             // the loop routine runs over and over again forever:     void loop() {         // put your main code here, to run repeatedly:             int val;             val = Serial.read();                     if(val == 'A')                     Serial.println("HELLO, 零知实验室");             if(val == 'B')                     Serial.println("零知实验室,让电子制作更简单更有趣!");     }   验证-》上传-》调试 这样我们就完成了与开发板的简单交互,这个过程是其他复杂交互过程的一个基础。我们通过上面的实验,可以发现这个过程是非常简单的,仅仅需要几步就能建立一个自己的作品出来。 此内容由EEWORLD论坛网友roc2原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了主题帖: 【零知ESP8266教程】零知WIFI教程-http WEB服务器示例

    本帖最后由 roc2 于 2019-10-6 11:02 编辑 1、概述 HTTP web server作为ESP8266的一个常用功能,在这里使用零知开源平台进行该示例的演示。 2、软件和硬件 硬件我们本次使用零知-ESP8266; 软件使用零知开发工具,自带示例: 3、方法步骤 (1)先在零知开发工具中打开AdvancedWebServer示例,或者复制下面的代码到零知开发工具中: (2)验证上述代码并上传到零知-ESP8266开发板; (3)我们打开零知开发工具的串口调试窗口,可以看到如下信息: (4)现在我们用ping工具测试下网络,得到如下信息: (5)上述步骤成功后,我们现在打开浏览器,打开网址:http://esp8266.local  ,可以看到如下信息:      

  • 2019-09-29
  • 回复了主题帖: MQTT协议介绍之一:发布/订阅

    freebsder 发表于 2019-9-28 19:07 单片机的还是server的?  
    单片机的,我找的arduino MQTT库文件,在运行中发现很多问题,如果可以的话,qq可以联系吗?我截图给你说,方便一些。 我先留下QQ,也会注意论坛的 939089358

  • 2019-09-28
  • 回复了主题帖: MQTT协议介绍之一:发布/订阅

    有mqtt协议库么,遇到一些麻烦的问题,请问在哪里可以和你交流?net

  • 发表了主题帖: 零知开发板和红外人体感应模块使用

    本文讲解如何使用人体感应模块HC SR505模块,我们使用一个LED来指示是否感应到人走进传感器,人走进时候LED指示灯亮,人离开范围内时候,LED熄灭。根据文档,该模块感应范围为3米,延迟时间是8s。 1、硬件 (1)模块: 零知迷你板 红外感应模块HC SR505 (2)连线   2、软件 软件代码如下: /********************************************************** *    文件: SR505.ino      *    时间: 2019/06/18 15:27 *    说明: ************************************************************/   // 复位或上电后运行一次: void setup() {     //在这里加入初始化相关代码,只运行一次:     Serial.begin(9600);     pinMode(6,INPUT);     digitalWrite(6,LOW); }   //一直循环执行: void loop() {     // 在这里加入主要程序代码,重复执行:     if(digitalRead(6)==HIGH)  {         Serial.println("Somebody is here.");     }     else  {         Serial.println("Nobody.");     }     delay(1000); }   3、测试验证 将零知迷你板与红外感应模块以及LED连接好后,上传代码,就可以看到效果了,可以看到当人靠近时候,串口输出信息如下,同时LED灯开启了:

  • 2019-09-27
  • 发表了主题帖: 【零知ESP8266教程】WIFI TCP协议通信 TCP服务器示例

    本帖主要讲解ESP8266 WIFI功能关于TCP协议网络传输的应用,这里演示了ESP8266作为TCP服务器的一个示例: 1、硬件 零知ESP8266开发板 2、软件 (1)代码如下: /********************************************************** *    文件: tcp-server.ino      by 零知实验室(www.lingzhilab.com) *    -^^- 零知开源,让电子制作变得更简单! -^^- *    时间: 2019/06/17 14:12 *    说明: ************************************************************/ #include <ESP8266WiFi.h>   int port = 8888;  //Port number WiFiServer server(port);   //Server connect to WiFi Network const char *ssid = "xx";  //Enter your wifi SSID const char *password = "xx";  //Enter your wifi Password   int count=0;   // 复位或上电后运行一次: void setup() {     //在这里加入初始化相关代码,只运行一次:     Serial.begin(115200);           Serial.println();           WiFi.mode(WIFI_STA);     WiFi.begin(ssid, password); //Connect to wifi           // Wait for connection     Serial.println("Connecting to Wifi");     while (WiFi.status() != WL_CONNECTED) {         delay(500);         Serial.print(".");         delay(500);     }           Serial.println("");     Serial.print("Connected to ");     Serial.println(ssid);           Serial.print("IP address: ");     Serial.println(WiFi.localIP());     Serial.print("port:");     Serial.println(port);     server.begin(); }   //一直循环执行: void loop() {     // 在这里加入主要程序代码,重复执行:     WiFiClient client = server.available();           if (client) {         if(client.connected())         {             Serial.println("Client Connected");         }                   while(client.connected()){             while(client.available()>0){                 // read data from the connected client                 Serial.write(client.read());             }             //Send Data to connected client             while(Serial.available()>0)             {                 client.write(Serial.read());             }         }         client.stop();         Serial.println("Client disconnected");     } } 3、验证测试 (1)将上面代码验证后并上传到零知ESP8266,然后打开串口调试窗口,可以看到如下信息: 现在已经将ESP8266作为TCP服务器了,上面信息为IP和端口 (2)打开零知工具箱的网络调试窗口,然后选择TCP客户端,并填写上面的IP和端口: PS:零知工具箱请至零知官网“软件下载”页面获取 (3)点击【连接】后,就与ESP8266建立的TCP连接了,就可以发送和接收数据了,如下:

  • 回复了主题帖: ESP8266与零知板使用SPI接口连接 提高传输速率

    xiaoxiaodeshuye 发表于 2019-9-27 08:43 忘记留邮箱了747660708@qq.com
    邮箱请注意查收一下哈

  • 回复了主题帖: ESP8266与零知板使用SPI接口连接 提高传输速率

    xiaoxiaodeshuye 发表于 2019-9-27 08:43 忘记留邮箱了747660708@qq.com
    http://www.lingzhilab.com/forum.php?mod=viewthread&tid=906&extra=page%3D2,这上面都是可以免费获取的。

  • 2019-09-26
  • 发表了主题帖: 【零知ESP8266教程】WIFI TCP协议通信 TCP客户端示例

    本帖主要讲解ESP8266 WIFI功能关于TCP协议网络传输的应用,这里演示了ESP8266作为TCP客户端的示例: 1、硬件 零知ESP8266开发板 2、软件 代码如下: /********************************************************** *    文件: tcp-client.ino      by 零知实验室(www.lingzhilab.com) *    -^^- 零知开源,让电子制作变得更简单! -^^- *    时间: 2019/06/17 12:32 *    说明: ************************************************************/   #include <ESP8266WiFi.h>   #define SSID "xx" //这里改成你的wifi名字 #define PASSWD  "xx"//这里改成你的wifi密码   const uint16_t port = 8888; const char * host = "192.168.0.111"; // ip or dns WiFiClient client;//创建一个tcp client连接   // 复位或上电后运行一次: void setup() {     //在这里加入初始化相关代码,只运行一次:     Serial.begin(115200);           WiFi.mode(WIFI_STA);     WiFi.begin(SSID,PASSWD);           Serial.println("Wait for WiFi... ");     //等待wifi连接成功     while (WiFi.status() != WL_CONNECTED) {         Serial.print(".");         delay(500);     }           Serial.println("");     Serial.println("WiFi connected");     Serial.print("IP address: ");     Serial.println(WiFi.localIP());           delay(500); }   //一直循环执行: void loop() {     // 在这里加入主要程序代码,重复执行:     Serial.print("connecting to ");     Serial.println(host);           if (!client.connect(host, port)) {         Serial.println("connection failed");         Serial.println("wait 5 sec...");         delay(5000);         return;     }           // 发送数据到Tcp server     Serial.println("Send this data to server");     client.println(String("lingzhilab"));           //读取从server返回到响应数据     String line = client.readStringUntil('\r');     Serial.println(line);           Serial.println("closing connection");     client.stop();           Serial.println("wait 5 sec...");     delay(5000); } 注:上述代码中需要填写自己的Wifi热点ssid和密码以及电脑所在局域网分配的IP地址(在零知工具箱(请至零知官网“软件下载”页面获取)-网络调试界面可以选择IP,这两处是一致的)。 3、验证测试 首先打开零知工具箱的网络调试窗口,然后选择TCP服务端,并选择IP和端口: 然后点击【连接】,这样就在电脑端开启了一个TCP服务器,然后就可以和ESP8266进行通信了: 更多精彩请关注零知官网    

  • 2019-09-25
  • 发表了主题帖: 【零知小项目分享】Firmata与Processing交互实现音乐LED炫酷灯光效果

    本帖最后由 roc2 于 2019-9-25 15:07 编辑 在这里使用零知标准板和Processing通过Firmata通信,实现了音乐LED炫酷的效果。 1、硬件 零知标准板 RGB LED 3个 电阻-220Ω-9个   硬件连接 2、软件 软件方面需要零知-标准板程序和Processing程序,它们之间通过Firmata通信; (1)零知-标准板 安装Firmata的库后,打开示例StandardFirmata程序,如下操作: 1、安装Firmata库(请到零知官网查看原帖)   或者复制如下代码: #include <Servo.h> #include <SoftWire.h> #include <Firmata.h> #define I2C_WRITE B00000000 #define I2C_READ B00001000 #define I2C_READ_CONTINUOUSLY B00010000 #define I2C_STOP_READING B00011000 #define I2C_READ_WRITE_MODE_MASK B00011000 #define I2C_10BIT_ADDRESS_MODE_MASK B00100000 #define I2C_END_TX_MASK B01000000 #define I2C_STOP_TX 1 #define I2C_RESTART_TX 0 #define I2C_MAX_QUERIES 8 #define I2C_REGISTER_NOT_SPECIFIED -1 // the minimum interval for sampling analog input #define MINIMUM_SAMPLING_INTERVAL 1 /*============================================================================== * GLOBAL VARIABLES *============================================================================*/ #ifdef FIRMATA_SERIAL_FEATURE SerialFirmata serialFeature; #endif /* analog inputs */ int analogInputsToReport = 0; // bitwise array to store pin reporting /* digital input ports */ byte reportPINs[TOTAL_PORTS]; // 1 = report this port, 0 = silence byte previousPINs[TOTAL_PORTS]; // previous 8 bits sent /* pins configuration */ byte portConfigInputs[TOTAL_PORTS]; // each bit: 1 = pin in INPUT, 0 = anything else /* timer variables */ unsigned long currentMillis; // store the current value from millis() unsigned long previousMillis; // for comparison with currentMillis unsigned int samplingInterval = 19; // how often to run the main loop (in ms) /* i2c data */ struct i2c_device_info { byte addr; int reg; byte bytes; byte stopTX; }; /* for i2c read continuous more */ i2c_device_info query[I2C_MAX_QUERIES]; byte i2cRxData[64]; boolean isI2CEnabled = false; signed char queryIndex = -1; // default delay time between i2c read request and Wire.requestFrom() unsigned int i2cReadDelayTime = 0; Servo servos[MAX_SERVOS]; byte servoPinMap[TOTAL_PINS]; byte detachedServos[MAX_SERVOS]; byte detachedServoCount = 0; byte servoCount = 0; boolean isResetting = false; // Forward declare a few functions to avoid compiler errors with older versions // of the Arduino IDE. void setPinModeCallback(byte, int); void reportAnalogCallback(byte analogPin, int value); void sysexCallback(byte, byte, byte*); /* utility functions */ void wireWrite(byte data) { #if ARDUINO >= 100 Wire.write((byte)data); #else Wire.send(data); #endif } byte wireRead(void) { #if ARDUINO >= 100 return Wire.read(); #else return Wire.receive(); #endif } /*============================================================================== * FUNCTIONS *============================================================================*/ void attachServo(byte pin, int minPulse, int maxPulse) { if (servoCount < MAX_SERVOS) { // reuse indexes of detached servos until all have been reallocated if (detachedServoCount > 0) { servoPinMap[pin] = detachedServos[detachedServoCount - 1]; if (detachedServoCount > 0) detachedServoCount--; } else { servoPinMap[pin] = servoCount; servoCount++; } if (minPulse > 0 && maxPulse > 0) { servos[servoPinMap[pin]].attach(PIN_TO_DIGITAL(pin), minPulse, maxPulse); } else { servos[servoPinMap[pin]].attach(PIN_TO_DIGITAL(pin)); } } else { Firmata.sendString("Max servos attached"); } } void detachServo(byte pin) { servos[servoPinMap[pin]].detach(); // if we're detaching the last servo, decrement the count // otherwise store the index of the detached servo if (servoPinMap[pin] == servoCount && servoCount > 0) { servoCount--; } else if (servoCount > 0) { // keep track of detached servos because we want to reuse their indexes // before incrementing the count of attached servos detachedServoCount++; detachedServos[detachedServoCount - 1] = servoPinMap[pin]; } servoPinMap[pin] = 255; } void enableI2CPins() { byte i; // is there a faster way to do this? would probaby require importing // Arduino.h to get SCL and SDA pins for (i = 0; i < TOTAL_PINS; i++) { if (IS_PIN_I2C(i)) { // mark pins as i2c so they are ignore in non i2c data requests setPinModeCallback(i, PIN_MODE_I2C); } } isI2CEnabled = true; Wire.begin(); } /* disable the i2c pins so they can be used for other functions */ void disableI2CPins() { isI2CEnabled = false; // disable read continuous mode for all devices queryIndex = -1; } void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) { // allow I2C requests that don't require a register read // for example, some devices using an interrupt pin to signify new data available // do not always require the register read so upon interrupt you call Wire.requestFrom() if (theRegister != I2C_REGISTER_NOT_SPECIFIED) { Wire.beginTransmission(address); wireWrite((byte)theRegister); Wire.endTransmission(stopTX); // default = true // do not set a value of 0 if (i2cReadDelayTime > 0) { // delay is necessary for some devices such as WiiNunchuck delayMicroseconds(i2cReadDelayTime); } } else { theRegister = 0; // fill the register with a dummy value } Wire.requestFrom(address, numBytes); // all bytes are returned in requestFrom // check to be sure correct number of bytes were returned by slave if (numBytes < Wire.available()) { Firmata.sendString("I2C: Too many bytes received"); } else if (numBytes > Wire.available()) { Firmata.sendString("I2C: Too few bytes received"); } i2cRxData[0] = address; i2cRxData[1] = theRegister; for (int i = 0; i < numBytes && Wire.available(); i++) { i2cRxData[2 + i] = wireRead(); } // send slave address, register and received bytes Firmata.sendSysex(SYSEX_I2C_REPLY, numBytes + 2, i2cRxData); } void outputPort(byte portNumber, byte portValue, byte forceSend) { // pins not configured as INPUT are cleared to zeros portValue = portValue & portConfigInputs[portNumber]; // only send if the value is different than previously sent if (forceSend || previousPINs[portNumber] != portValue) { Firmata.sendDigitalPort(portNumber, portValue); previousPINs[portNumber] = portValue; } } /* ----------------------------------------------------------------------------- * check all the active digital inputs for change of state, then add any events * to the Serial output queue using Serial.print() */ void checkDigitalInputs(void) { /* Using non-looping code allows constants to be given to readPort(). * The compiler will apply substantial optimizations if the inputs * to readPort() are compile-time constants. */ if (TOTAL_PORTS > 0 && reportPINs[0]) outputPort(0, readPort(0, portConfigInputs[0]), false); if (TOTAL_PORTS > 1 && reportPINs[1]) outputPort(1, readPort(1, portConfigInputs[1]), false); if (TOTAL_PORTS > 2 && reportPINs[2]) outputPort(2, readPort(2, portConfigInputs[2]), false); if (TOTAL_PORTS > 3 && reportPINs[3]) outputPort(3, readPort(3, portConfigInputs[3]), false); if (TOTAL_PORTS > 4 && reportPINs[4]) outputPort(4, readPort(4, portConfigInputs[4]), false); if (TOTAL_PORTS > 5 && reportPINs[5]) outputPort(5, readPort(5, portConfigInputs[5]), false); if (TOTAL_PORTS > 6 && reportPINs[6]) outputPort(6, readPort(6, portConfigInputs[6]), false); if (TOTAL_PORTS > 7 && reportPINs[7]) outputPort(7, readPort(7, portConfigInputs[7]), false); if (TOTAL_PORTS > 8 && reportPINs[8]) outputPort(8, readPort(8, portConfigInputs[8]), false); if (TOTAL_PORTS > 9 && reportPINs[9]) outputPort(9, readPort(9, portConfigInputs[9]), false); if (TOTAL_PORTS > 10 && reportPINs[10]) outputPort(10, readPort(10, portConfigInputs[10]), false); if (TOTAL_PORTS > 11 && reportPINs[11]) outputPort(11, readPort(11, portConfigInputs[11]), false); if (TOTAL_PORTS > 12 && reportPINs[12]) outputPort(12, readPort(12, portConfigInputs[12]), false); if (TOTAL_PORTS > 13 && reportPINs[13]) outputPort(13, readPort(13, portConfigInputs[13]), false); if (TOTAL_PORTS > 14 && reportPINs[14]) outputPort(14, readPort(14, portConfigInputs[14]), false); if (TOTAL_PORTS > 15 && reportPINs[15]) outputPort(15, readPort(15, portConfigInputs[15]), false); } // ----------------------------------------------------------------------------- /* sets the pin mode to the correct state and sets the relevant bits in the * two bit-arrays that track Digital I/O and PWM status */ void setPinModeCallback(byte pin, int mode) { if (Firmata.getPinMode(pin) == PIN_MODE_IGNORE) return; if (Firmata.getPinMode(pin) == PIN_MODE_I2C && isI2CEnabled && mode != PIN_MODE_I2C) { // disable i2c so pins can be used for other functions // the following if statements should reconfigure the pins properly disableI2CPins(); } if (IS_PIN_DIGITAL(pin) && mode != PIN_MODE_SERVO) { if (servoPinMap[pin] < MAX_SERVOS && servos[servoPinMap[pin]].attached()) { detachServo(pin); } } if (IS_PIN_ANALOG(pin)) { reportAnalogCallback(PIN_TO_ANALOG(pin), mode == PIN_MODE_ANALOG ? 1 : 0); // turn on/off reporting } if (IS_PIN_DIGITAL(pin)) { if (mode == PIN_MODE_INPUT || mode == PIN_MODE_PULLUP) { portConfigInputs[pin / 8] |= (1 << (pin & 7)); } else { portConfigInputs[pin / 8] &= ~(1 << (pin & 7)); } } Firmata.setPinState(pin, 0); switch (mode) { case PIN_MODE_ANALOG: if (IS_PIN_ANALOG(pin)) { if (IS_PIN_DIGITAL(pin)) { pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver #if ARDUINO <= 100 // deprecated since Arduino 1.0.1 - TODO: drop support in Firmata 2.6 digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups #endif } Firmata.setPinMode(pin, PIN_MODE_ANALOG); } break; case PIN_MODE_INPUT: if (IS_PIN_DIGITAL(pin)) { pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver #if ARDUINO <= 100 // deprecated since Arduino 1.0.1 - TODO: drop support in Firmata 2.6 digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups #endif Firmata.setPinMode(pin, PIN_MODE_INPUT); } break; case PIN_MODE_PULLUP: if (IS_PIN_DIGITAL(pin)) { pinMode(PIN_TO_DIGITAL(pin), INPUT_PULLUP); Firmata.setPinMode(pin, PIN_MODE_PULLUP); Firmata.setPinState(pin, 1); } break; case PIN_MODE_OUTPUT: if (IS_PIN_DIGITAL(pin)) { if (Firmata.getPinMode(pin) == PIN_MODE_PWM) { // Disable PWM if pin mode was previously set to PWM. digitalWrite(PIN_TO_DIGITAL(pin), LOW); } pinMode(PIN_TO_DIGITAL(pin), OUTPUT); Firmata.setPinMode(pin, PIN_MODE_OUTPUT); } break; case PIN_MODE_PWM: if (IS_PIN_PWM(pin)) { pinMode(PIN_TO_PWM(pin), OUTPUT); analogWrite(PIN_TO_PWM(pin), 0); Firmata.setPinMode(pin, PIN_MODE_PWM); } break; case PIN_MODE_SERVO: if (IS_PIN_DIGITAL(pin)) { Firmata.setPinMode(pin, PIN_MODE_SERVO); if (servoPinMap[pin] == 255 || !servos[servoPinMap[pin]].attached()) { // pass -1 for min and max pulse values to use default values set // by Servo library attachServo(pin, -1, -1); } } break; case PIN_MODE_I2C: if (IS_PIN_I2C(pin)) { // mark the pin as i2c // the user must call I2C_CONFIG to enable I2C for a device Firmata.setPinMode(pin, PIN_MODE_I2C); } break; case PIN_MODE_SERIAL: #ifdef FIRMATA_SERIAL_FEATURE serialFeature.handlePinMode(pin, PIN_MODE_SERIAL); #endif break; default: Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM } // TODO: save status to EEPROM here, if changed } /* * Sets the value of an individual pin. Useful if you want to set a pin value but * are not tracking the digital port state. * Can only be used on pins configured as OUTPUT. * Cannot be used to enable pull-ups on Digital INPUT pins. */ void setPinValueCallback(byte pin, int value) { if (pin < TOTAL_PINS && IS_PIN_DIGITAL(pin)) { if (Firmata.getPinMode(pin) == PIN_MODE_OUTPUT) { Firmata.setPinState(pin, value); digitalWrite(PIN_TO_DIGITAL(pin), value); } } } void analogWriteCallback(byte pin, int value) { if (pin < TOTAL_PINS) { switch (Firmata.getPinMode(pin)) { case PIN_MODE_SERVO: if (IS_PIN_DIGITAL(pin)) servos[servoPinMap[pin]].write(value); Firmata.setPinState(pin, value); break; case PIN_MODE_PWM: if (IS_PIN_PWM(pin)) analogWrite(PIN_TO_PWM(pin), value); Firmata.setPinState(pin, value); break; } } } void digitalWriteCallback(byte port, int value) { byte pin, lastPin, pinValue, mask = 1, pinWriteMask = 0; if (port < TOTAL_PORTS) { // create a mask of the pins on this port that are writable. lastPin = port * 8 + 8; if (lastPin > TOTAL_PINS) lastPin = TOTAL_PINS; for (pin = port * 8; pin < lastPin; pin++) { // do not disturb non-digital pins (eg, Rx & Tx) if (IS_PIN_DIGITAL(pin)) { // do not touch pins in PWM, ANALOG, SERVO or other modes if (Firmata.getPinMode(pin) == PIN_MODE_OUTPUT || Firmata.getPinMode(pin) == PIN_MODE_INPUT) { pinValue = ((byte)value & mask) ? 1 : 0; if (Firmata.getPinMode(pin) == PIN_MODE_OUTPUT) { pinWriteMask |= mask; } else if (Firmata.getPinMode(pin) == PIN_MODE_INPUT && pinValue == 1 && Firmata.getPinState(pin) != 1) { // only handle INPUT here for backwards compatibility #if ARDUINO > 100 pinMode(pin, INPUT_PULLUP); #else // only write to the INPUT pin to enable pullups if Arduino v1.0.0 or earlier pinWriteMask |= mask; #endif } Firmata.setPinState(pin, pinValue); } } mask = mask << 1; } writePort(port, (byte)value, pinWriteMask); } } // ----------------------------------------------------------------------------- /* sets bits in a bit array (int) to toggle the reporting of the analogIns */ //void FirmataClass::setAnalogPinReporting(byte pin, byte state) { //} void reportAnalogCallback(byte analogPin, int value) { if (analogPin < TOTAL_ANALOG_PINS) { if (value == 0) { analogInputsToReport = analogInputsToReport & ~ (1 << analogPin); } else { analogInputsToReport = analogInputsToReport | (1 << analogPin); // prevent during system reset or all analog pin values will be reported // which may report noise for unconnected analog pins if (!isResetting) { // Send pin value immediately. This is helpful when connected via // ethernet, wi-fi or bluetooth so pin states can be known upon // reconnecting. Firmata.sendAnalog(analogPin, analogRead(analogPin)); } } } // TODO: save status to EEPROM here, if changed } void reportDigitalCallback(byte port, int value) { if (port < TOTAL_PORTS) { reportPINs[port] = (byte)value; // Send port value immediately. This is helpful when connected via // ethernet, wi-fi or bluetooth so pin states can be known upon // reconnecting. if (value) outputPort(port, readPort(port, portConfigInputs[port]), true); } // do not disable analog reporting on these 8 pins, to allow some // pins used for digital, others analog. Instead, allow both types // of reporting to be enabled, but check if the pin is configured // as analog when sampling the analog inputs. Likewise, while // scanning digital pins, portConfigInputs will mask off values from any // pins configured as analog } /*============================================================================== * SYSEX-BASED commands *============================================================================*/ void sysexCallback(byte command, byte argc, byte *argv) { byte mode; byte stopTX; byte slaveAddress; byte data; int slaveRegister; unsigned int delayTime; switch (command) { case I2C_REQUEST: mode = argv[1] & I2C_READ_WRITE_MODE_MASK; if (argv[1] & I2C_10BIT_ADDRESS_MODE_MASK) { Firmata.sendString("10-bit addressing not supported"); return; } else { slaveAddress = argv[0]; } // need to invert the logic here since 0 will be default for client // libraries that have not updated to add support for restart tx if (argv[1] & I2C_END_TX_MASK) { stopTX = I2C_RESTART_TX; } else { stopTX = I2C_STOP_TX; // default } switch (mode) { case I2C_WRITE: Wire.beginTransmission(slaveAddress); for (byte i = 2; i < argc; i += 2) { data = argv + (argv[i + 1] << 7); wireWrite(data); } Wire.endTransmission(); delayMicroseconds(70); break; case I2C_READ: if (argc == 6) { // a slave register is specified slaveRegister = argv[2] + (argv[3] << 7); data = argv[4] + (argv[5] << 7); // bytes to read } else { // a slave register is NOT specified slaveRegister = I2C_REGISTER_NOT_SPECIFIED; data = argv[2] + (argv[3] << 7); // bytes to read } readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX); break; case I2C_READ_CONTINUOUSLY: if ((queryIndex + 1) >= I2C_MAX_QUERIES) { // too many queries, just ignore Firmata.sendString("too many queries"); break; } if (argc == 6) { // a slave register is specified slaveRegister = argv[2] + (argv[3] << 7); data = argv[4] + (argv[5] << 7); // bytes to read } else { // a slave register is NOT specified slaveRegister = (int)I2C_REGISTER_NOT_SPECIFIED; data = argv[2] + (argv[3] << 7); // bytes to read } queryIndex++; query[queryIndex].addr = slaveAddress; query[queryIndex].reg = slaveRegister; query[queryIndex].bytes = data; query[queryIndex].stopTX = stopTX; break; case I2C_STOP_READING: byte queryIndexToSkip; // if read continuous mode is enabled for only 1 i2c device, disable // read continuous reporting for that device if (queryIndex <= 0) { queryIndex = -1; } else { queryIndexToSkip = 0; // if read continuous mode is enabled for multiple devices, // determine which device to stop reading and remove it's data from // the array, shifiting other array data to fill the space for (byte i = 0; i < queryIndex + 1; i++) { if (query.addr == slaveAddress) { queryIndexToSkip = i; break; } } for (byte i = queryIndexToSkip; i < queryIndex + 1; i++) { if (i < I2C_MAX_QUERIES) { query.addr = query[i + 1].addr; query.reg = query[i + 1].reg; query.bytes = query[i + 1].bytes; query.stopTX = query[i + 1].stopTX; } } queryIndex--; } break; default: break; } break; case I2C_CONFIG: delayTime = (argv[0] + (argv[1] << 7)); if (argc > 1 && delayTime > 0) { i2cReadDelayTime = delayTime; } if (!isI2CEnabled) { enableI2CPins(); } break; case SERVO_CONFIG: if (argc > 4) { // these vars are here for clarity, they'll optimized away by the compiler byte pin = argv[0]; int minPulse = argv[1] + (argv[2] << 7); int maxPulse = argv[3] + (argv[4] << 7); if (IS_PIN_DIGITAL(pin)) { if (servoPinMap[pin] < MAX_SERVOS && servos[servoPinMap[pin]].attached()) { detachServo(pin); } attachServo(pin, minPulse, maxPulse); setPinModeCallback(pin, PIN_MODE_SERVO); } } break; case SAMPLING_INTERVAL: if (argc > 1) { samplingInterval = argv[0] + (argv[1] << 7); if (samplingInterval < MINIMUM_SAMPLING_INTERVAL) { samplingInterval = MINIMUM_SAMPLING_INTERVAL; } } else { //Firmata.sendString("Not enough data"); } break; case EXTENDED_ANALOG: if (argc > 1) { int val = argv[1]; if (argc > 2) val |= (argv[2] << 7); if (argc > 3) val |= (argv[3] << 14); analogWriteCallback(argv[0], val); } break; case CAPABILITY_QUERY: Firmata.write(START_SYSEX); Firmata.write(CAPABILITY_RESPONSE); for (byte pin = 0; pin < TOTAL_PINS; pin++) { if (IS_PIN_DIGITAL(pin)) { Firmata.write(PIN_MODE_INPUT); Firmata.write(1); Firmata.write((byte)PIN_MODE_PULLUP); Firmata.write(1); Firmata.write(PIN_MODE_OUTPUT); Firmata.write(1); } if (IS_PIN_ANALOG(pin)) { Firmata.write(PIN_MODE_ANALOG); Firmata.write(10); // 10 = 10-bit resolution } if (IS_PIN_PWM(pin)) { Firmata.write(PIN_MODE_PWM); Firmata.write(DEFAULT_PWM_RESOLUTION); } if (IS_PIN_DIGITAL(pin)) { Firmata.write(PIN_MODE_SERVO); Firmata.write(14); } if (IS_PIN_I2C(pin)) { Firmata.write(PIN_MODE_I2C); Firmata.write(1); // TODO: could assign a number to map to SCL or SDA } #ifdef FIRMATA_SERIAL_FEATURE serialFeature.handleCapability(pin); #endif Firmata.write(127); } Firmata.write(END_SYSEX); break; case PIN_STATE_QUERY: if (argc > 0) { byte pin = argv[0]; Firmata.write(START_SYSEX); Firmata.write(PIN_STATE_RESPONSE); Firmata.write(pin); if (pin < TOTAL_PINS) { Firmata.write(Firmata.getPinMode(pin)); Firmata.write((byte)Firmata.getPinState(pin) & 0x7F); if (Firmata.getPinState(pin) & 0xFF80) Firmata.write((byte)(Firmata.getPinState(pin) >> 7) & 0x7F); if (Firmata.getPinState(pin) & 0xC000) Firmata.write((byte)(Firmata.getPinState(pin) >> 14) & 0x7F); } Firmata.write(END_SYSEX); } break; case ANALOG_MAPPING_QUERY: Firmata.write(START_SYSEX); Firmata.write(ANALOG_MAPPING_RESPONSE); for (byte pin = 0; pin < TOTAL_PINS; pin++) { Firmata.write(IS_PIN_ANALOG(pin) ? PIN_TO_ANALOG(pin) : 127); } Firmata.write(END_SYSEX); break; case SERIAL_MESSAGE: #ifdef FIRMATA_SERIAL_FEATURE serialFeature.handleSysex(command, argc, argv); #endif break; } } /*============================================================================== * SETUP() *============================================================================*/ void systemResetCallback() { isResetting = true; // initialize a defalt state // TODO: option to load config from EEPROM instead of default #ifdef FIRMATA_SERIAL_FEATURE serialFeature.reset(); #endif if (isI2CEnabled) { disableI2CPins(); } for (byte i = 0; i < TOTAL_PORTS; i++) { reportPINs = false; // by default, reporting off portConfigInputs = 0; // until activated previousPINs = 0; } for (byte i = 0; i < TOTAL_PINS; i++) { // pins with analog capability default to analog input // otherwise, pins default to digital output if (IS_PIN_ANALOG(i)) { // turns off pullup, configures everything setPinModeCallback(i, PIN_MODE_ANALOG); } else if (IS_PIN_DIGITAL(i)) { // sets the output to 0, configures portConfigInputs setPinModeCallback(i, PIN_MODE_OUTPUT); } servoPinMap = 255; } // by default, do not report any analog inputs analogInputsToReport = 0; detachedServoCount = 0; servoCount = 0; /* send digital inputs to set the initial state on the host computer, * since once in the loop(), this firmware will only send on change */ /* TODO: this can never execute, since no pins default to digital input but it will be needed when/if we support EEPROM stored config for (byte i=0; i < TOTAL_PORTS; i++) { outputPort(i, readPort(i, portConfigInputs), true); } */ isResetting = false; } void setup() { Firmata.setFirmwareVersion(FIRMATA_FIRMWARE_MAJOR_VERSION, FIRMATA_FIRMWARE_MINOR_VERSION); Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); Firmata.attach(REPORT_ANALOG, reportAnalogCallback); Firmata.attach(REPORT_DIGITAL, reportDigitalCallback); Firmata.attach(SET_PIN_MODE, setPinModeCallback); Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback); Firmata.attach(START_SYSEX, sysexCallback); Firmata.attach(SYSTEM_RESET, systemResetCallback); // to use a port other than Serial, such as Serial1 on an Arduino Leonardo or Mega, // Call begin(baud) on the alternate serial port and pass it to Firmata to begin like this: // Serial1.begin(57600); // Firmata.begin(Serial1); // However do not do this if you are using SERIAL_MESSAGE Firmata.begin(57600); while (!Serial) { ; // wait for serial port to connect. Needed for ATmega32u4-based boards and Arduino 101 } systemResetCallback(); // reset to default config } /*============================================================================== * LOOP() *============================================================================*/ void loop() { byte pin, analogPin; /* DIGITALREAD - as fast as possible, check for changes and output them to the * FTDI buffer using Serial.print() */ checkDigitalInputs(); /* STREAMREAD - processing incoming messagse as soon as possible, while still * checking digital inputs. */ while (Firmata.available()) Firmata.processInput(); // TODO - ensure that Stream buffer doesn't go over 60 bytes currentMillis = millis(); if (currentMillis - previousMillis > samplingInterval) { previousMillis += samplingInterval; /* ANALOGREAD - do all analogReads() at the configured sampling interval */ for (pin = 0; pin < TOTAL_PINS; pin++) { if (IS_PIN_ANALOG(pin) && Firmata.getPinMode(pin) == PIN_MODE_ANALOG) { analogPin = PIN_TO_ANALOG(pin); if (analogInputsToReport & (1 << analogPin)) { Firmata.sendAnalog(analogPin, analogRead(analogPin)); } } } // report i2c data for all device with read continuous mode enabled if (queryIndex > -1) { for (byte i = 0; i < queryIndex + 1; i++) { readAndReportData(query.addr, query.reg, query.bytes, query.stopTX); } } } #ifdef FIRMATA_SERIAL_FEATURE serialFeature.update(); #endif }   然后验证程序并上传到零知-标准板。 (2)Processing程序 Processing程序主要使用Firmata库和Minim库,然后把音乐通过FFT计算并转换为PWM值,这个值再通过Firmata Arduino设置对应LED的引脚PWM值,就能显示各种颜色。   import ddf.minim.*; import ddf.minim.analysis.*; import processing.serial.*; import cc.arduino.*; Arduino arduino; Minim minim; AudioPlayer song; FFT fft; int redPin1 = 0; int greenPin1 = 1; int bluePin1 = 2; int redPin2 = 3; int greenPin2 = 5; int bluePin2 = 6; int redPin3 = 9; int greenPin3 = 11; int bluePin3 = 12; int LED_PINS[] = {redPin1,greenPin1,bluePin1,redPin2,greenPin2,bluePin2,redPin3,greenPin3,bluePin3}; int color_id = 0; int common_cathode = 0; void setup() { size(800, 600); arduino = new Arduino(this, "COM7", 57600); for (int i = 0; i <= 8; i++) arduino.pinMode(LED_PINS, Arduino.PWM); for (int i = 0; i <= 8; i++) arduino.analogWrite(LED_PINS,255); minim = new Minim(this); song = minim.loadFile("badapple.mp3"); song.play(); fft = new FFT(song.bufferSize(), song.sampleRate()); } void draw() { background(#151515); fft.forward(song.mix); strokeWeight(1.3); stroke(#FFF700); // frequency pushMatrix(); translate(250, 0); for(int i = 0; i < 0+fft.specSize(); i++) { line(i, height*4/5, i, height*4/5 - fft.getBand(i)*4); if(i%100==0) text(fft.getBand(i), i, height*4/5+20); if(i==200) { if(fft.getBand(i)>2) { setColor1(255,255,0); setColor3(255,255,0); } else if(fft.getBand(i)>1) { setColor1(255,0,255); setColor3(255,0,255); } else { setColor1(255,255,255); setColor3(255,255,255); } } if(i==50) { if(fft.getBand(i)>5) { color_id = (color_id+1)%4; } else if(fft.getBand(i)>3) { if(color_id==0) setColor2(0,255,0); else if(color_id==1) setColor2(0,255,255); else if(color_id==2) setColor2(0,0,255); else setColor2(255,0,0); } else { setColor2(255,255,255); } } } popMatrix(); stroke(#FF0000); //waveform for(int i = 250; i < song.left.size() - 1; i++) { line(i, 50 + song.left.get(i)*50, i+1, 50 + song.left.get(i+1)*50); line(i, 150 + song.right.get(i)*50, i+1, 150 + song.right.get(i+1)*50); line(i, 250 + song.mix.get(i)*50, i+1, 250 + song.mix.get(i+1)*50); } noStroke(); fill(#111111); rect(0, 0, 250, height); textSize(24); fill(#046700); text("left amplitude", 10, 50); text("right amplitude", 10, 150); text("mixed amplitude", 10, 250); text("frequency", 10, height*4/5); } void stop() { for (int i = 0; i <= 13; i++) arduino.digitalWrite(i,arduino.HIGH); song.close(); minim.stop(); super.stop(); } void setColor1(int red, int green, int blue) { if(common_cathode==1) { red = 255-red; green = 255-green; blue = 255-blue; } arduino.analogWrite(redPin1, red); arduino.analogWrite(greenPin1, green); arduino.analogWrite(bluePin1, blue); } void setColor2(int red, int green, int blue) { if(common_cathode==1) { red = 255-red; green = 255-green; blue = 255-blue; } arduino.analogWrite(redPin2, red); arduino.analogWrite(greenPin2, green); arduino.analogWrite(bluePin2, blue); } void setColor3(int red, int green, int blue) { if(common_cathode==1) { red = 255-red; green = 255-green; blue = 255-blue; } arduino.analogWrite(redPin3, red); arduino.analogWrite(greenPin3, green); arduino.analogWrite(bluePin3, blue); } 这里需要注意的是,需要在Processing程序里面更改你的板子对应COM口,和你需要播放的音乐名(和sketch同一级目录)。 完整程序如下: 请到零知官网查看原帖获取。 3、测试验证 在我们连接好零知板与LED等的连线并上传好程序后,我们再打开Processing程序并运行,就可以看到播放音乐的时候炫酷的LED灯光效果了。   查看完整效果视频:点我一下,带你传送哦

  • 回复了主题帖: ESP8266与零知板使用SPI接口连接 提高传输速率

    lzm2008 发表于 2019-9-20 21:48 Cool,板子做得漂亮。
    谢谢

最近访客

< 1/2 >

统计信息

已有14人来访过

  • 芯币:261
  • 好友:--
  • 主题:46
  • 回复:11
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


eric_wang 2019-9-29
roc2: 你你你,为什么转移我的帖子,不服不服,可恶可恶!发发牢骚,,
帖子内嵌推广信息,只能发在信息发布板块。
查看全部