Помогите не работает

Evil4Devil
Offline
Зарегистрирован: 03.10.2013
/* Sound Serial (aka Keyboard Serial)
 *
 * Расчет тонов производится следующим образом:
 *
 *       timeHigh = period / 2 = 1 / (2 * toneFrequency)
 *
 * таблица различных тонов:
 *
 * нота            частота               период timeHigh
 * c            261 Hz          3830    1915    
 * d            294 Hz          3400    1700    
 * e            329 Hz          3038    1519    
 * f            349 Hz          2864    1432    
 * g            392 Hz          2550    1275    
 * a            440 Hz          2272    1136    
 * b            493 Hz          2028    1014    
 * C            523 Hz          1912    956
 *
 * на основе примера проекта todbot.com (Tod E. Kurt <tod@todbot.com>)
 */
  
int speakerPin = 10;
int serByte = -1;

char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
int tempo = 300;

void setup() {
  pinMode(speakerPin, OUTPUT);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(8, INPUT);
  pinMode(9, INPUT);
}

void loop() 
{
  if(digitalRead(2) == HIGH){
    serByte = 99;
  }
  if(digitalRead(3) == HIGH){
    serByte = 100;
  }
  if(digitalRead(4) == HIGH)
  {
    serByte = 101;
  }
  if(digitalRead(5) == HIGH)
  {
    serByte = 102;
  }
  if(digitalRead(6) == HIGH)
  {
    serByte = 103;
  }
  if(digitalRead(7) == HIGH)
  {
    serByte = 97;
  }
  if(digitalRead(8) == HIGH)
  {
    serByte = 98;
  }
  if(digitalRead(9) == HIGH)
  {
    serByte = 67;
  }
  digitalWrite(speakerPin, LOW);
  for (int j=0;j<=8;j++) {        // проверяем - это нота?
    if (names[j] == serByte) {    // ага - нота! 
      for( int i=0; i<50; i++ ) { // проигрываем ноту 50 раз
        digitalWrite(speakerPin, HIGH);
        delayMicroseconds(tones[j]);
        digitalWrite(speakerPin, LOW);
        delayMicroseconds(tones[j]);
      }
    }
    serByte = -1;
  } 
}

При нажатии на кнопки иногда один звук срабатывает. Но не работает.

P.S. это пианино

MaksMS
Offline
Зарегистрирован: 11.03.2013

Кнопки надо подтянуть на минус и нажимать,подключая к +  в данном случае..

Обычно наоборот делается,подтягивается на плюс,а нажимается,подключаясь к минусу,тогда и проверка должна быть digitalRead(х) ==L OW

maksim
Offline
Зарегистрирован: 12.02.2012

tone()

#define speakerPin 10
byte keys[8] = {2, 3, 4, 5, 6, 7, 8, 9};
byte notes[8] = {261, 294, 329, 349, 392, 440, 493, 523};

void setup() 
{
  pinMode(speakerPin, OUTPUT);
  for(byte i = 0; i < 8; i++) digitalWrite(keys[i], 1);
}

void loop() 
{
 for(byte i = 0; i < 8; i++) 
 {
   bool t = 0;
   if(!digitalRead(keys[i])) 
   {
     tone(speakerPin, notes[8]);
     t = 1;
   }
   if(!t) noTone(speakerPin);
 }
}

Только кнопочки подключите так как вам написали выше - один контакт кнопки к PIN, второй к GND.