Need some help to verify the code, please help

Hi. This is about a binary coded decimal clock.

This is the RTC library I'm using.
More info about the library.

I have a spare push-button which I included in my circuit from the previous setup of my project, which is not doing anything right now. I would like to use that button to switch the clock from clock mode to alarm mode so that I can set the alarm time using the same "set hour/min" buttons that I normally use to set the time. And then, once the alarm is set, using the same "mode change"button, switch it back to the clock mode. Right now, A0 and A3 analog input pins are available on the arduino. I might use one of those as my "mode change" button.

I may also need to use PIN 0 digital output on arduino to activate the buzzer for the alarm sound. I think PIN 0 digital output is available in my code, is that right? And perhaps, the buzzer would sound for 20 seconds and switch itself off.

I think I would need a buzzer for the alarm clock and some changes in the code.

Can anyone help?

Here is my code:

/*
  An open-source binary clock for Arduino.
  Based on the code from by Rob Faludi (http://www.faludi.com)
  Code under (cc) by Lucas Berbesson
  http://creativecommons.org/license/cc-gpl
*/
#include <DS3231.h>

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);

// Init a Time-data structure
Time  t;


int second = 0, minute = 0, hour = 0; //start the time on 00:00:00
int munit, hunit, minuteTens, hourTens, valm = 0, valh = 0, ledstats, i;
// LEDS positions matrix
int leds[4][4] = {
  {-1, 11, -1,  4},
  {-1, 10,  7,  3},
  {13,  9,  6,  2},
  {12,  8,  5,  1}
};
void setup() {
  //set outputs
  for (int k = 0; k <= 13; k++) {
    pinMode(k, OUTPUT);
    digitalWrite(k, LOW);

  }
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  rtc.begin();
}

void loop() {
  t = rtc.getTime();
  second = t.sec;
  minute = t.min;
  hour = t.hour;


  munit = minute % 10; //sets the variable munit and hunit for the unit digits
  hunit = hour % 10;
  minuteTens = (int)(minute / 10);
  hourTens = (int)(hour / 10);
  //minutes units
  if (munit & 1) {
    digitalWrite(leds[3][3], HIGH);
  } else {
    digitalWrite(leds[3][3], LOW);
  }
  if (munit & 2) {
    digitalWrite(leds[2][3], HIGH);
  } else {
    digitalWrite(leds[2][3], LOW);
  }
  if (munit & 4) {
    digitalWrite(leds[1][3], HIGH);
  } else {
    digitalWrite(leds[1][3], LOW);
  }
  if (munit & 8) {
    digitalWrite(leds[0][3], HIGH);
  } else {
    digitalWrite(leds[0][3], LOW);
  }

  //minutes
  if (minuteTens & 1)  {
    digitalWrite(leds[3][2], HIGH);
  } else {
    digitalWrite(leds[3][2], LOW);
  }
  if (minuteTens & 2)  {
    digitalWrite(leds[2][2], HIGH);
  } else {
    digitalWrite(leds[2][2], LOW);
  }
  if (minuteTens & 4) {
    digitalWrite(leds[1][2], HIGH);
  } else {
    digitalWrite(leds[1][2], LOW);
  }

  //hour units
  if (hunit & 1) {
    digitalWrite(leds[3][1], HIGH);
  } else {
    digitalWrite(leds[3][1], LOW);
  }
  if (hunit & 2) {
    digitalWrite(leds[2][1], HIGH);
  } else {
    digitalWrite(leds[2][1], LOW);
  }
  if (hunit & 4) {
    digitalWrite(leds[1][1], HIGH);
  } else {
    digitalWrite(leds[1][1], LOW);
  }
  if (hunit & 8) {
    digitalWrite(leds[0][1], HIGH);
  } else {
    digitalWrite(leds[0][1], LOW);
  }

  //hour
  if (hourTens & 1)  {
    digitalWrite(leds[3][0], HIGH);
  } else {
    digitalWrite(leds[3][0], LOW);
  }
  if (hourTens & 2)  {
    digitalWrite(leds[2][0], HIGH);
  } else {
    digitalWrite(leds[2][0], LOW);
  }

  valm = digitalRead(A1);    // add one minute when pressed
    if (valm == LOW) {
    minute++;
    if (minute == 60) {
      hour++;
      if (hour == 24) hour = 0;
      minute = 0;
    }
    second = 0;
    rtc.setTime(hour, minute, second);
    delay(250);
  }

  valh = digitalRead(A2);    // add one hour when pressed
    if (valh == LOW) {  
    hour++;
    if (hour == 24) {
      hour = 0;
      minute = 0;  
    }
    second = 0;
    rtc.setTime(hour, minute, second);
    delay(250);
  }
  delay(50);
}

I may also need to use PIN 0 digital output on arduino to activate the buzzer for the alarm sound

Not usually a good idea. You seem to have several analogue pins available.

I am looking to add something like this. But it won't work with my code. I found this code online, it is from another project. Apparently, something is missing. may be, not declared or something:

void buttons()
{
  // LOW == button pressed
  // HIGH == button released
  // (this is because pullup resistors are used)
  
  // Decide if we should set time or alarm:
  if(setting_switch_state==LOW) // LOW = Set time
  {
    hours_p = &hours;
    minutes_p = &minutes;
  }
  else // HIGH = Set alarm
  {
    hours_p = &alarm_hours;
    minutes_p = &alarm_minutes;
  }

I want to be able to switch the clock between clock and alarm modes.

Can anybody please help adapt this code to my sketch?

Cheers.

Here is another code. This one is also from another project which does not use an RTC module. I don't know how to incorporate this code into my project. May be the changes are minimal. Can anyone help?
The code size is large, it won't let me post. I am dividing it into 2 parts.

PART 1.

//определим выводы светодиодов подключаемых к arduino 
  int led0 = 0;
  int led1 = 1;
  int led2 = 2;
  int led3 = 3;
  int led4 = 4;
  int led5 = 5;
  int led6 = 6;
  int led7 = 7;
  int led8 = 8;
  int led10 = 10;
  int led11 = 11;
  int led12 = 12;
  int led13 = 13;
  
//выводы кнопок
  int buttonHour = 0;
  int buttonMinute = 1;
  int buttonAlarm = 2;
  int buttonOnOff = 3;
//вывод динамика
  int speakerPin = 9;
  
  //считанные с аналоговых разьемов значения
  int hourValue, minuteValue, alarmValue, ledsOnOffValue;

  //сохраняем время
  int secondClock = 0, minuteClock = 0, hourClock = 0;
  //сохраняем время будильника
  int secondAlarm = 0, minuteAlarm = 0, hourAlarm = 0;
 
 //Для вывода младшего рязряда минут и часов
  int lowNumMinuteClock, lowNumHourClock;
 //тоже самое, только для будильника
  int lowNumMinuteAlarm, lowNumHourAlarm;
  //предыдущее значение времени
  unsigned long oldTime = 0;
  //по значению в них видно нажата кнопка или нет
  int minuteButtValue = 0, hourButtValue = 0;
  //режим часов или будильника
  boolean modeClock = true, modeAlarm = false;
  //активирован ли будильник
  boolean alarmOnOff = false;
  
  //для динамика
  int length = 28; 
  int tempo = 300;
  char notes[] = "caagafcccaahgCCddhhagffaagaf "; 
  int beats[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 };
  

  void setup()
  {
    pinMode(led0, OUTPUT);  pinMode(led1, OUTPUT);  pinMode(led2, OUTPUT);  
    pinMode(led3, OUTPUT);  pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); 
    pinMode(led6, OUTPUT);  pinMode(led7, OUTPUT);  pinMode(led8, OUTPUT);
    pinMode(led10, OUTPUT);  pinMode(led11, OUTPUT);  pinMode(led12, OUTPUT);  
    pinMode(led13, OUTPUT);
    
    pinMode(speakerPin, OUTPUT);
  }


void timing()
  {
    if (millis()-oldTime >= 1000)
    {
      oldTime = millis();
      secondClock++;
    }
    if (secondClock >= 60) { minuteClock++; secondClock = 0; }
    if (minuteClock >= 60) { hourClock++;   minuteClock = 0; }
    if (hourClock >= 24)   { hourClock = 0; minuteClock = 0; }  
    
    if (minuteAlarm >= 60) { minuteAlarm = 0; }
    if (hourAlarm >= 24)   { hourAlarm = 0; }  
    //надо посчитать остаток от деления на 10
    //для получения младшых разрядов чисел минут и часов
    
    lowNumMinuteAlarm = minuteAlarm%10;
    lowNumHourAlarm = hourAlarm%10;
    
    lowNumMinuteClock = minuteClock%10;
    lowNumHourClock = hourClock%10;
  }
  
void lightOnLed(boolean modeClock)
{    
      //Переменные для хранения значений секунд, минут и часов для непосредственно вывода
    int second = 0, minute = 0, hour = 0;
    int lowNumMinute, lowNumHour;
    if (modeClock == false)
    {
      hour = hourAlarm;
      minute = minuteAlarm;
      lowNumHour = lowNumHourAlarm;
      lowNumMinute = lowNumMinuteAlarm;
    }else
    {
      hour = hourClock;
      minute = minuteClock;
      lowNumHour = lowNumHourClock;
      lowNumMinute = lowNumMinuteClock;
    }
    ledsOnOffValue = analogRead(buttonOnOff);
    // зажигаем светодиодики, если нажата кнопка, иначе гасим их
    if ((ledsOnOffValue < 1000 && modeAlarm == true && alarmOnOff == true) || (ledsOnOffValue < 1000 && modeClock == true))
    {
      //отображение часов
      //верхний ряд светодиодов, первый справа
      if(hour >= 10 && hour < 20) {digitalWrite(led0, HIGH);}
      else { digitalWrite(led0,LOW);}
      
      //второй справа светодиод
      if(hour >= 20 && hour < 24) {digitalWrite(led1, HIGH);} 
      else {digitalWrite(led1,LOW);}
      
      //Нижний ряд светодиодов, первый светодиод справа
      if (lowNumHour==1 || lowNumHour==3 || lowNumHour==5 || lowNumHour==7 || lowNumHour==9){ digitalWrite(led2, HIGH);}
      else {digitalWrite(led2, LOW);}
      
      //второй светодиод справа
      if (lowNumHour==2 || lowNumHour==3 || lowNumHour==6 || lowNumHour==7){digitalWrite(led3, HIGH);}
      else {digitalWrite(led3, LOW);}
      
      //третий светодиод справа
      if (lowNumHour==4 || lowNumHour==5 || lowNumHour==6 || lowNumHour==7){ digitalWrite(led4, HIGH);}
      else{ digitalWrite(led4, LOW);}
      
      //четвертый светодиод справа
      if (lowNumHour==8 || lowNumHour==9){digitalWrite(led5, HIGH);}
      else{digitalWrite(led5, LOW);}
      
      //отображение минут
      //верхний ряд светодиодов, первый справа светодиод
      if((minute >= 10 && minute < 20) || (minute >= 30 && minute < 40) || (minute >=50 && minute < 60)) {digitalWrite(led6, HIGH);} 
      else {digitalWrite(led6,LOW);}
      //второй справа светодиод
      if(minute >= 20 && minute < 40) {digitalWrite(led7, HIGH);} 
      else {digitalWrite(led7,LOW);}
      //третий светодиод справа
      if(minute >= 40 && minute < 60) {digitalWrite(led8, HIGH);} 
      else {digitalWrite(led8,LOW);}
      
      //нижний ряд светодиодов, первый справа
      if (lowNumMinute==1 || lowNumMinute==3 || lowNumMinute==5 || lowNumMinute==7 || lowNumMinute==9) {digitalWrite(led10, HIGH);}  
      else {digitalWrite(led10, LOW);}
      //второй справа светодиод
      if (lowNumMinute==2 || lowNumMinute==3 || lowNumMinute==6 || lowNumMinute==7) {digitalWrite(led11, HIGH);}  
      else {digitalWrite(led11, LOW);}
      //третий справа светодиод
      if (lowNumMinute==4 || lowNumMinute==5 || lowNumMinute==6 || lowNumMinute==7){digitalWrite(led12, HIGH);}  
      else { digitalWrite(led12, LOW);}
      //четвертый справа светодиод
      if (lowNumMinute==8 || lowNumMinute==9){digitalWrite(led13, HIGH);}  
      else {digitalWrite(led13, LOW);}
    }else
    {
       for(int i=0;i<=13;i++){  digitalWrite(i, LOW); }
    }
}

PART2.

void readButtons()
{
    alarmValue = analogRead(buttonAlarm);
    //обрабатываем нажатие на кнопку переключения режимов
    if (alarmValue < 1000)
    {
      if (modeClock == true)
      {
        modeClock = false;
        modeAlarm = true;
        tone(speakerPin, 1900);
        delay(200);
        noTone(speakerPin);
        
        //после переключения режимов, обнуляем все сигналы на цифровых выходах
        for(int i=0;i<=13;i++)  { digitalWrite(i, LOW); }
        delay(200);
      } else
      {
        modeClock = true;
        modeAlarm = false;
        //после переключения режимов, обнуляем все сигналы на цифровых выходах
        for(int i=0;i<=13;i++) { digitalWrite(i, LOW);}
        delay(200);
      }
       
    }
    //считывание нажатий на кнопjr изменения часов и минут
    hourValue = analogRead(buttonHour);
    minuteValue = analogRead(buttonMinute);
    //в режиме будильника при нажатии на кнопки увеличения минут и часов включают или выключают будильник()
    if (hourValue < 1000 && minuteValue < 1000)
    {
      if (alarmOnOff == false) {alarmOnOff = true;}else {alarmOnOff = false;}
    }
    //обработка нажатия на кнопку прибавления часов
    if (modeClock == true)
    {
      if (hourValue < 1000)
      {
        hourClock = hourClock + 1;
        delay(200);
      }
      //нажатие на кнопку прибавления минут
      
      if (minuteValue < 1000)
      {
        minuteClock = minuteClock + 1;;
        delay(200);
      }
    }else 
    //увеличиваем значение минут и часов будильника
    {
      if (hourValue < 1000)
      {
        hourAlarm = hourAlarm + 1;
        delay(200);
      }
      //нажатие на кнопку прибавления минут
      
      if (minuteValue < 1000)
      {
        minuteAlarm = minuteAlarm + 1;;
        delay(200);
      } 
    }
}

void playTone(int tone, int duration) 
{
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);      
  }
}

void playNote(char note, int duration) 
{
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
  
  // проиграть тон, соответствующий ноте
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);

    }
  }
}

void playAlarm()
{
  if ((secondClock == secondAlarm && minuteClock == minuteAlarm && hourClock == hourAlarm && alarmOnOff == true))
  {  
      for (int i = 0; i < length; i++) 
      {
        playNote(notes[i], beats[i] * tempo);
        delay(tempo / 4); 
        //считаываем значение с кнопки переключения режимов, (при проигрывании мелодии она будет выключать будильник)
        alarmValue = analogRead(buttonAlarm);
        if (alarmValue < 1000)
        {
          alarmOnOff = false;
          goto exit; 
        }
      }
     //прибавляем длительность мелодии к времени, чтобы не сбить его
     secondClock=secondClock+10;
     //если пользователь не выключил будильник сам, тогда мелодия повторится на следующей минуте
     minuteAlarm++;
  }
exit:return;
}

//главный цикл, вызов всех процедур
void loop()
{
    timing();
    lightOnLed(modeClock);
    readButtons(); 
    playAlarm();
}

Can I suggest that you stop thinking in terms of incorporating someone else's code into yours and write your own.

Your program will be in one of several states such as showing time, setting clock time, setting alarm time, alarm sounding. The first step is to read when the "mode" button becomes pressed and to change the mode when it does. To start with just display a message on the Serial monitor indicating the current mode. Look at the StateChangeDetection example to see how to detect a change of button state.

Are you intending to use the alarm capability of the clock chip or are you planning to do it another way ?

UKHeliBob:
Can I suggest that you stop thinking in terms of incorporating someone else's code into yours and write your own.

Your program will be in one of several states such as showing time, setting clock time, setting alarm time, alarm sounding. The first step is to read when the "mode" button becomes pressed and to change the mode when it does. To start with just display a message on the Serial monitor indicating the current mode. Look at the StateChangeDetection example to see how to detect a change of button state.

Are you intending to use the alarm capability of the clock chip or are you planning to do it another way ?

I would love to. Except, I'm not sure how to write a code. To be honest, I did not even know this DS3231 clock chip had alarm clock capabilities. Ofcourse, if there is a simpler way, I would love to be able to use it. It is just that I don't know how to.

Like I said, right now I have 2 buttons. The buttons are used to set hours/minutes and the RTC does a great job at keeping time even when the main power is lost. The (as per the code in my main post above) code and the setup work flawlessly. That is why I'd rather edit my current code because I like how the LEDs are nicely put into matrix format, rather than try to use someone else's code, like you said.

My goal is to use the 3rd spare button (which I have wired into the circuit, but dangling free, waiting to be used for something) to switch the clock between alarm and clock modes and use the regular "set minutes/set hours" buttons to set time in both clock and alarm modes and be able to toggle between the modes.

Can you help? This item is a gift for my wife. She wants it to have alarm feature too. So, I am desperately trying to add it :))

I know that this forum is not meant for this purpose. But I have a completely different profession than coding and it is not feasible for me to learn coding only to finish this one project for my wife.

Can somebody help me?

Whoever helps me with this one code, will receive a nice little souvenier from where I live (Azerbaijan Republic). PROMISSED! Because this project is very special for me.

Cheers.

Please don't take this as an unkindness, but as pragmatic advice. Realistically, you have two options

  1. Write the code
  2. Pay someone to write it

This forum, and the Gigs/Collaborations forum, exist to serve these two needs. But this one exists (or has evolved) to be a learning forum, where you can incrementally acquire the skills you need to do it yourself. But the road to becoming an independent, capable programmer is a linear, step by step process and you can't leap past your current level of knowledge reliably.

Your project seems very familiar, I think it is a continuation of a another very long thread. On this Christmas morning I would not like to hand you gloom and doom. But your expectations of getting the kind of help you need here, is significantly impaired by the skills gap I refer to.

You have to decide what is more important to you, getting the project done, or following the learning path. That path really requires that you put this project aside, or give it to a professional to do. Then start working on some simpler projects so that the glimmer of understanding will dawn and you will have the confidence and ability to create.

arduinoware:
To be honest, I did not even know this DS3231 clock chip had alarm clock capabilities.

Now here is an example of what I am talking about. The data sheet for the DS3231 can easily be downloaded from the manufacturer. That fact is plainly obvious if you read it. You must begin to develop some independent investigative skills. It's how we get projects done.

Again, if all you really want is a cool clock for your wife, then post in the Gigs/Collaborations forum and explain the terms. One problem you have is that the code you are starting with, is pure garbage. No programmer worth their salt would be interested in working with it (this is likely a big part of the reason why nobody here has done it for you, sometimes it happens!). They would want to design from scratch. That's a lot of work.

I am with aarg on this. You could build up your skills and develop this project to do what you want but I fear that it will be a painful process. This in no way should be taken as a criticism of you, but in order to provide help to you then you will need a much deeper understanding of the Arduino and the RTC which will take time to acquire.

I try to compile the following code but I get this error message:

'goto': does not name a valid declaration type or prefix keyword.

Any ideas why?

Cheers.

PART 1. (Code too large to paste it at once)

//определим выводы светодиодов подключаемых к arduino 
  int led0 = 0;
  int led1 = 1;
  int led2 = 2;
  int led3 = 3;
  int led4 = 4;
  int led5 = 5;
  int led6 = 6;
  int led7 = 7;
  int led8 = 8;
  int led10 = 10;
  int led11 = 11;
  int led12 = 12;
  int led13 = 13;
  
//выводы кнопок
  int buttonHour = 0;
  int buttonMinute = 1;
  int buttonAlarm = 2;
  int buttonOnOff = 3;
//вывод динамика
  int speakerPin = 9;
  
  //считанные с аналоговых разьемов значения
  int hourValue, minuteValue, alarmValue, ledsOnOffValue;

  //сохраняем время
  int secondClock = 0, minuteClock = 0, hourClock = 0;
  //сохраняем время будильника
  int secondAlarm = 0, minuteAlarm = 0, hourAlarm = 0;
 
 //Для вывода младшего рязряда минут и часов
  int lowNumMinuteClock, lowNumHourClock;
 //тоже самое, только для будильника
  int lowNumMinuteAlarm, lowNumHourAlarm;
  //предыдущее значение времени
  unsigned long oldTime = 0;
  //по значению в них видно нажата кнопка или нет
  int minuteButtValue = 0, hourButtValue = 0;
  //режим часов или будильника
  boolean modeClock = true, modeAlarm = false;
  //активирован ли будильник
  boolean alarmOnOff = false;
  
  //для динамика
  int length = 28; 
  int tempo = 300;
  char notes[] = "caagafcccaahgCCddhhagffaagaf "; 
  int beats[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 };
  

  void setup()
  {
    pinMode(led0, OUTPUT);  pinMode(led1, OUTPUT);  pinMode(led2, OUTPUT);  
    pinMode(led3, OUTPUT);  pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); 
    pinMode(led6, OUTPUT);  pinMode(led7, OUTPUT);  pinMode(led8, OUTPUT);
    pinMode(led10, OUTPUT);  pinMode(led11, OUTPUT);  pinMode(led12, OUTPUT);  
    pinMode(led13, OUTPUT);
    
    pinMode(speakerPin, OUTPUT);
  }


void timing()
  {
    if (millis()-oldTime >= 1000)
    {
      oldTime = millis();
      secondClock++;
    }
    if (secondClock >= 60) { minuteClock++; secondClock = 0; }
    if (minuteClock >= 60) { hourClock++;   minuteClock = 0; }
    if (hourClock >= 24)   { hourClock = 0; minuteClock = 0; }  
    
    if (minuteAlarm >= 60) { minuteAlarm = 0; }
    if (hourAlarm >= 24)   { hourAlarm = 0; }  
    //надо посчитать остаток от деления на 10
    //для получения младшых разрядов чисел минут и часов
    
    lowNumMinuteAlarm = minuteAlarm%10;
    lowNumHourAlarm = hourAlarm%10;
    
    lowNumMinuteClock = minuteClock%10;
    lowNumHourClock = hourClock%10;
  }
  
void lightOnLed(boolean modeClock)
{    
      //Переменные для хранения значений секунд, минут и часов для непосредственно вывода
    int second = 0, minute = 0, hour = 0;
    int lowNumMinute, lowNumHour;
    if (modeClock == false)
    {
      hour = hourAlarm;
      minute = minuteAlarm;
      lowNumHour = lowNumHourAlarm;
      lowNumMinute = lowNumMinuteAlarm;
    }else
    {
      hour = hourClock;
      minute = minuteClock;
      lowNumHour = lowNumHourClock;
      lowNumMinute = lowNumMinuteClock;
    }
    ledsOnOffValue = analogRead(buttonOnOff);
    // зажигаем светодиодики, если нажата кнопка, иначе гасим их
    if ((ledsOnOffValue < 1000 && modeAlarm == true && alarmOnOff == true) || (ledsOnOffValue < 1000 && modeClock == true))
    {
      //отображение часов
      //верхний ряд светодиодов, первый справа
      if(hour >= 10 && hour < 20) {digitalWrite(led0, HIGH);}
      else { digitalWrite(led0,LOW);}
      
      //второй справа светодиод
      if(hour >= 20 && hour < 24) {digitalWrite(led1, HIGH);} 
      else {digitalWrite(led1,LOW);}
      
      //Нижний ряд светодиодов, первый светодиод справа
      if (lowNumHour==1 || lowNumHour==3 || lowNumHour==5 || lowNumHour==7 || lowNumHour==9){ digitalWrite(led2, HIGH);}
      else {digitalWrite(led2, LOW);}
      
      //второй светодиод справа
      if (lowNumHour==2 || lowNumHour==3 || lowNumHour==6 || lowNumHour==7){digitalWrite(led3, HIGH);}
      else {digitalWrite(led3, LOW);}
      
      //третий светодиод справа
      if (lowNumHour==4 || lowNumHour==5 || lowNumHour==6 || lowNumHour==7){ digitalWrite(led4, HIGH);}
      else{ digitalWrite(led4, LOW);}
      
      //четвертый светодиод справа
      if (lowNumHour==8 || lowNumHour==9){digitalWrite(led5, HIGH);}
      else{digitalWrite(led5, LOW);}
      
      //отображение минут
      //верхний ряд светодиодов, первый справа светодиод
      if((minute >= 10 && minute < 20) || (minute >= 30 && minute < 40) || (minute >=50 && minute < 60)) {digitalWrite(led6, HIGH);} 
      else {digitalWrite(led6,LOW);}
      //второй справа светодиод
      if(minute >= 20 && minute < 40) {digitalWrite(led7, HIGH);} 
      else {digitalWrite(led7,LOW);}
      //третий светодиод справа
      if(minute >= 40 && minute < 60) {digitalWrite(led8, HIGH);} 
      else {digitalWrite(led8,LOW);}
      
      //нижний ряд светодиодов, первый справа
      if (lowNumMinute==1 || lowNumMinute==3 || lowNumMinute==5 || lowNumMinute==7 || lowNumMinute==9) {digitalWrite(led10, HIGH);}  
      else {digitalWrite(led10, LOW);}
      //второй справа светодиод
      if (lowNumMinute==2 || lowNumMinute==3 || lowNumMinute==6 || lowNumMinute==7) {digitalWrite(led11, HIGH);}  
      else {digitalWrite(led11, LOW);}
      //третий справа светодиод
      if (lowNumMinute==4 || lowNumMinute==5 || lowNumMinute==6 || lowNumMinute==7){digitalWrite(led12, HIGH);}  
      else { digitalWrite(led12, LOW);}
      //четвертый справа светодиод
      if (lowNumMinute==8 || lowNumMinute==9){digitalWrite(led13, HIGH);}  
      else {digitalWrite(led13, LOW);}
    }else
    {
       for(int i=0;i<=13;i++){  digitalWrite(i, LOW); }
    }
}

PART 2.

void readButtons()
{
    alarmValue = analogRead(buttonAlarm);
    //обрабатываем нажатие на кнопку переключения режимов
    if (alarmValue < 1000)
    {
      if (modeClock == true)
      {
        modeClock = false;
        modeAlarm = true;
        tone(speakerPin, 1900);
        delay(200);
        noTone(speakerPin);
        
        //после переключения режимов, обнуляем все сигналы на цифровых выходах
        for(int i=0;i<=13;i++)  { digitalWrite(i, LOW); }
        delay(200);
      } else
      {
        modeClock = true;
        modeAlarm = false;
        //после переключения режимов, обнуляем все сигналы на цифровых выходах
        for(int i=0;i<=13;i++) { digitalWrite(i, LOW);}
        delay(200);
      }
       
    }
    //считывание нажатий на кнопjr изменения часов и минут
    hourValue = analogRead(buttonHour);
    minuteValue = analogRead(buttonMinute);
    //в режиме будильника при нажатии на кнопки увеличения минут и часов включают или выключают будильник()
    if (hourValue < 1000 && minuteValue < 1000)
    {
      if (alarmOnOff == false) {alarmOnOff = true;}else {alarmOnOff = false;}
    }
    //обработка нажатия на кнопку прибавления часов
    if (modeClock == true)
    {
      if (hourValue < 1000)
      {
        hourClock = hourClock + 1;
        delay(200);
      }
      //нажатие на кнопку прибавления минут
      
      if (minuteValue < 1000)
      {
        minuteClock = minuteClock + 1;;
        delay(200);
      }
    }else 
    //увеличиваем значение минут и часов будильника
    {
      if (hourValue < 1000)
      {
        hourAlarm = hourAlarm + 1;
        delay(200);
      }
      //нажатие на кнопку прибавления минут
      
      if (minuteValue < 1000)
      {
        minuteAlarm = minuteAlarm + 1;;
        delay(200);
      } 
    }
}

void playTone(int tone, int duration) 
{
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);      
  }
}

void playNote(char note, int duration) 
{
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
  
  // проиграть тон, соответствующий ноте
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);

    }
  }
}

void playAlarm()
{
  if ((secondClock == secondAlarm && minuteClock == minuteAlarm && hourClock == hourAlarm && alarmOnOff == true))
  {  
      for (int i = 0; i < length; i++) 
      {
        playNote(notes[i], beats[i] * tempo);
        delay(tempo / 4); 
        //считаываем значение с кнопки переключения режимов, (при проигрывании мелодии она будет выключать будильник)
        alarmValue = analogRead(buttonAlarm);
        if (alarmValue < 1000)
        {
          alarmOnOff = false;
          goto exit; 
        }
      }
     //прибавляем длительность мелодии к времени, чтобы не сбить его
     secondClock=secondClock+10;
     //если пользователь не выключил будильник сам, тогда мелодия повторится на следующей минуте
     minuteAlarm++;
  }
exit:return;
}

//главный цикл, вызов всех процедур
void loop()
{
    timing();
    lightOnLed(modeClock);
    readButtons(); 
    playAlarm();
}

did you post the faulty code? the code you posted compiles OK on my PC
try to avoid goto statements it leads to unstructured code, e.g.

        if (alarmValue < 1000)
        {
          alarmOnOff = false;
          goto exit;
        }
      }

you should be able to use break; to exit for for() loop

     for (int i = 0; i < length; i++)
      {
        playNote(notes[i], beats[i] * tempo);
        delay(tempo / 4);
        alarmValue = analogRead(buttonAlarm);
        if (alarmValue < 1000)
        {
          alarmOnOff = false;
          break;     //goto exit;
        }
      }

or just use return; to exit the function

The general advice on this Forum is never to use GOTO unless you are a very experienced programmer.

...R

horace:
did you post the faulty code? the code you posted compiles OK on my PC
try to avoid goto statements it leads to unstructured code, e.g.

        if (alarmValue < 1000)

{
          alarmOnOff = false;
          goto exit;
        }
      }



you should be able to use break; to exit for for() loop


for (int i = 0; i < length; i++)
      {
        playNote(notes[i], beats[i] * tempo);
        delay(tempo / 4);
        alarmValue = analogRead(buttonAlarm);
        if (alarmValue < 1000)
        {
          alarmOnOff = false;
          break;    //goto exit;
        }
      }



or just use return; to exit the function

Thank you very much Horace. I appreciate your feedback.

I am trying to build a code for this project.

I am not very good at coding. so I found some russian guy online and paid him to change his code so that I could add a DS3231 to the system. But hell, he took the money and gave me the code that I can't even compile.

Damn, I am glad we declared and gained our independence from Russia as a country. (Azerbaijan Republic). We fought a bloody war but we did it. :)) I am proud of it. Not many countries around, that could do that.

Anyways, I am pasting the code that I got from him. I have done the Auto formatting the best I can. The code is large, so will be pasting in 2 PARTS.

Can anyone help with it? Probably, just needs some finalizing. Otherwise, I am hoping that he wouldn't have taken the money. "Hopefully, I have not been ripped off".

Oh and, I have the correct DS3231.h library installed, so I know it is not the issue.

PART 1 of the code:

#include <DS3231.h>

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);

// Init a Time-data structure
Time  t;

//определим выводы светодиодов подключаемых к arduino
int led0 = 0;
int led1 = 1;
int led2 = 2;
int led3 = 3;
int led4 = 4;
int led5 = 5;
int led6 = 6;
int led7 = 7;
int led8 = 8;
int led10 = 10;
int led11 = 11;
int led12 = 12;
int led13 = 13;

//выводы кнопок
int buttonHour = 0;
int buttonMinute = 1;
int buttonAlarm = 2;
int buttonOnOff = 3;
//вывод динамика
int speakerPin = 9;

//считанные с аналоговых разьемов значения
int hourValue, minuteValue, alarmValue, ledsOnOffValue;

//сохраняем время
int secondClock = 0, minuteClock = 0, hourClock = 0;
//сохраняем время будильника
int secondAlarm = 0, minuteAlarm = 0, hourAlarm = 0;

//Для вывода младшего рязряда минут и часов
int lowNumMinuteClock, lowNumHourClock;
//тоже самое, только для будильника
int lowNumMinuteAlarm, lowNumHourAlarm;
//по значению в них видно нажата кнопка или нет
int minuteButtValue = 0, hourButtValue = 0;
//режим часов или будильника
boolean modeClock = true, modeAlarm = false;
//активирован ли будильник
boolean alarmOnOff = false;

//для динамика
int length = 28;
int tempo = 300;
char notes[] = "caagafcccaahgCCddhhagffaagaf ";
int beats[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 };


void setup()
{
  pinMode(led0, OUTPUT);  pinMode(led1, OUTPUT);  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);  pinMode(led4, OUTPUT); pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);  pinMode(led7, OUTPUT);  pinMode(led8, OUTPUT);
  pinMode(led10, OUTPUT);  pinMode(led11, OUTPUT);  pinMode(led12, OUTPUT);
  pinMode(led13, OUTPUT);

  pinMode(speakerPin, OUTPUT);
  rtc.begin();
}


void timing()
{
  t = rtc.getTime();
  secondClock = t.sec;
  minuteClock = t.min;
  hourClock = t.hour;

//надо посчитать остаток от деления на 10
//для получения младшых разрядов чисел минут и часов

lowNumMinuteAlarm = minuteAlarm % 10;
lowNumHourAlarm = hourAlarm % 10;

lowNumMinuteClock = minuteClock % 10;
lowNumHourClock = hourClock % 10;
}

void lightOnLed(boolean modeClock)
{
  //Переменные для хранения значений секунд, минут и часов для непосредственно вывода
  int second = 0, minute = 0, hour = 0;
  int lowNumMinute, lowNumHour;
  if (modeClock == false)
  {
    hour = hourAlarm;
    minute = minuteAlarm;
    lowNumHour = lowNumHourAlarm;
    lowNumMinute = lowNumMinuteAlarm;
  } else
  {
    hour = hourClock;
    minute = minuteClock;
    lowNumHour = lowNumHourClock;
    lowNumMinute = lowNumMinuteClock;
  }
  ledsOnOffValue = analogRead(buttonOnOff);
  // зажигаем светодиодики, если нажата кнопка, иначе гасим их
  if ((ledsOnOffValue < 1000 && modeAlarm == true && alarmOnOff == true) || (ledsOnOffValue < 1000 && modeClock == true))
  {
    //отображение часов
    //верхний ряд светодиодов, первый справа
    if (hour >= 10 && hour < 20) {
      digitalWrite(led0, HIGH);
    }
    else {
      digitalWrite(led0, LOW);
    }

    //второй справа светодиод
    if (hour >= 20 && hour < 24) {
      digitalWrite(led1, HIGH);
    }
    else {
      digitalWrite(led1, LOW);
    }

    //Нижний ряд светодиодов, первый светодиод справа
    if (lowNumHour == 1 || lowNumHour == 3 || lowNumHour == 5 || lowNumHour == 7 || lowNumHour == 9) {
      digitalWrite(led2, HIGH);
    }
    else {
      digitalWrite(led2, LOW);
    }

    //второй светодиод справа
    if (lowNumHour == 2 || lowNumHour == 3 || lowNumHour == 6 || lowNumHour == 7) {
      digitalWrite(led3, HIGH);
    }
    else {
      digitalWrite(led3, LOW);
    }

    //третий светодиод справа
    if (lowNumHour == 4 || lowNumHour == 5 || lowNumHour == 6 || lowNumHour == 7) {
      digitalWrite(led4, HIGH);
    }
    else {
      digitalWrite(led4, LOW);
    }

    //четвертый светодиод справа
    if (lowNumHour == 8 || lowNumHour == 9) {
      digitalWrite(led5, HIGH);
    }
    else {
      digitalWrite(led5, LOW);
    }

    //отображение минут
    //верхний ряд светодиодов, первый справа светодиод
    if ((minute >= 10 && minute < 20) || (minute >= 30 && minute < 40) || (minute >= 50 && minute < 60)) {
      digitalWrite(led6, HIGH);
    }
    else {
      digitalWrite(led6, LOW);
    }
    //второй справа светодиод
    if (minute >= 20 && minute < 40) {
      digitalWrite(led7, HIGH);
    }
    else {
      digitalWrite(led7, LOW);
    }
    //третий светодиод справа
    if (minute >= 40 && minute < 60) {
      digitalWrite(led8, HIGH);
    }
    else {
      digitalWrite(led8, LOW);
    }

    //нижний ряд светодиодов, первый справа
    if (lowNumMinute == 1 || lowNumMinute == 3 || lowNumMinute == 5 || lowNumMinute == 7 || lowNumMinute == 9) {
      digitalWrite(led10, HIGH);
    }
    else {
      digitalWrite(led10, LOW);
    }
    //второй справа светодиод
    if (lowNumMinute == 2 || lowNumMinute == 3 || lowNumMinute == 6 || lowNumMinute == 7) {
      digitalWrite(led11, HIGH);
    }
    else {
      digitalWrite(led11, LOW);
    }
    //третий справа светодиод
    if (lowNumMinute == 4 || lowNumMinute == 5 || lowNumMinute == 6 || lowNumMinute == 7) {
      digitalWrite(led12, HIGH);
    }
    else {
      digitalWrite(led12, LOW);
    }
    //четвертый справа светодиод
    if (lowNumMinute == 8 || lowNumMinute == 9) {
      digitalWrite(led13, HIGH);
    }
    else {
      digitalWrite(led13, LOW);
    }
  } else
  {
    for (int i = 0; i <= 13; i++) {
      digitalWrite(i, LOW);
    }
  }
}

PART 2 of the code:
By the way, I looked at the RTC related bits and they don't look ok to me. I might be wrong though.
Please check the "void timing" and "Button read" sections. I tried to contact him but he won't respond. I found him on freelancer website. should've just used somebody's help on this forum.

void readButtons()
{
  alarmValue = analogRead(buttonAlarm);
  //обрабатываем нажатие на кнопку переключения режимов
  if (alarmValue < 1000)
  {
    if (modeClock == true)
    {
      modeClock = false;
      modeAlarm = true;
      tone(speakerPin, 1900);
      delay(200);
      noTone(speakerPin);

      //после переключения режимов, обнуляем все сигналы на цифровых выходах
      for (int i = 0; i <= 13; i++)  {
        digitalWrite(i, LOW);
      }
      delay(200);
    } else
    {
      modeClock = true;
      modeAlarm = false;
      //после переключения режимов, обнуляем все сигналы на цифровых выходах
      for (int i = 0; i <= 13; i++) {
        digitalWrite(i, LOW);
      }
      delay(200);
    }

  }
  //считывание нажатий на кнопки изменения часов и минут
  hourValue = analogRead(buttonHour);
  minuteValue = analogRead(buttonMinute);
  //в режиме будильника при нажатии на кнопки увеличения минут и часов включают или выключают будильник()
  if (hourValue < 1000 && minuteValue < 1000)
  {
    if (alarmOnOff == false) {
      alarmOnOff = true;
    } else {
      alarmOnOff = false;
    }
  }
  //обработка нажатия на кнопку прибавления часов
  if (modeClock == true)
  {
    if (hourValue < 1000)
    {
      hourClock++;
      if (hourClock == 24) {
        hourClock = 0;
        minuteClock = 0;
      }
      secondClock = 0;
      rtc.setTime(hourClock, minuteClock, secondClock);
      delay(200);
    }
    //нажатие на кнопку прибавления минут

    if (minuteValue < 1000)
    {
      minuteClock++;
      if (minuteClock == 60) {
        hourClock++;
        if (hourClock == 24) hourClock = 0;
        minuteClock = 0;
      }
      secondClock = 0;
      rtc.setTime(hourClock, minuteClock, secondClock);
      delay(200);
    }
  } else
    //увеличиваем значение минут и часов будильника
  {
    if (hourValue < 1000)
    {
      hourAlarm++;
      if (hourAlarm == 24) {
        hourAlarm = 0;
        minuteAlarm = 0;
        secondAlarm = 0;
        delay(200);
      }
      //нажатие на кнопку прибавления минут

      if (minuteValue < 1000)
      {
        minuteAlarm++;
        if (minuteAlarm == 60) {
          hourAlarm++;
          if (hourAlarm == 24) hourAlarm = 0;
          minuteAlarm = 0;
          secondAlarm = 0;
          delay(200);
        }
      }
    }

    void playTone(int tone, int duration)
    {
      for (long i = 0; i < duration * 1000L; i += tone * 2) {
        digitalWrite(speakerPin, HIGH);
        delayMicroseconds(tone);
        digitalWrite(speakerPin, LOW);
        delayMicroseconds(tone);
      }
    }

    void playNote(char note, int duration)
    {
      char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
      int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

      // проиграть тон, соответствующий ноте
      for (int i = 0; i < 8; i++) {
        if (names[i] == note) {
          playTone(tones[i], duration);

        }
      }
    }

    void playAlarm()
    {
      if ((secondClock == secondAlarm && minuteClock == minuteAlarm && hourClock == hourAlarm && alarmOnOff == true))
      {
        for (int i = 0; i < length; i++)
        {
          playNote(notes[i], beats[i] * tempo);
          delay(tempo / 4);
          //считаываем значение с кнопки переключения режимов, (при проигрывании мелодии она будет выключать будильник)
          alarmValue = analogRead(buttonAlarm);
          if (alarmValue < 1000)
          {
            alarmOnOff = false;
            goto exit;
          }
        }
        //прибавляем длительность мелодии к времени, чтобы не сбить его
        secondClock = secondClock + 10;
        //если пользователь не выключил будильник сам, тогда мелодия повторится на следующей минуте
        minuteAlarm++;
      }
exit: return;
    }

    //главный цикл, вызов всех процедур
    void loop()
    {
      timing();
      lightOnLed(modeClock);
      readButtons();
      playAlarm();
    }

Here is the error message that I get right now:
Arduino: 1.8.4 (Windows 7), Board: "Arduino/Genuino Uno"

C:\Users\lenovo\Documents\Arduino\sketch_dec26a\sketch_dec26a.ino: In function 'void readButtons()':

sketch_dec26a:317: error: a function-definition is not allowed here before '{' token

{

^

sketch_dec26a:371: error: expected '}' at end of input

}

^

sketch_dec26a:371: error: expected '}' at end of input

exit status 1
a function-definition is not allowed here before '{' token

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

at some point you appear to have lost a couple of } off the end of function readButtons(), e.g. at line 316

  }   // << add  
}     // << add 
 
    void playTone(int tone, int duration)
    {

horace:
at some point you appear to have lost a couple of } off the end of function readButtons(), e.g. at line 316

  }   // << add  

}    // << add

void playTone(int tone, int duration)
    {

Thanks again.

This code looks to me so complicated, I am not sure it will run as intended.

In the following piece of code, should I use second, minute and hour instead of secondclock, minuteclock and hourclock?

t = rtc.getTime();
  secondClock = t.sec;
  minuteClock = t.min;
  hourClock = t.hour;

And, also in the following bits:

secondClock = 0;
      rtc.setTime(hourClock, minuteClock, secondClock);
      delay(200);

arduinoware:
In the following piece of code, should I use second, minute and hour instead of secondclock, minuteclock and hourclock?

these are just identifiers (names) which are meaningful to you in the context where they are used
you can use a global edit to change them but take care that second etc is not used somewhere in the code
Make a backup of the project before editing (which you should do anyway) in case you corrupt the code and cannot recover it

@arduinoware, if your program is too long for a single Reply post your .ino file as an attachment so that there is no risk of errors when we join two parts together.

...R