Я сделал программу (по книге, но по памяти), которая работает с аппаратными прерываниями (кнопки, триггер Шмитта, конденсатор, меняющий цвет светодиод и т. д). Программа не меняла цвет светодиода и не слала сообщения в порт. Код (C++): int i; volatile int col = 11; void setup() { Serial.begin(9600); pinMode(11,OUTPUT); pinMode(10,OUTPUT); pinMode(9,OUTPUT); attachInterrupt(0,ch,RISING); } void ch(){ Serial.println("1"); digitalWrite(col,0); col-- ; if (col == 8) col = 11; } void loop() { for (i=0;i<256;i++){ analogWrite(col,i); delay(2); } for (i=254;i>0;i--){ analogWrite(col,i); delay(2); } } После пересборки схемы, ничего не изменилось. Я скачал программу отсюда http://www.exploringarduino.com/content/ch12/ и она заработала. После часа попыток установить проблему, я вспомнил, что программа с сайта работает для Leonardo, а для моего Uno нужно поставить в прерывании пин 2 или 3. Я тут же поставил пин 0 в свою программу и она заработала. Это при том, что провод от кнопки подключён к пину 2. Если это важно, плата китайская, микросхема не в DIP корпусе.
О таком в книге не упоминалось. Но вот что написано на http://wiki.amperka.ru/конспект-arduino:перетягивание-каната: В setup() прописывается инструкция attachInterrupt(interrupt, action, event), где interrupt может принимать значения INT0 или INT1 для портов 2 и 3 соответственно. Можно задать эти значения и с помощью функции digitalPinToInterrupt(pin), где вместо pin указать номер пина. Так что, похоже, это не обязательно.
Вы не внимательно прочитали отрывок текста, который процитировали. Попробуйте еще раз, и сравните с тем. что у вас в коде.
Я понял: INT0 - пин 2. Теперь всё понятно. Но можно ли с digitalPinToInterrupt заставить работать пины, отличные от 2 и 3?
Нет. Прерывания на других пинах есть, но в среде ардуино они не задекларированы. Нужно лезть в низкоуровневое управление микроконтроллером, и это довольно мудрено для начинающих программистов. Называется pcint