peter 发表于 2012-2-20 21:32:35

求助::LED循环灯控制!!!

本帖最后由 peter 于 2012-2-20 21:39 编辑

目的:
   用arduino 328控制6个LED每个亮灯2秒后熄灭做循环(LED接I/O8-13),6个通断自锁按钮(开关)控制6颗led起停(I/O1-7口控制灯)。

搞了2个晚上还没有搞出完整程序,求教DX DG支持。

我做了个循环的程序,但是6个开关这块怎样写都是头痛。

循环:
int ledApin=8;
int ledBpin=9;
int ledCpin=10;
int ledDpin=11;
int ledEpin=12;
int ledFpin=13;

void setup()
{
   pinMode(ledApin,OUTPUT);
   pinMode(ledBpin,OUTPUT);
   pinMode(ledCpin,OUTPUT);
   pinMode(ledDpin,OUTPUT);
   pinMode(ledEpin,OUTPUT);
   pinMode(ledFpin,OUTPUT);
}


void loop()
{
digitalWrite(ledApin,HIGH);
digitalWrite(ledBpin,LOW);
digitalWrite(ledCpin,LOW);
digitalWrite(ledDpin,LOW);
digitalWrite(ledEpin,LOW);
digitalWrite(ledFpin,LOW);
delay(2000);
digitalWrite(ledApin,LOW);
digitalWrite(ledBpin,HIGH);
digitalWrite(ledCpin,LOW);
digitalWrite(ledDpin,LOW);
digitalWrite(ledEpin,LOW);
digitalWrite(ledFpin,LOW);
delay(2000);
digitalWrite(ledApin,LOW);
digitalWrite(ledBpin,LOW);
digitalWrite(ledCpin,HIGH);
digitalWrite(ledDpin,LOW);
digitalWrite(ledEpin,LOW);
digitalWrite(ledFpin,LOW);
delay(2000);
digitalWrite(ledApin,LOW);
digitalWrite(ledBpin,LOW);
digitalWrite(ledCpin,LOW);
digitalWrite(ledDpin,HIGH);
digitalWrite(ledEpin,LOW);
digitalWrite(ledFpin,LOW);
delay(2000);
digitalWrite(ledApin,LOW);
digitalWrite(ledBpin,LOW);
digitalWrite(ledCpin,LOW);
digitalWrite(ledDpin,LOW);
digitalWrite(ledEpin,HIGH);
digitalWrite(ledFpin,LOW);
delay(2000);
digitalWrite(ledApin,LOW);
digitalWrite(ledBpin,LOW);
digitalWrite(ledCpin,LOW);
digitalWrite(ledDpin,LOW);
digitalWrite(ledEpin,LOW);
digitalWrite(ledFpin,HIGH);
delay(2000);
}   

tianbin4279 发表于 2012-2-20 21:54:50

搞不懂到底要实现什么效果...你这代码和开关也没啥关系吧

davidce 发表于 2012-2-20 22:18:05

本帖最后由 davidce 于 2012-2-20 22:21 编辑

6个通断自锁按钮(开关)控制6颗led起停(I/O1-7口控制灯)。
这个能说详细点吗?
如果我没理解错的话,有一个简单的方案能实现你要的效果,不需要I/O1-7,直接将通断自锁按钮(开关)插入到相应的LED和GND之间即可。

peter 发表于 2012-2-20 22:57:28

davidce 发表于 2012-2-20 22:18 static/image/common/back.gif
6个通断自锁按钮(开关)控制6颗led起停(I/O1-7口控制灯)。
这个能说详细点吗?
如果我没理解错 ...

功能是这样的:6个LED灯做不断的循环闪动(每个LED闪动2秒然后熄灭,A-B-C-D-F-G-A-B-C-D-E-F不断的循环),按键a-b-c-d-e-f-g对应A-B-C-D-E-F-G   LED灯,按下开关a-b-c-d-e-f-g 就相对的熄灭A-B-C-D-E-F-G的LED灯,用328芯片写个软件。。。

davidce 发表于 2012-2-21 12:11:37

你的 通断自锁按钮 是什么样的?

peter 发表于 2012-2-21 12:27:30

davidce 发表于 2012-2-21 12:11 static/image/common/back.gif
你的 通断自锁按钮 是什么样的?

相当于家里的灯按键 2态(通、断)

davidce 发表于 2012-2-21 13:39:06

按钮按下需要立即响应还是能够允许一定的延时(2秒)?

peter 发表于 2012-2-21 20:50:40

允许一定的延时。。。。

davidce 发表于 2012-2-21 23:43:47

/*
* LED attached from ledpins to ground with 200 resistor
* pushbutton attached to buttonpins from +5V
* 10K resistor attached to buttonpins from ground
*/

// 设置LED引脚:
int myLedPins[] = {8, 9, 10, 11, 12, 13};
// 设置按钮引脚:
int myButtonPins[] = {2, 3, 4, 5, 6, 7};
// 灯数目,也代表按键数目,在当前情况下相等都是 6
int pinCount = 6;
// 亮灯时间长
int timer = 2000;
// 亮灯索引
int LEDindex;
// 当前按钮状态
int buttonState;

void setup() {
// initialize the LED pin as an output:
for (int thisPin = 0; thisPin < pinCount; thisPin++){
    pinMode(myLedPins, OUTPUT);      
}
// initialize the pushbutton pin as an input:
for (int thisPin = 0; thisPin < pinCount; thisPin++){
    pinMode(myButtonPins, INPUT);      
}
//
LEDindex = 0;
buttonState = 0;
}

void loop(){
//
if(LEDindex > 5) {
    LEDindex = 0;
}
// read the state of the pushbutton value:
buttonState = digitalRead(myButtonPins);

// 按下开关熄灭,断开开关点亮
if (buttonState == LOW) {      
    digitalWrite(myLedPins,HIGH);
    delay(timer);
    digitalWrite(myLedPins,LOW);
}
else
{
    delay(timer);
}
//
LEDindex = LEDindex + 1;
}未经测试

peter 发表于 2012-2-22 10:14:47

谢谢davidce  程序测试了,可能是我表达的有点问题,开关是((单刀双掷开关.输入的管脚内部上拉))。
arduino 328 多路开关控制LED
外围控制接点,LED接点:开关量输入口I/O 1-5脚,LED输出口I/O 8-12脚

一共5个LED由外部(5路单刀双掷)开关控制启停.

运行流程:

开关没有控制运行状态:第一个LED工作20秒后断开、轮到第二个LED工作(20秒)、余下循环工作,

(循环状态:A-B-C-D-E-A-B-C-D-E循环工作)。

外部开关控制状态:外部控制开关连接到可以强制停止任何一路工作不影响循环工作状态,

其中任意一个开关控制一个LED停止工作后,循环状态自动把停止工作的LED屏蔽,

循环不能有长时间的停顿(如停止了B路 LED,LED循环时间A/20-C/20-D/20-A/20-C/20-D/20)。

可通过软件进行设置工作时间(调整时间位置在软件中说明)。

davidce 发表于 2012-2-22 11:34:27

本帖最后由 davidce 于 2012-2-24 09:49 编辑

/*
* LED attached from ledpins to ground with 200 resistor
* pushbutton attached to buttonpins from ground
*/

// 设置LED引脚:
int myLedPins[] = {8, 9, 10, 11, 12};
// 设置按钮引脚:
int myButtonPins[] = {1,2, 3, 4, 5};
// 灯数目,也代表按键数目,在当前情况下相等都是 5
int pinCount = 5;
// 在这调整时间
int timer = 20000;
// 亮灯索引
int LEDindex;
// 当前按钮状态
int buttonState;

void setup() {
// initialize the LED pin as an output:
for (int thisPin = 0; thisPin < pinCount; thisPin++){
    pinMode(myLedPins, OUTPUT);      
}
// initialize the pushbutton pin as an input:
for (int thisPin = 0; thisPin < pinCount; thisPin++){
    pinMode(myButtonPins, INPUT);
    digitalWrite(myButtonPins, HIGH);      
}
//
LEDindex = 0;
buttonState = 0;
}

void loop(){
//
if(LEDindex > 5) {
    LEDindex = 0;
}
// read the state of the pushbutton value:
buttonState = digitalRead(myButtonPins);

// 合上开关熄灭,断开开关点亮
if (buttonState == HIGH) {      
    digitalWrite(myLedPins,HIGH);
    delay(timer);
    digitalWrite(myLedPins,LOW);
}
//
LEDindex = LEDindex + 1;
}

peter 发表于 2012-2-22 21:26:44

遇上好人搞惦了。
谢谢 davidce  好人一生平安 万事如意!
谢谢davidce  DX 指导。

peter 发表于 2012-4-14 12:31:20

还是有点问题 延时时间超过30秒就不能切换其他led灯了,程序调整时间可以1秒到5分钟,之间调整

davidce 发表于 2012-4-14 16:41:09

改:
// 在这调整时间
int timer = 20000;
为:
// 在这调整时间
unsigned long timer = 20000;

peter 发表于 2012-4-23 20:06:15

修改了调整时间(比较长时间10分钟)时出现 第一个循环后 第二个不启动循环了。。。。
页: [1] 2
查看完整版本: 求助::LED循环灯控制!!!