Я пытаюсь заставить свой проект работать, и что бы я ни делал, на моем светодиодном дисплее 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);
}