7 segment 4 digit blinking

Hey
when the 7 seg show number 10 is blinking
someone can help me ?
thanks
here is the code

#define trigPin1 A1
#define echoPin1 A0
#define trigPin2 A2
#define echoPin2 A3

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>
#include "RTClib.h"
 #include <SparkFunMLX90614.h> 
LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd1(0x26, 16, 2);
IRTherm therm; // Create an IRTherm object to interact with throughout
 
const byte ROWS = 4; // four rows
const byte COLS = 3; // three columns
DateTime now;
 RTC_Millis rtc;
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
 
byte rowPins[ROWS] = {25, 24, 23, 22};
byte colPins[COLS] = {28, 27, 26};
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
 
char key;
int val;
int value;
int i = 1;
bool isnum = false;
 
char week [7] [4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

int pinA = 2;
int pinB = 3;
int pinC = 4;
int pinD = 5;
int pinE = 6;
int pinF = 7;
int pinG = 8;
int DIG1 = 9;
int DIG2 = 10;
int DIG3 = 11;
int DIG4 = 12;
int pinDP = 13;
 
int state = 0;
int count = 1;
int set_distance = 30;
 
int ones = 0;
int tens = 0;
int timer = 4;
 
void readkey () {      //הגדרת פוקנציה לכל מקש
  i = 16;
  key = keypad.getKey();
 
  if (key != NO_KEY && key != '#' && key != '*') {
    //תחילת הקשות
    lcd.setCursor(i, 3);
    lcd.print(key);
    val = (key - '0');
 
    //get more strokes until #
    do {
      key = keypad.getKey();
      isnum = (key >= '0' && key <= '9');
 
      if (isnum) {
        i++;
        lcd.setCursor(i, 3);
        lcd.print(key);
        val = val * 10;
        val += (key - '0');
      }
    }
    while (key != '#');
      //End of key stroke sequence
 
      if (val <= 100) {        // חישוב ערך
 
        lcd.clear();
        lcd.setCursor(5, 2);
        lcd.print(" people can");
        lcd.setCursor(5, 3);
        lcd.print("enter inside");
        lcd.setCursor(0, 2);
        lcd.print(val / 15);
        lcd.setCursor(0, 2);
        lcd.noCursor();
        delay(3000);
        //אפשר לשים פה את הקוד של RTC
      }
 
      else if (val > 100) {
        lcd.clear();
        lcd.setCursor(5, 2);
        lcd.print(" people can");
        lcd.setCursor(5, 3);
        lcd.print(" enter inside");
        lcd.setCursor(0, 2);
        lcd.print(val / 10);
        lcd.setCursor(0, 2);
        lcd.noCursor();
        delay(2000);
      }
 
  }
  else
  {
    //Do Nothing
    return;
  }
}
 
 
void choose_digit(char num) {
  switch (num) {
  default:
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, LOW);
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, HIGH);
  digitalWrite(pinDP, HIGH);
  break; 
  case 1: 
  digitalWrite(pinA, HIGH);
  digitalWrite(pinB, LOW); 
  digitalWrite(pinC, LOW); 
  digitalWrite(pinD, HIGH);
  digitalWrite(pinE, HIGH); 
  digitalWrite(pinF, HIGH);
  digitalWrite(pinG, HIGH);
  digitalWrite(pinDP, HIGH);
  break; 
  case 2: 
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW); 
  digitalWrite(pinC, HIGH); 
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, LOW); 
  digitalWrite(pinF, HIGH);
  digitalWrite(pinG, LOW);
  digitalWrite(pinDP, HIGH); 
  break; 
  case 3:
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW);
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, HIGH); 
  digitalWrite(pinF, HIGH);
  digitalWrite(pinG, LOW);
  digitalWrite(pinDP, HIGH);
  break; 
  case 4:
  digitalWrite(pinA, HIGH);
  digitalWrite(pinB, LOW); 
  digitalWrite(pinC, LOW); 
  digitalWrite(pinD, HIGH);
  digitalWrite(pinE, HIGH);
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, LOW); 
  digitalWrite(pinDP, HIGH);
  break; 
  case 5:
  digitalWrite(pinA, LOW); 
  digitalWrite(pinB, HIGH);
  digitalWrite(pinC, LOW); 
  digitalWrite(pinD, LOW);
  digitalWrite(pinE, HIGH);
  digitalWrite(pinF, LOW); 
  digitalWrite(pinG, LOW); 
  digitalWrite(pinDP, HIGH);
  break; 
  case 6:
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, HIGH); 
  digitalWrite(pinC, LOW); 
  digitalWrite(pinD, LOW); 
  digitalWrite(pinE, LOW); 
  digitalWrite(pinF, LOW);
  digitalWrite(pinG, LOW); 
  digitalWrite(pinDP, HIGH);
  break;
  case 7: 
  digitalWrite(pinA, LOW); 
  digitalWrite(pinB, LOW); 
  digitalWrite(pinC, LOW); 
  digitalWrite(pinD, HIGH); 
  digitalWrite(pinE, HIGH); 
  digitalWrite(pinF, HIGH); 
  digitalWrite(pinG, HIGH); 
  digitalWrite(pinDP, HIGH);
  break;
  case 8:
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);
  digitalWrite(pinC, LOW); 
  digitalWrite(pinD, LOW); 
  digitalWrite(pinE, LOW); 
  digitalWrite(pinF, LOW); 
  digitalWrite(pinG, LOW); 
  digitalWrite(pinDP, HIGH);
  break;
  case 9:
  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW); 
  digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW); 
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW); 
digitalWrite(pinG, LOW); 
digitalWrite(pinDP, HIGH);
break; 
 
  }
}
void pick_digit(int digit) {
  digitalWrite(DIG1, LOW);
  digitalWrite(DIG2, LOW);
  digitalWrite(DIG3, LOW);
  digitalWrite(DIG4, LOW); switch (digit) {
  case 1: digitalWrite(DIG1, HIGH); break; case 2: digitalWrite(DIG2, HIGH); break; case 3: digitalWrite(DIG3, HIGH); break; default: digitalWrite(DIG4, HIGH); break;
  }
}
 
void decimal_place() {
  digitalWrite(pinDP, LOW);
}
void seven_segment(int number) {
  unsigned char thousands = int (number / 1000);
  unsigned char hundreds = int ((number / 100) % 10);
  unsigned char tens = int ((number / 10) % 10);
  unsigned char ones = int (number % 10); //1234
  if (thousands > 0) {
    choose_digit(thousands);
    pick_digit(1);
  }
 
  if ((hundreds > 0) | (thousands > 0)) {
    delay(timer); choose_digit(hundreds);
    pick_digit(2);
  }
 
  if ((tens > 0) || (hundreds > 0) | (thousands > 0)) {
    //decimal_place();
    delay(timer); choose_digit(tens);
    pick_digit(3);
  }
 
 
  // add decimal point
  delay(timer); choose_digit(ones);
  pick_digit(4);
 }
  

void setup() {
 
  lcd.begin();
  lcd.setCursor(7, 0);
  lcd.print("Hello");
  lcd.setCursor(7, 2);
  lcd.print("Wait... ");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 3);
  lcd.print("The store area: ");
//  lcd.setCursor(8, 2);
 lcd1.begin();
  rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
  therm.begin(); //חיישן אתחול
  therm.setUnit(TEMP_C); // יחידות המידה של החיישן

 pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);

 pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);

  pinMode(pinA, OUTPUT);
  pinMode(pinB, OUTPUT);
  pinMode(pinC, OUTPUT);
  pinMode(pinD, OUTPUT);
  pinMode(pinE, OUTPUT);
  pinMode(pinF, OUTPUT);
  pinMode(pinG, OUTPUT);
  pinMode(DIG1, OUTPUT);
  pinMode(DIG2, OUTPUT);
  pinMode(DIG3, OUTPUT);
  pinMode(DIG4, OUTPUT);
  
}

 
void loop() {
 
  readkey(); //קריאה לפונקציה
 
 
  //שעון
  now = rtc.now();
 
  lcd.setCursor(0, 0);
  lcd.print(week[now.dayOfTheWeek()]);
  lcd.print(" ");
  lcd.print(now.year(), DEC);
  lcd.print('/');
  lcd.print(now.month(), DEC);
  lcd.print('/');
  lcd.print(now.day(), DEC);
 
  lcd.setCursor(0, 1);
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  lcd.print(now.minute() , DEC);
  lcd.print(':');
  if (now.second()<10){
    lcd.print("0");
  }
  lcd.print(now.second(), DEC);

  delay(300);
  

 if (therm.read()) //מקבל 1 אם יש קריאה ו -0 אם אין
  {
    lcd1.setCursor(0, 3); //מיקום הטקסט
    lcd1.print("temp: " + String(therm.object() + 3.5, 2)); // הצגת הערך המדידה
    lcd1.print(" ");
    lcd1.print("C");
    lcd1.setCursor(0, 2);
    lcd1.print("Ambient: " + String(therm.ambient(), 2));
    lcd1.print(" ");
    lcd1.print("C");

  }
  
   long duration, distance;
  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(100);
  digitalWrite(trigPin1, LOW);
  duration = pulseIn(echoPin1, HIGH);
  
  distance = (duration /32);

  if (state == 0 && (distance < set_distance) )
  {
    state = 1;
    Serial.println(count);
    count++;
 delay(1000);
  }
 
  if (distance > set_distance) {
    state = 0;
  }    /// אם הרכיב מקבל 0 הוא מחכה עד שיתקבל 1
 
long duration2, distance2;
  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(100);
  digitalWrite(trigPin2, LOW);
  duration2 = pulseIn(echoPin2, HIGH);
  
  distance2 = (duration2 /32);

  if (state == 0 && (distance2 < set_distance) )
  {
    state = 1;
    Serial.println(count);
    count--;
 delay(1000);
  }
 
  if (distance2 > set_distance) {
    state = 0;
    
  }    /// אם הרכיב מקבל 0 הוא מחכה עד שיתקבל 1
  
 seven_segment(count);
 
  }

https://create.arduino.cc/projecthub/Hack-star-Arduino/learn-arduino-port-manipulation-2022-wokwi-systems-simulat-10f9af

i didnt understand anything from this sadly

Hello
Avoid the ussage of the delay() function.
Take a view to gain the knowledge.

Have a nice day and enjoy coding in C++.
Дайте миру шанс!

@orrarduino

1. I would like to suggest that you drive 4-digit cc-type 7-segmeny display unit (Fig-1) using SevSeg.h Library. As a result, a lot of codes from your sketch relating to 7-segment display would be eliminated. The resulting sketch is given in Step-2.
cc4Rq
Figure-1:

2. Revised Sketch (compiled but not tested)

#define trigPin1 A1
#define echoPin1 A0
#define trigPin2 A2
#define echoPin2 A3

#include<SevSeg.h>
SevSeg sevSeg;           //create object sevSeg

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>
#include "RTClib.h"
#include <SparkFunMLX90614.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd1(0x26, 16, 2);
IRTherm therm; // Create an IRTherm object to interact with throughout

const byte ROWS = 4; // four rows
const byte COLS = 3; // three columns
DateTime now;
RTC_Millis rtc;

char keys[ROWS][COLS] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte rowPins[ROWS] = {25, 24, 23, 22};
byte colPins[COLS] = {28, 27, 26};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

char key;
int val;
int value;
int i = 1;
bool isnum = false;

char week [7] [4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

int state = 0;
int count = 1;
int set_distance = 30;

int ones = 0;
int tens = 0;
int timer = 4;

void readkey () {      //הגדרת פוקנציה לכל מקש
  i = 16;
  key = keypad.getKey();

  if (key != NO_KEY && key != '#' && key != '*')
  {
    //תחילת הקשות
    lcd.setCursor(i, 3);
    lcd.print(key);
    val = (key - '0');

    //get more strokes until #
    do
    {
      key = keypad.getKey();
      isnum = (key >= '0' && key <= '9');

      if (isnum)
      {
        i++;
        lcd.setCursor(i, 3);
        lcd.print(key);
        val = val * 10;
        val += (key - '0');
      }
    }
    while (key != '#');
    //End of key stroke sequence
    if (val <= 100)
    { // חישוב ערך
      lcd.clear();
      lcd.setCursor(5, 2);
      lcd.print(" people can");
      lcd.setCursor(5, 3);
      lcd.print("enter inside");
      lcd.setCursor(0, 2);
      lcd.print(val / 15);
      lcd.setCursor(0, 2);
      lcd.noCursor();
      delay(3000);
      //אפשר לשים פה את הקוד של RTC
    }
    else if (val > 100)
    {
      lcd.clear();
      lcd.setCursor(5, 2);
      lcd.print(" people can");
      lcd.setCursor(5, 3);
      lcd.print(" enter inside");
      lcd.setCursor(0, 2);
      lcd.print(val / 10);
      lcd.setCursor(0, 2);
      lcd.noCursor();
      delay(2000);
    }
  }
  else
  {
    //Do Nothing
    return;
  }
}

void setup()
{
  lcd.begin();
  lcd.setCursor(7, 0);
  lcd.print("Hello");
  lcd.setCursor(7, 2);
  lcd.print("Wait... ");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 3);
  lcd.print("The store area: ");
  //  lcd.setCursor(8, 2);
  lcd1.begin();
  rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
  therm.begin(); //חיישן אתחול
  therm.setUnit(TEMP_C); // יחידות המידה של החיישן

  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);

  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);

  byte segDPins[] = {2, 3, 4, 5, 6, 7, 8, 9};  //DPin-2 = seg-a, …, DPin-9 = seg-p
  byte ccDPins[] = {10, 11, 12, 13};          //DPin-10 = cc0, DPin-11 = cc1, .....
  sevSeg.begin(COMMON_CATHODE, 4, ccDPins, segDPins, false, false, false, true);
}

void loop()
{
  readkey(); //קריאה לפונקציה
  //שעון
  now = rtc.now();

  lcd.setCursor(0, 0);
  lcd.print(week[now.dayOfTheWeek()]);
  lcd.print(" ");
  lcd.print(now.year(), DEC);
  lcd.print('/');
  lcd.print(now.month(), DEC);
  lcd.print('/');
  lcd.print(now.day(), DEC);

  lcd.setCursor(0, 1);
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  lcd.print(now.minute() , DEC);
  lcd.print(':');
  if (now.second() < 10)
  {
    lcd.print("0");
  }
  lcd.print(now.second(), DEC);
  delay(300);

  if (therm.read()) //מקבל 1 אם יש קריאה ו -0 אם אין
  {
    lcd1.setCursor(0, 3); //מיקום הטקסט
    lcd1.print("temp: " + String(therm.object() + 3.5, 2)); // הצגת הערך המדידה
    lcd1.print(" ");
    lcd1.print("C");
    lcd1.setCursor(0, 2);
    lcd1.print("Ambient: " + String(therm.ambient(), 2));
    lcd1.print(" ");
    lcd1.print("C");
  }
  long duration, distance;
  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(100);
  digitalWrite(trigPin1, LOW);
  duration = pulseIn(echoPin1, HIGH);

  distance = (duration / 32);

  if (state == 0 && (distance < set_distance) )
  {
    state = 1;
    Serial.println(count);
    count++;
    delay(1000);
  }

  if (distance > set_distance)
  {
    state = 0;
  }    /// אם הרכיב מקבל 0 הוא מחכה עד שיתקבל 1

  long duration2, distance2;
  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(100);
  digitalWrite(trigPin2, LOW);
  duration2 = pulseIn(echoPin2, HIGH);

  distance2 = (duration2 / 32);

  if (state == 0 && (distance2 < set_distance) )
  {
    state = 1;
    Serial.println(count);
    count--;
    delay(1000);
  }

  if (distance2 > set_distance)
  {
    state = 0;
  }    /// אם הרכיב מקבל 0 הוא מחכה עד שיתקבל 1

  seven_segment(count);
}

void seven_segment(int numberToShow)
{
  sevSeg.setNumber(numberToShow, 0, LOW);  //no decimal point
  sevSeg.refreshDisplay();
}

3. The SevSeg.h Library contains the following functions and declarations to drive multiplexed 7-segment display unit.
(1) sevSeg.begin(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);

sevSeg.begin(displayType, numOfDigits, ccDPins, segDPins, softCurrentLimitResistor, updateWithDelays, allowLeadingZeros, disableDecPoint);

arg1= Display type :
Value = COMMON_CATHODE or COMMON_ANODE.
When COMMOM_CATHODE is selected, the program automatically consults digit-vs-ccCode LUT Table of the library to collect the ccCodes for the digits to be shown on display unit.

arg2 = Number of digits to be shown: Value = 1 to 8

arg3 = an array that contains DPins with which the cc-pins of the digits are to be connected

arg4 = an array that contains DPins with which the segments-pins of the digits are to be connected

arg5 = SoftcurrentLimitResistor (Software controlled): Value = true or false
true means software controlled current limit resistor;
false means that the current limiting resistors are installed manually.

arg6 = updateWithDelays : true or false (choose false; why? No idea.)

arg7 = allowLeadingZeros : Value = true or false;
true means keep the leading zeroes like: 05

arg8 = disableDecPoint : Value = true or false;
false means that we can show decimal point at any position of the display unit. The position is determined by sevseg.SetNumber() function.

===> sevseg.begin(COMMON_CATHODE, 2, ccDPins, segDPins, false, false, false, true);

(2) sevenSeg.SetNumber(arg1, arg2, arg3);

===> sevenSeg.SetNumber(numberToShow, placeOfDecimalPoint, base);

arg1 = integer value to be displayed
Declaration:

byte valueToShow = 25;   //range: 0 to 255;
unsigned int valueToShow = 0 to 65535;

arg2 = after how many digits (counting from right), the decimal point is to be placed
Value: 1 //23.5 is an example of 3-digit display with decimal point before 1-digit from RHS.

arg3 = base in which the “number of arg1” is to be shown; Value = HIGH or LOW
HIGH means that the hexadecimal digits (0 – 9, A- F) will appear on display unit.
LOW means that decimal digits (0 – 9) will appear on the display unit.

(3) sevSeg.refreshDisplay(); //performs the action of display refreshing
As the digits of a multiplexed display unit share common segment lines, we must show the digits one after another with some delay in-between; otherwise, the display unit will be frozened to a single digit. This process is known as refreshing. The sevSeg.refreshDisplay() function performs this refreshing job. The C++ codes of this function are within the given Library.

look, here , when no DIG go HIGH (remain LOW) then it can be used as off-period of blinking :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.