#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #define PIN_LED1_DI 1 // led1 di口 #define PIN_LED2_DI 2 // led2 di口#define LED_COMMAND_SET_FLASH 'A' // 设置灯闪烁 #define LED_COMMAND_STOP_FLASH 'B' // 停止灯闪烁 #define LED_COMMAND_SET_COLOR 'C' // 设置灯颜色char temp; char recvData[1024]; int nRecvDataLen; int FlashFlag; char FlashValue; Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN_LED1_DI, NEO_GRB + NEO_KHZ800);//8代表有8个小灯 //如果一个板子控制多个灯圈,在这新建,组成数组,然后做处理 void setup() {// put your setup code here, to run once:Serial.begin(115200); //设置串口波特率115200while (Serial.read() >= 0) {} //清除缓存pinMode(PIN_LED1_DI, OUTPUT);memset(recvData, 0, sizeof(recvData));nRecvDataLen = 0;FlashFlag=0; }// Fill the dots one after the other with a color void colorWipe(uint32_t c, uint8_t wait) {for(uint16_t i=0; i<strip.numPixels(); i++) {strip.setPixelColor(i, c);strip.show();delay(wait);} }void rainbow(uint8_t wait) {uint16_t i, j;for(j=0; j<256; j++) {for(i=0; i<strip.numPixels(); i++) {strip.setPixelColor(i, Wheel((i+j) & 255));}strip.show();delay(wait);} }// Slightly different, this makes the rainbow equally distributed throughout void rainbowCycle(uint8_t wait) {uint16_t i, j;for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheelfor(i=0; i< strip.numPixels(); i++) {strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));}strip.show();delay(wait);} }//Theatre-style crawling lights. void theaterChase(uint32_t c, uint8_t wait) {for (int j=0; j<10; j++) { //do 10 cycles of chasingfor (int q=0; q < 3; q++) {for (int i=0; i < strip.numPixels(); i=i+3) {strip.setPixelColor(i+q, c); //turn every third pixel on}strip.show();delay(wait);for (int i=0; i < strip.numPixels(); i=i+3) {strip.setPixelColor(i+q, 0); //turn every third pixel off}}} }//Theatre-style crawling lights with rainbow effect void theaterChaseRainbow(uint8_t wait) {for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheelfor (int q=0; q < 3; q++) {for (int i=0; i < strip.numPixels(); i=i+3) {strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on}strip.show();delay(wait);for (int i=0; i < strip.numPixels(); i=i+3) {strip.setPixelColor(i+q, 0); //turn every third pixel off}}} }// Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel(byte WheelPos) {WheelPos = 255 - WheelPos;if(WheelPos < 85) {return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);}if(WheelPos < 170) {WheelPos -= 85;return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);}WheelPos -= 170;return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); }void FlashControl(char value) {if (value == 'R') {theaterChase(strip.Color(127, 0, 0), 10); // Red} else if (value == 'G') {theaterChase(strip.Color(127, 127, 127), 10);// White} else if (value == 'B') {theaterChase(strip.Color(0, 0, 127), 10); // Blue}else{theaterChaseRainbow(0);//七色轮闪光} } void SetColor(char value) {if (value == 'R') {colorWipe(strip.Color(255, 0, 0), 0);} else if (value == 'G') {colorWipe(strip.Color(0, 255, 0), 0);} else if (value == 'B') {colorWipe(strip.Color(0, 0, 255), 0);}else if (value == '0') {colorWipe(strip.Color(0, 0, 0), 0);} }int processOneCommand() {int nLedNo = recvData[1] - 0x30;char nCmdNo = recvData[2];char cValue = recvData[3];// 看是哪种命令,并调用相应的接口if (nCmdNo == LED_COMMAND_SET_FLASH){FlashFlag=1;FlashValue=cValue;}else if (nCmdNo == LED_COMMAND_SET_COLOR){FlashFlag=0;SetColor(cValue);}else if(nCmdNo == LED_COMMAND_STOP_FLASH){FlashFlag=0;SetColor('0');}} void loop() {// put your main code here, to run repeatedly:while (Serial.available() > 0){temp = Serial.read();//获取串口接收到的数据一个一个收if (temp == '$'){nRecvDataLen = 0;}if (nRecvDataLen < 6){recvData[nRecvDataLen++] = temp;}if (recvData[0] == '$' && recvData[5] == '@'){processOneCommand();memset(recvData, 0, sizeof(recvData));nRecvDataLen = 0; // 已有的数据缓冲区清空}}if(FlashFlag){FlashControl(FlashValue);}}- 功能:led灯模块和电脑PC通讯的协议
1、控制灯闪烁
2、设置颜色
协议定义,PC请求和返回结果都通过该协议。共6个字节: $ LEDNO CONTROLNO VALUE CheckSUM @
发送或请求示例:$1AR0@
头部标志:一个字节 :$
LEDNO: 一个字节灯号,0,1,2,3....
CMDNO: 一个字节控制命令号 AB ,A--设置灯闪烁 ,B--设置灯颜色
VALUE:1个字节,颜色值RGB,红R,绿G,蓝B...无色‘0’
CheckSUM:按位相加后取1个字节
结束标志:@
详细解决方案
arduino通过自定义协议控制ws2812led全彩彩灯
热度:80 发布时间:2024-01-24 11:37:58.0
相关解决方案
- 读《 NFC:Arduino、Android与PhoneGap近场通讯》 有感——智能的电磁场交互
- NFC:Arduino、Android与PhoneGap近场通讯
- 《 NFC:Arduino、Android与PhoneGap近场通讯》 试读
- 利用 arduino ~uno 以及Joystick Shield 拓展板开发贪吃蛇小游戏
- pyserial arduino
- Arduino ESP8266? 几行代码实现简易多任务框架
- Intel XDK 上对Edison + Arduino 编程
- 编译器KEIL、IAR、Arduino IDE等常见的问题~总贴
- Arduino 传输数据类型转换
- 【Arduino】串口数据收发处理
- 小实验——Arduino 编程显示Hello World !
- Arduino+HC-SR04 实现超声波测距
- C++ 和 Arduino 数据类型转换 int 转换为 char