проблем несколько: 1. Собрала схему по инструкции с официального сайта http://arduino.cc/en/Tutorial/ShiftOut. Проверила уже не раз. При подключении второго shift регистра и с ним второго набора из 8ми диодов мигание получается синхронным, т.е. при загрузке приведенных там примеров мигают два первых диода на обоих регистрах, потом два вторых диода и т.п. Т.е. не получается сделать так, чтобы диоды зажигались последовательно: сначала пройдя ряд на первом регистре, а потом на втором. 2. По проекту мне нужно сделать так, чтобы после того, как пройдет программа с набором света (вот эта: http://learn.adafruit.com/adafruit-arduino-lesson-9-sensing-light/arduino-code) в конце, тогда, когда загорается последний диод в линейке, должен подаваться звуковой сигнал (можно даже типовой из примеров в самом ардуино). после того, как он закончит играть мелодию, он должен замолчать. я уже неделю пробую разные варианты: и пыталась диоды по-отдельности прописывать и разные другие программы грузила. никак не получается. ПОМОГИТЕ ПОЖАЛУЙСТА
Хотелось бы увидеть ваш код и схему вашу... где-то касяк Порылся в гугле попробуйте вот это... Код (Text): /* Программа поочередно включается все светодиоды, подключенные к двум сдвиговым регистрам 74HC595 .Created 22 May 2009 Modified 23 Mar 2010 by Tom Igoe */ //Пин подключен к ST_CP входу 74HC595 const int latchPin = 8; //Пин подключен к SH_CP входу 74HC595 const int clockPin = 12; //Пин подключен к DS входу 74HC595 const int dataPin = 11; char inputString[2]; void setup() { //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); Serial.begin(9600); Serial.println("reset"); } void loop() { // проходим циклом по всем 16 выходам двух регистров for (int thisLed = 0; thisLed < 16; thisLed++) { // записываем сигнал в регистр для очередного светодиода registerWrite(thisLed, HIGH); // если это не первый светодиод, то отключаем предыдущий if (thisLed > 0) { registerWrite(thisLed - 1, LOW); } // если это первый светодиод, то отключаем последний else { registerWrite(15, LOW); } // делаем паузу перед следующией итерацией delay(250); } } // этот метод отсылает бит на сдвиговый регистр void registerWrite(int whichPin, int whichState) { // для хранения 16 битов используем unsigned int unsigned int bitsToSend = 0; // выключаем светодиоды на время передачи битов digitalWrite(latchPin, LOW); // устанавливаем HIGH в соответствующий бит bitWrite(bitsToSend, whichPin, whichState); // разбиваем наши 16 бит на два байта // для записи в первый и второй регистр byte registerOne = highByte(bitsToSend); byte registerTwo = lowByte(bitsToSend); // "проталкиваем" байты в регистры shiftOut(dataPin, clockPin, MSBFIRST, registerTwo); shiftOut(dataPin, clockPin, MSBFIRST, registerOne); // "защелкиваем" регистр, чтобы биты появились на выходах регистра digitalWrite(latchPin, HIGH); }
Ой. Действительно забыла написать для чего это все. Это учебный проект. Должна быть сделана лампа, которая бы постепенно зажигалась в зависимости от того, как темнеет за окном. В конце, когда зажжется последний диод, должен прозвучать звуковой сигнал, что-то типа напоминания, что уже слишком поздно и юзеру пора идти спать. 8ми диодов для лампы мало и когда их всего 8, то действие не совсем очевидно. Поэтому нужно больше диодов, а значит, что они должны быть подключены через регистры.
если речь о лампе, то может вам рассмотреть вариант PWM и какого-нибудь сверхъяркого светодиода ? P.S. как вы подаете питание на светодиоды (регистры) ? Если от ардуины, не исключено, что ей не хватает силенок.
дело не только в яркости. в проекте должно быть отражено, что работает ардуино. если бы вопрос был просто в создании лампы, то можно было бы использовать лампу накаливания и провод и не трогать ардуино
Можно зажигать сразу цепочку светодиодов (или светодиодную ленту), регулируя напряжение при помощи транзистора. Тогда понадобится одна ножка для управления яркостью и одна ножка для звукового сигнала - и никаких сдвиговых регистров.
ну вот и отлично: выход PWM Ардуино на сверхъяркий светодиод позволит показать, что ваше устройство умеет управлять яркостью лампы.
А уровень освещенности будете с датчика брать или просто по часам? В любом случае тут тоже без контроллера сложно обойтись. Лампа накаливания с проводом не будет плавно загораться, а тем более пищать мелодию в конце)
да нет, она же зажигает их все. во всяком случае 2 регистра с 16 диодами. они просто синхронно зажигаются. не последовательно от регистра к регистру.
А зажигать по очереди - это принципиально? Или принципиально добиться плавного увеличения освещенности?
с помощью прекрасных людей удалось решить проблему перехода между регистрами. причем легко и изящно (скетч привожу ниже), но осталась проблема с включением сигнала после того, как будет зажигаться последний 16й диод. пока у меня получилось два варианта: либо сигнал звучит постоянно, либо он звучит только в начале при загрузке скетча. а по идее проекта эта функция тоже должна быть зациклена, т.е. каждый раз когда будет становиться темно и будут зажигаться все диоды до последнего 16й должен звучать этот звуковой сигнал, желательно с некоторой задержкой после того, как 16й диод загорится int lightPin = 0; int latchPin = 8; int clockPin = 12; int dataPin = 11; int leds = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { int reading = analogRead(lightPin); int numLEDSLit = reading / 57; //1023 / 9 / 2 if (numLEDSLit > 16) numLEDSLit = 16; leds = 0; for (int i = 0; i < numLEDSLit; i++) { bitSet(leds, i); } updateShiftRegister(); } void updateShiftRegister() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, (leds>>8)); shiftOut(dataPin, clockPin, MSBFIRST, leds); digitalWrite(latchPin, HIGH); delay(50); }