打开二极管一段时间,以及在Arduino中执行下一个程序。

huangapple go评论87阅读模式
英文:

Switching on the diode for some time, as well as execution of the next program in Arduino

问题

在tinkercad中制作的电路
我使用继电器,因为我只有4根导线连接到LED二极管和这两个开关。

  1. int led = 12; // 红色LED
  2. int s1 = 9; // 开关1
  3. int s2 = 10; // 开关2
  4. int k1 = 3; // 第一个蓝色LED
  5. int k2 = 2; // 第二个蓝色LED
  6. int y1 = 11; // 继电器
  7. unsigned long startTime1 = 0;
  8. unsigned long startTime2 = 0;
  9. const int led1Duration = 6000; // 第一个蓝色LED持续时间
  10. const int led2Duration = 12000; // 第二个蓝色LED持续时间
  11. void setup()
  12. {
  13. pinMode(led, OUTPUT);
  14. pinMode(k1, OUTPUT);
  15. pinMode(k2, OUTPUT);
  16. pinMode(y1, OUTPUT);
  17. pinMode(s1, INPUT);
  18. pinMode(s2, INPUT);
  19. }
  20. void loop()
  21. {
  22. if (digitalRead(s1) == HIGH && digitalRead(s2) == LOW)
  23. {
  24. digitalWrite(k1, HIGH);
  25. digitalWrite(y1, HIGH);
  26. startTime1 = millis();
  27. }
  28. else
  29. {
  30. digitalWrite(led, LOW);
  31. }
  32. if (digitalRead(s2) == HIGH && digitalRead(s1) == LOW)
  33. {
  34. digitalWrite(k2, HIGH);
  35. digitalWrite(y1, HIGH);
  36. startTime2 = millis();
  37. }
  38. else
  39. {
  40. digitalWrite(led, LOW);
  41. }
  42. if (digitalRead(k1) == HIGH && (millis() - startTime1 >= led1Duration))
  43. {
  44. digitalWrite(k1, LOW);
  45. digitalWrite(y1, LOW);
  46. }
  47. if (digitalRead(k2) == HIGH && (millis() - startTime2 >= led2Duration))
  48. {
  49. digitalWrite(k2, LOW);
  50. digitalWrite(y1, LOW);
  51. }
  52. if (digitalRead(k1) == HIGH && digitalRead(k2) == LOW)
  53. {
  54. digitalWrite(led, HIGH);
  55. delay(200);
  56. digitalWrite(led, LOW);
  57. delay(200);
  58. }
  59. if (digitalRead(k2) == HIGH && digitalRead(k1) == LOW)
  60. {
  61. digitalWrite(led, HIGH);
  62. delay(500);
  63. digitalWrite(led, LOW);
  64. delay(500);
  65. }
  66. if (digitalRead(k2) == HIGH && digitalRead(k1) == HIGH)
  67. {
  68. digitalWrite(led, HIGH);
  69. }
  70. }

是否有更简单的方法来做到这一点,因为当我组装它时,开关的响应非常慢,蓝色LED会在一段时间后才会亮起。接下来,我使用了ESP8266,但是3V的继电器无法工作。我该如何使其正常工作?

英文:

The circuit made in tinkercad
I use the relay, because I have only 4 wires to led diode and this two switches.

  1. int led = 12; // red led
  2. int s1 = 9; //switch 1
  3. int s2 = 10; //switch 1
  4. int k1 = 3; // first blue led
  5. int k2 = 2; // second blue led
  6. int y1 = 11; // relay
  7. unsigned long startTime1 = 0;
  8. unsigned long startTime2 = 0;
  9. const int led1Duration = 6000; // first blue led time
  10. const int led2Duration = 12000; // second blue led time
  11. void setup()
  12. {
  13. pinMode(led, OUTPUT);
  14. pinMode(k1, OUTPUT);
  15. pinMode(k2, OUTPUT);
  16. pinMode(y1, OUTPUT);
  17. pinMode(s1, INPUT);
  18. pinMode(s2, INPUT);
  19. }
  20. void loop()
  21. {
  22. if (digitalRead(s1) == HIGH and digitalRead(s2) == LOW)
  23. {
  24. digitalWrite(k1, HIGH);
  25. digitalWrite(y1, HIGH);
  26. startTime1 = millis();
  27. }
  28. else
  29. {
  30. digitalWrite(led, LOW);
  31. }
  32. if (digitalRead(s2) == HIGH and digitalRead(s1) == LOW)
  33. {
  34. digitalWrite(k2, HIGH);
  35. digitalWrite(y1, HIGH);
  36. startTime2 = millis();
  37. }
  38. else
  39. {
  40. digitalWrite(led, LOW);
  41. }
  42. if (digitalRead(k1) == HIGH && (millis() - startTime1 >= led1Duration))
  43. {
  44. digitalWrite(k1, LOW);
  45. digitalWrite(y1, LOW);
  46. }
  47. if (digitalRead(k2) == HIGH && (millis() - startTime2 >= led2Duration))
  48. {
  49. digitalWrite(k2, LOW);
  50. digitalWrite(y1, LOW);
  51. }
  52. if (digitalRead(k1) == HIGH and digitalRead(k2) == LOW)
  53. {
  54. digitalWrite(led, HIGH);
  55. delay(200);
  56. digitalWrite(led, LOW);
  57. delay(200);
  58. }
  59. if (digitalRead(k2) == HIGH and digitalRead(k1) == LOW)
  60. {
  61. digitalWrite(led, HIGH);
  62. delay(500);
  63. digitalWrite(led, LOW);
  64. delay(500);
  65. }
  66. if (digitalRead(k2) == HIGH and digitalRead(k1) == HIGH)
  67. {
  68. digitalWrite(led, HIGH);
  69. }
  70. }

Is there easier way to do that, cause when I assembled it the switches work very slow that blue led turn on after some time. Next I use the esp2866 but the relay for 3V doesn't turn on. How can I make it to work?

答案1

得分: 0

  1. @Peter 是真的:避免阻塞延迟代码。
  2. 这里有一个例子:我稍微简化了你的代码,并添加了else if以使其更可读
  3. 更新1
  4. int led = 12; // 红色LED
  5. int s1 = 9; // 开关1
  6. int s2 = 10; // 开关2
  7. int k1 = 3; // 第一个蓝色LED
  8. int k2 = 2; // 第二个蓝色LED
  9. int y1 = 11; // 继电器
  10. unsigned long startTime1 = 0;
  11. unsigned long startTime2 = 0;
  12. unsigned long t200 = 200;
  13. unsigned long t500 = 500;
  14. const int led1Duration = 6000; // 第一个蓝色LED亮起时间
  15. const int led2Duration = 12000; // 第二个蓝色LED亮起时间
  16. void setup()
  17. {
  18. pinMode(led, OUTPUT);
  19. pinMode(k1, OUTPUT);
  20. pinMode(k2, OUTPUT);
  21. pinMode(y1, OUTPUT);
  22. pinMode(s1, INPUT);
  23. pinMode(s2, INPUT);
  24. }
  25. void loop()
  26. {
  27. if (digitalRead(s1) && !digitalRead(s2)) {
  28. digitalWrite(k1, HIGH);
  29. digitalWrite(y1, HIGH);
  30. startTime1 = millis();
  31. blinkLed200();
  32. } else if (!digitalRead(s1) && digitalRead(s2)) {
  33. digitalWrite(k2, HIGH);
  34. digitalWrite(y1, HIGH);
  35. startTime2 = millis();
  36. blinkLed500();
  37. }
  38. if (digitalRead(k1) && (millis() - startTime1 >= led1Duration)) {
  39. digitalWrite(k1, LOW);
  40. digitalWrite(y1, LOW);
  41. digitalWrite(led, LOW);
  42. }
  43. if (digitalRead(k2) && (millis() - startTime2 >= led2Duration)) {
  44. digitalWrite(k2, LOW);
  45. digitalWrite(y1, LOW);
  46. digitalWrite(led, LOW);
  47. }
  48. }
  49. void blinkLed200() {
  50. if (millis() - t200 > 200) { //每200毫秒闪烁一次
  51. t200 = millis();
  52. digitalWrite(led, !digitalRead(led));
  53. }
  54. }
  55. void blinkLed500() {
  56. if (millis() - t500 > 500) { //每500毫秒闪烁一次
  57. t500 = millis();
  58. digitalWrite(led, !digitalRead(led));
  59. }
  60. }
  61. 这些3V继电器的电阻非常低,我不确定数字输出是否足够强大。个人建议通过晶体管来控制继电器。
英文:

@Peter is true : avoid blocking delay code.

here is an example : I have a little simplified your code and added else if to make it more readable.

update1 :

  1. int led = 12; // red led
  2. int s1 = 9; //switch 1
  3. int s2 = 10; //switch 1
  4. int k1 = 3; // first blue led
  5. int k2 = 2; // second blue led
  6. int y1 = 11; // relay
  7. unsigned long startTime1 = 0;
  8. unsigned long startTime2 = 0;
  9. unsigned long t200 = 200;
  10. unsigned long t500 = 500;
  11. const int led1Duration = 6000; // first blue led time
  12. const int led2Duration = 12000; // second blue led time
  13. void setup()
  14. {
  15. pinMode(led, OUTPUT);
  16. pinMode(k1, OUTPUT);
  17. pinMode(k2, OUTPUT);
  18. pinMode(y1, OUTPUT);
  19. pinMode(s1, INPUT);
  20. pinMode(s2, INPUT);
  21. }
  22. void loop()
  23. {
  24. if (digitalRead(s1) && !digitalRead(s2)) {
  25. digitalWrite(k1, HIGH);
  26. digitalWrite(y1, HIGH);
  27. startTime1 = millis();
  28. blinkLed200();
  29. } else if (!digitalRead(s1) && digitalRead(s2)) {
  30. digitalWrite(k2, HIGH);
  31. digitalWrite(y1, HIGH);
  32. startTime2 = millis();
  33. blinkLed500();
  34. }
  35. if (digitalRead(k1) && (millis() - startTime1 >= led1Duration)) {
  36. digitalWrite(k1, LOW);
  37. digitalWrite(y1, LOW);
  38. digitalWrite(led, LOW);
  39. }
  40. if (digitalRead(k2) && (millis() - startTime2 >= led2Duration)) {
  41. digitalWrite(k2, LOW);
  42. digitalWrite(y1, LOW);
  43. digitalWrite(led, LOW);
  44. }
  45. }
  46. void blinkLed200() {
  47. if (millis() - t200 > 200) { //tick every 200mS
  48. t200 = millis();
  49. digitalWrite(led, !digitalRead(led));
  50. }
  51. }
  52. void blinkLed500() {
  53. if (millis() - t500 > 500) { //tick every 500mS
  54. t500 = millis();
  55. digitalWrite(led, !digitalRead(led));
  56. }
  57. }

The 3V relays have a very low resistance and I am not sure that the digital outputs are powerful enough. Personally I always switch relays via a transistor.

huangapple
  • 本文由 发表于 2023年2月18日 00:44:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/75487038.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定