Работа с буззером-пищалкой

Skvidward
Skvidward аватар
Offline
Зарегистрирован: 16.12.2015

Доброго дня суток форумчане!

Прикупил я вчера Adruino uno  и вот уже несколько часов не могу сделать так что-бы буззер начинал пищать по достижению значения "9" .Пищит он у меня весь цикл секундомера. Подскажите где я ошибаюсь. Буду чертовски счастлив и благодарен . :-)

#define FIRST_SEGMENT_PIN   2
#define SEGMENT_COUNT       7
#define BUZZER 13
byte numberSegments[10] = {
  0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
  0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
};

void setup()
{
  for (int i = 0; i < SEGMENT_COUNT; ++i)
    pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
    pinMode(BUZZER, OUTPUT);
}

void loop()
{
  int number = (millis() / 100) % 10;
  int mask = numberSegments[number];
  for (int i = 0; i < SEGMENT_COUNT; ++i) {
    boolean enableSegment = bitRead(mask, i);
    digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
 if (digitalRead(SEGMENT_COUNT) == 0b01111111);
  {digitalWrite(BUZZER, LOW);
  int frequency = 0;
 tone(BUZZER, frequency, 20);
  digitalWrite(BUZZER, LOW);
     }
  }
}

 

 

Araris
Offline
Зарегистрирован: 09.11.2012

Точка с запятой в 23-й строке - лишняя.

И спасибо за оригинальное название темы.

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Переименовал.

 

Skvidward
Skvidward аватар
Offline
Зарегистрирован: 16.12.2015

Извиняюсь за название .

Точка с запятой не лишняя , все работает , но не так как мне бы хотелось.

Coolerr
Offline
Зарегистрирован: 30.06.2014

Что значит не лишняя, по правилам языка её там не должно быть.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Общеизвестный факт: программа работает так, как ее написал программист, но совсем не так, как хотел написать.

Skvidward
Skvidward аватар
Offline
Зарегистрирован: 16.12.2015

Вопрос не о синтаксисе .  Можно ближе к телу?

Coolerr
Offline
Зарегистрирован: 30.06.2014

Вот еб так еб, как же не в синтаксисе. Твой буззер должен бузить при выполнении условия из 23ей строки ты её похерил точказапятой, посему он бузит постоянно.

Skvidward
Skvidward аватар
Offline
Зарегистрирован: 16.12.2015

Спасибо , исправил . Не помогло.

Skvidward
Skvidward аватар
Offline
Зарегистрирован: 16.12.2015

#define FIRST_SEGMENT_PIN   2
#define SEGMENT_COUNT       7
#define BUZZER 13

byte numberSegments[10] = {
  0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
  0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
};
 
void setup()
{
  for (int i = 0; i < SEGMENT_COUNT; ++i)
    pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
    pinMode(BUZZER, OUTPUT);
}
 
void loop()
{
  int number = (millis() / 1000) % 10;
  int mask = numberSegments[number];
  for (int i = 0; i < SEGMENT_COUNT; ++i) {
    boolean enableSegment = bitRead(mask, i);
    digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
 if (digitalRead(SEGMENT_COUNT) == 0b01111111)
  {digitalWrite(BUZZER, HIGH);
  int frequency = 400;
 tone(BUZZER, frequency, 20);
  
     }
  }
}
  

Теперь все выглядит вот так.

Piskunov
Offline
Зарегистрирован: 13.02.2014

Загадок много.

И вопросы есть.

Я так понимаю, что циклы в строке 12 и 21 должны гонять по одним и тем же позициям?

В строке 24 Вы всегда читаете пин 7. А для того, чтобы он был равен 0, его надо туда записать. И записываться туда он может только в 23 строке. При i = 5, но! enableSegment в строке 22 при i = 5 не будет равен 0.

Надо исправить.

Skvidward
Skvidward аватар
Offline
Зарегистрирован: 16.12.2015

Да , цикл от 12 до 21 перебирает цифры на восьмисегментом индикаторе от 0 до 9 . 

Я не совсем понимаю что вы имеете в виду . Задачка моя включить буззер на некоторое время при значении 9 на индикаторе . А буззер пищит весь цикл перебора цифр .

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Skvidward, что вы не понимаете? У вас в 24 строке полная чушь  ->  if (digitalRead(7)==127) так понятнее?

Skvidward
Skvidward аватар
Offline
Зарегистрирован: 16.12.2015

Понял что чушь .Подскажите пожалуйста как считать значение индикатора по другому?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013
#define FIRST_SEGMENT_PIN   2
#define SEGMENT_COUNT       7
#define BUZZER 13

byte numberSegments[10] = {
  0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
  0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
};
 
void setup(){
  for (int i = 0; i < SEGMENT_COUNT; ++i){
       pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
       }
pinMode(BUZZER, OUTPUT);
}
 
void loop(){
byte number = (millis() / 1000) % 10;
static byte old_number;
 if (number != old_number) {
     old_number = number;  byte mask = numberSegments[number];
     for (byte i = 0; i < SEGMENT_COUNT; ++i) {
         boolean enableSegment = bitRead(mask, i);
         digitalWrite((byte)i + FIRST_SEGMENT_PIN, enableSegment);
         }
          if (number==9) {tone(BUZZER, 400, 100); }
      }
}
  

 

Skvidward
Skvidward аватар
Offline
Зарегистрирован: 16.12.2015

Огромное спасибо ! Я и не думал что так просто . Не мог понять почему он у меня в начале кода схавал байтовые значения а в конце нет . :-)