ИК-пульт дистанционного управления таймером и RGB - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь заставить свой проект работать, и что бы я ни делал, на моем светодиодном дисплее 4 Di git не отображаются числа, которые счетчик пытается подсчитать. У меня есть таймер обратного / обратного отсчета, который «управляется» ИК-пультом, и есть светодиод RGB, который показывает, когда таймер работает, а когда он приостановлен / выключен. Он действует так, как будто он пытается это сделать в течение доли секунды, а затем возвращается к единственному нулю, когда он должен отображать числа, считая до 60, а затем обратно. Я думаю, все достаточно хорошо определено, чтобы кто-то понял. Надеюсь, я правильно поместил здесь код.

#include <ir_Lego_PF_BitStreamEncoder.h>
#include <boarddefs.h>
#include <IRremoteInt.h>
#include <IRremote.h>

//Define Sensor Pin
const int RECV_PIN = 22;

//Define LED Constants
const int bluePin = 26;
const int greenPin = 28;
const int redPin = 24;

//Define IR Reciever and Results Objects
IRrecv irrecv(RECV_PIN);
decode_results results;

//Button Definition
boolean Power = false;
boolean Play = false;

//Define Integer to Remember Toggle State
int togglestate = 0;

unsigned long time;
unsigned long time2;
int counter = 0;
int counterDir = 1;
bool mainCounter = false;

//Define Pins of 4 digit 7 segment Display
int SevensegPins[7] = {2,3,4,5,6,7,8};

byte SevensegDigits[10][7] = 
{
 {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}, // 0
 {LOW,  HIGH, HIGH, LOW,  LOW,  LOW,  LOW}, // 1
 {HIGH, HIGH, LOW,  HIGH, HIGH, LOW,  LOW}, // 2
 {HIGH, HIGH, HIGH, HIGH, LOW,  LOW,  HIGH},// 3 
 {LOW,  HIGH, HIGH, LOW,  LOW,  HIGH, HIGH},// 4
 {HIGH, LOW,  HIGH, HIGH, LOW,  HIGH, HIGH},// 5
 {HIGH, LOW,  HIGH, HIGH, HIGH, HIGH, HIGH},// 6
 {HIGH, HIGH, HIGH, LOW,  LOW,  LOW,  LOW}, // 7
 {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH},// 8 
 {HIGH, HIGH, HIGH, HIGH, LOW,  HIGH, HIGH} // 9
};

//Define Digital Pins of Display
int d4 = 12;
int d3 = 11;
int d2 = 10;
int d1 = 9;

//Math
long n = 0; //n represents value displayed on displaY
int del = 5; //value is the degree of fine tuning the clock
int count = 0; //Set count=0. Here count is a count value that increases by 1 every 0.1 second, which means 1 second is counted when the value is 10

//Timer
int timer = 500;
int value;

void setup() {

  Serial.begin(9600);
  irrecv.enableIRIn();

  //Set LEDs as Outputs
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  //Set LED Display Pins as Outputs
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);
  for (int i=0; i < 7; i++) pinMode(SevensegPins[i], OUTPUT);
  time = millis();
}

void loop() {

 time2 = millis();
 if (mainCounter == true && time2 - time >= 1000) {
    counter += counterDir;
    if (counter >= 60) counterDir = -1;
    if (counter <= 0) {
     counterDir = 1;
     mainCounter = false;
   }
   Serial.print("counter = ");
   Serial.println(counter);
   time = time2;
  }

  if (irrecv.decode(&results)) {
    int value = results.value;
    Serial.println(value);
    switch (value) {
     case 0xFFA25D:
       //Power ON/OFF
       Power = !Power;
       if (Power) {
         digitalWrite(bluePin, 0xFF);
         digitalWrite(redPin, 0x00);
         digitalWrite(greenPin, 0x00);
         digitalWrite(d1, LOW);
         digitalWrite(d2, LOW);
         digitalWrite(d3, LOW);
         digitalWrite(d4, LOW);
       }
       if (!Power) {
         digitalWrite(bluePin, LOW);
         digitalWrite(redPin, LOW);
         digitalWrite(greenPin, LOW);
         digitalWrite(d1, HIGH);
         digitalWrite(d2, HIGH);
         digitalWrite(d3, HIGH);
         digitalWrite(d4, HIGH);
       }
       delay(1500);
       break;
   }
   switch (value) {
     case 0xFF22DD:
       //Play/Pause
       Play = !Play;
       if (Play) {
         mainCounter = true;
         digitalWrite(bluePin, 0x00);
         digitalWrite(redPin, 0x00);
         digitalWrite(greenPin, 0xFF);

         clear7segDigit(0);
         set7segDigit(0, (n / 1000)); // get the value of thousand
         select7segDigit(0);
         delay(del);//delay 5ms

         clear7segDigit(1);
         set7segDigit(1, (n % 1000) / 100); // get the value of hundred
         select7segDigit(1);
         delay(del);//delay 5ms

         clear7segDigit(2);
         set7segDigit(2, n % 100 / 10); //get the value of ten
         select7segDigit(2);
         delay(del);//delay 5ms

         clear7segDigit(3);
         set7segDigit(3, n % 10); //Get the value of single digit
         select7segDigit(3);
         delay(del);//delay 5ms
       }
       if (!Play) { //Pause
         mainCounter = false;
         digitalWrite(bluePin, 0xFF);
         digitalWrite(redPin, 0x00);
         digitalWrite(greenPin, 0x00);
       }
       delay(1500);
       break;
   }
   irrecv.resume();
 }

}

void select7segDigit (int digit)
{ 
  //The 7-segment LED display is a common-cathode one. So also use digitalWrite to set d1 as high and the LED will go out
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);

  switch (digit)
  {
    case 0:
      digitalWrite(d1, LOW);//Light d1 up
      break;
    case 1:
      digitalWrite(d2, LOW); //Light d2 up
      break;
    case 2:
      digitalWrite(d3, LOW); //Light d3 up
      break;
    default:
      digitalWrite(d4, LOW); //Light d4 up
      break;
  }
}

void set7segDigit(int digit, int number) //clear the 7-segment display screen
{
  select7segDigit(digit);
  for (int i=0; i < 7; i++) digitalWrite(SevensegPins[I], SevensegDigits[number][i]);
}

void clear7segDigit(int digit) //clear the 7-segment display screen
{
  select7segDigit(digit);
  for (int i=0; i < 7; i++) digitalWrite(SevensegPins[i], LOW);
}
...