sky-Hawk where 发表于 2015-7-22 10:50:51

LilyPad Arduino USB 板的有趣程序

本帖最后由 slotg 于 2015-7-22 10:54 编辑



这是对 6 月份铜板兑换的 LilyPad Arduino USB 开发板所做的小程序。

LilyPad Arduino USB 板最初的目标就是设计成可装配在个人随身物品或是纺织品上的穿戴式微控板,透过导电的织布来连接 LilyPad 板与 LED 灯来产生一些炫目的效果。最近我将板子连接上 RGB LED 灯与振动开关设计了 2 个有趣的程序,板子的连接方式如下:

D11   B
D10   R
D9      G
D3      振动开关

第一个程序:

在平常的情况下 RGB LED 灯以每间隔 1 秒钟的时间更换显示颜色,当侦测到振动开关接点接触时会以目前的颜色快速闪烁 2 秒钟,然后再恢复到每间隔 1 秒钟更换显示颜色。

程序呼叫了 millis() 函数获取板子运行的时间长度做为程序延时使用,返回的数据类型是 unsigned long,每一个单位是 1ms,类型 unsigned long 的数据长度是 32 位,可以表示的范围是 0 到 4,294,967,295 (2^32 - 1),这个意思是表示板子在程序不关电连续运行 50 天之后返回的数据会产生 overflow 的情况!不过我们先不考虑这个问题。

程序代码:const int RLEDPin = 10;
const int GLEDPin = 9;
const int BLEDPin = 11;
const int SWPin = 3;

byte idx = 0;
unsigned long preMillis1 = 0;
unsigned long preMillis2 = 0;
int duty = 1000;
boolean fg_sw = false;

void setup() {
pinMode(RLEDPin, OUTPUT);
pinMode(GLEDPin, OUTPUT);
pinMode(BLEDPin, OUTPUT);
pinMode(SWPin, INPUT);
}

void loop() {
unsigned long curMillis = millis();

if(digitalRead(SWPin) == LOW && fg_sw == false) {
    preMillis2 = curMillis;
    duty = 70;
    fg_sw = true;
    preMillis1 = curMillis + duty;
}

if(fg_sw == true) {
    if(curMillis - preMillis2 >= 2000) {    // 2 sec.
      duty = 1000;
      fg_sw = false;
      preMillis1 = curMillis + duty;
    }
}

if(curMillis - preMillis1 >= duty) {
    preMillis1 = curMillis;

    if(fg_sw == false) {
      NextColor();    // LED display next color
    }
    else {
      LEDflash();   // LED flash
    }
}

}

// LED display next color
void NextColor() {
digitalWrite(RLEDPin, LOW);
digitalWrite(GLEDPin, LOW);
digitalWrite(BLEDPin, LOW);

if(++idx >= 3) {
    idx = 0;
}

DsLED();    // Display LED color
}

// LED flash
void LEDflash() {
static boolean flg = false;

flg = !flg;
if(flg == false) {
    digitalWrite(RLEDPin, LOW);
    digitalWrite(GLEDPin, LOW);
    digitalWrite(BLEDPin, LOW);
}
else {
    DsLED();    // Display LED color
}
}

// Display LED color
void DsLED() {
switch(idx) {
    case 0:
      digitalWrite(RLEDPin, HIGH);
      break;
    case 1:
      digitalWrite(GLEDPin, HIGH);
      break;
    case 2:
      digitalWrite(BLEDPin, HIGH);
      break;
}
}
视频演示:
http://v.youku.com/v_show/id_XMTI5MDUwOTk3Mg==.html



第二个程序:

每摇晃一次板子会将 RGB LED 灯的显示更换颜色,在更换颜色后程序会有 0.2 秒的时间不再侦测摇动开关的动作,这个是为了消除接点弹跳的影响。

程序代码:const int RLEDPin = 10;
const int GLEDPin = 9;
const int BLEDPin = 11;
const int SWPin = 3;

byte idx = 0;
unsigned long preMillis = 0;
boolean fg_sw = false;

void setup() {
pinMode(RLEDPin, OUTPUT);
pinMode(GLEDPin, OUTPUT);
pinMode(BLEDPin, OUTPUT);
pinMode(SWPin, INPUT);

DsLED();    // Display LED color
}

void loop() {
unsigned long curMillis = millis();

if(digitalRead(SWPin) == LOW && fg_sw == false) {
    preMillis = curMillis;
    fg_sw = true;
    NextColor();    // LED display next color
}

if(fg_sw == true) {
    if(curMillis - preMillis >= 200) {
      fg_sw = false;
    }
}
}

// LED display next color
void NextColor() {
digitalWrite(RLEDPin, LOW);
digitalWrite(GLEDPin, LOW);
digitalWrite(BLEDPin, LOW);

if(++idx >= 3) {
    idx = 0;
}

DsLED();    // Display LED color
}

// Display LED color
void DsLED() {
switch(idx) {
    case 0:
      digitalWrite(RLEDPin, HIGH);
      break;
    case 1:
      digitalWrite(GLEDPin, HIGH);
      break;
    case 2:
      digitalWrite(BLEDPin, HIGH);
      break;
}
}
视频演示:
http://v.youku.com/v_show/id_XMTI5MDUxMjMwNA==.html



sky-Hawk where 发表于 2015-7-22 17:33:31

好贴!!!:lol

sky-Hawk where 发表于 2015-7-22 17:35:14

好 很好 非常好 顶

sky-Hawk where 发表于 2015-7-22 17:35:38

高大上!!!

sky-Hawk where 发表于 2015-7-23 15:19:34

赞一个!还有源码,真不错!

expertss 发表于 2015-8-13 09:23:27

非常good!!!10000

azi1974 发表于 2020-1-7 01:01:46

挺有意思的
页: [1]
查看完整版本: LilyPad Arduino USB 板的有趣程序