arduino - Arduino 按钮继电器控制和 LED
问题描述
我在 arduino 编码方面并不专业,我对草图有疑问。我需要用按钮控制继电器的代码。我有 3 个按钮、3 个 LED 和 2 个继电器。按下 1 个按钮时选择第一个 LED,如果按下两次则选择第二个 LED。当按下第二个按钮一次然后选择第一个继电器,如果两次按下然后选择第二个继电器,最后启动按钮启动所有这些命令,然后点亮第三个 LED。请帮忙!这是我的代码:
int button1=2;
int button2=3;
int button3=4;
int relay1=8;
int relay2=9;
int led=5;
int led2=6;
int led3=7;
int button1State=0;
int button2State=0;
int button3State=0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(button1, INPUT_PULLUP);
pinMode(button2,INPUT_PULLUP);
pinMode(button3,INPUT_PULLUP):
pinMode(relay1, OUTPUT);
digitalWrite(relay1, HIGH);
pinMode(relay2,OUTPUT);
digitalWrite(relay2, HIGH);
pinMode(led,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
button1State = digitalRead(button1);//when once click turn led
if(button1State==HIGH){
digitalWrite(led,HIGH);
delay(wait);
if(button1State==HIGH){ //when clicked twice then turn on led 2, but i dont know how to do it
digitalWrite(led2,HIGH);
delay(wait)
}
}
if (button2State== HIGH){
digitalWrite(relay1,HIGH);
delay(wait);
if(button2State==HIGH){ //when clicked twice turn on second relay but i dont know how to do this
digitalWrite(relay2,HIGH);
delay(wait);
}
if(button2State==HIGH){
digitalWrite(relay1&&relay2,HIGH);
delay(wait);
}
}
//and click start i dont kknow how to do this :((
//when select led then circuits run for 10 sec,if led 2 select then circuit runs for 20 sec
}
解决方案
画出你的代码流程图,你很快就会发现它不是你想做的。
让我们回顾一下你的几行:
在这里,您读取了按钮 1 在那一刻的状态
button1State = digitalRead(button1);//when once click turn led
如果该状态为高,则打开 LED 并等待。(顺便说一句,此处未定义等待,这将导致错误)
if(button1State==HIGH){
digitalWrite(led,HIGH);
delay(wait);
然后,如果按钮状态为高,则打开第二个 LED 并等待。和上面一样的问题。
if(button1State==HIGH){ //when clicked twice then turn on led 2, but i dont know how to do it
digitalWrite(led2,HIGH);
delay(wait)
}
...
所以你的第一个问题是你没有更新button1State。它仍然是您在开始时读取的值。
如果你只是自言自语,你会如何接近?如果每次按下按钮都想做三件不同的事情,你需要做什么?
你需要找出按钮被按下(你问自己我按下按钮了吗?)
您需要知道您按下按钮的频率(您数 1、2、3、1、2、3)
你需要为每次按下按钮做不同的事情(如果1然后做a,如果2然后做b,如果3然后做c ...
您还需要知道按钮是否仍被按下
所以你需要一个计算按钮按下的变量。
以下代码只是为了向您展示如何处理事情。我没有测试它是否可以编译,也没有实现你需要的一切。只是给你一个起点。
同样在某些时候你必须重置你的计数器。您可以为此使用模运算符。现在去学习吧!
int button1Count = 0;
int lastButton1State = LOW;
// your other variables
void setup()
{
pinMode(button1, INPUT_PULLUP);
}
void loop()
{
int button1State = digitalRead(button1);
// button 1 has just been pressed
if (button1State && !lastButton1State)
{
button1Count++;
}
lastButton1State = button1State;
switch(button1State) {
case 1:
digitalWrite(led, HIGH);
break;
case 2:
digitalWrite(led2, HIGH);
break;
}
}
当你成功实现这一点时,你应该了解如何编写非阻塞 arduino 代码。
推荐阅读
- php - 有没有办法用数组数据为sql代码创建foreach
- c# - 如何解决起始位置问题?
- c# - 如何从 ShellViewModel.cs 文件访问 ListBox 的 selectedItems?
- android - 在软连字符处换行
- c# - 如何在 C# 中对 BamBhooHr Api 发出 POST 请求
- java - SuppressWarnings("deprecation") 在java中的一行
- matplotlib - 从 Contourplot 中获取价值 - Python Matplotlib
- odata - odata 是否支持通过多个 id 获取实体?
- python - 当我将多个数据帧存储在数据帧列表中并且我记得其中一个时,有没有办法格式化输出的列标题?
- javascript - 为什么我的导航栏出现在滚动条的顶部?