C Raspberry Pi,循环延迟函数
这是我的代码:C Raspberry Pi,循环延迟函数,c,function,raspberry-pi,delay,C,Function,Raspberry Pi,Delay,这是我的代码: #include <wiringPi.h> #include <stdio.h> #define LED 18 #define IN 24 int main(void) { wiringPiSetupGpio (); pinMode (LED, OUTPUT); pinMode (IN, INPUT); for (;;) { digitalWrite (LED, 1); delay
#include <wiringPi.h>
#include <stdio.h>
#define LED 18
#define IN 24
int main(void)
{
wiringPiSetupGpio ();
pinMode (LED, OUTPUT);
pinMode (IN, INPUT);
for (;;)
{
digitalWrite (LED, 1);
delay (2000);
digitalWrite (LED, 0);
delay (2000);
if (digitalRead (IN) == 1)
{
for (;;)
{
digitalWrite (LED, 1);
delay(500);
digitalWrite (LED, 0);
delay(500);
}
}
}
return 0;
}
#包括
#包括
#定义LED 18
#定义在24
内部主(空)
{
wiringPiSetupGpio();
引脚模式(LED,输出);
pinMode(输入,输入);
对于(;;)
{
数码写入(LED,1);
延迟(2000年);
数字写入(LED,0);
延迟(2000年);
如果(数字读取(IN)==1)
{
对于(;;)
{
数码写入(LED,1);
延迟(500);
数字写入(LED,0);
延迟(500);
}
}
}
返回0;
}
我使用开关从2000延迟切换到500延迟。问题是,当我按下开关时,它会等待循环结束,直到它变得更快。反之亦然。我需要在代码中的某个地方编写一个函数或循环,允许我按下开关,立即无需等待即可转到较慢/较快的速度。我用C语言编写,在raspberry pi上使用布线pi库和gpio引脚编号 首先,正如您所展示的代码,它永远不会偏离
2000
的延迟,因为没有办法退出(;)循环的初始。这可能是您需要检查和修复的第一件事
就能够提前结束延迟而言,你可以做一些改变:
delay (2000);
进入:
基本上,你有一个单循环,但是每十个时间单位循环一次,而不是每500或2000。您维护一个单独的计数器,该计数器决定LED何时翻转,该计数器的起始值取决于当前循环时间
当开关翻转时,计数器归零,以便它(几乎)立即切换到下一个循环
for (i = 0; i < 2000; i += 10) {
delay (10);
if (digitalRead (IN) == 1)
break;
}
#include <wiringPi.h>
#include <stdio.h>
#define LED 18
#define IN 24
#define RES 10
int main (void) {
int cycleTime, ledState, lastSwitch, currSwitch, timeLeft;
wiringPiSetupGpio ();
pinMode (LED, OUTPUT);
pinMode (IN, INPUT);
cycleTime = 2000; // Initial cycle time
ledState = 0; // and LED state.
lastSwitch = 0; // Previous switch state,
// Start infinite loop with first cycle time.
timeLeft = cycleTime;
for (;;) {
// Delay for minimal time and adjust time left.
delay (RES);
timeLeft = timeLeft - RES;
// Detect switch change.
currSwith = digitalRead (IN);
if (currSwitch != lastSwitch) {
// If so, store new state, change cycle time
// and force IMMEDIATE end of current cycle.
lastSwitch = currSwitch;
cycleTime = 2500 - cycleTime; // switch 500 <-> 2000
timeLeft = 0;
}
// Detect end of cycle.
if (timeLeft <= 0) {
// Toggle LED and start new cycle.
ledState = 1 - ledState;
digitalWrite (LED, ledState);
timeLeft = cycleTime;
}
}
}