3 семи сегментных индикатора без сдвигового регистра.
- Войдите на сайт для отправки комментариев
Доброе время суток.
Подскажите можно ли заставить работать индикаторы по следующему алгоритму:
1. последовательно по часовой стрелке загораются 6 сегментов 1 индикатора, тем самым образуя цифру 0.
2. первый индикатор остается вкл.
Последовательно по часовой стрелке загораются 6 сегментов 2 индикатора, тем самым образуя цифру 0.
3. первый и второй индикаторы остаются вкл.
Последовательно по часовой стрелке загораются 6 сегментов 3 индикатора, тем самым образуя цифру 0.
4. все три индикатора светятся.
Последовательно по часовой стрелке гаснут 6 сегментов 1 индикатора. Второй и третий индикаторы светятся.
5. Последовательно по часовой стрелке гаснут 6 сегментов 2 индикатора. Третий индикатор светится.
6. Последовательно по часовой стрелке гаснут 6 сегментов 3 индикатора. Переход на пункт первый.
Пауза между зажиганием сегментов 100 ms, пауза между зажиганием индикаторов 50 ms.
Вот схема подключения:

Вот примерный код:
int ledPin;
int ledPanel;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(ledPanel, OUTPUT);
Serial.begin(9600);
}
void loop()
{
for (ledPanel=8; ledPanel<10; ledPanel++)
{
digitalWrite(ledPanel, HIGH);
cikleOn();
Serial.print("LedPanelON: ");
Serial.println(ledPanel);
delay(100);
}
for (ledPin=8; ledPin<10; ledPin++)
{
digitalWrite(ledPanel, LOW);
cikleOff();
Serial.print("LedPanelOFF: ");
Serial.println(ledPanel);
delay(100);
}
}
void cikleOn()
{
for (ledPin=2; ledPin<8; ledPin++)
{
digitalWrite(ledPin, LOW);
Serial.print("LedPinON: ");
Serial.println(ledPin);
delay(100);
}
}
void cikleOff()
{
for (ledPin=2; ledPin<8; ledPin++)
{
digitalWrite(ledPin, HIGH);
Serial.print("LedPinOFF: ");
Serial.println(ledPin);
delay(100);
}
}
вам нужно делать динамическую индикацию, т.к. индикаторы включены параллельно, и в коде избавляться от delay...
что значит динамическую? это когда часто часто моргает? По поводу delay согласен.
с delay не получится то что хотите... примеры есть типа мигаем светодиодом без delay
да динамическая это когда часто моргает
Хорошо сначало уберу делэй.
delay вроде убрал, но что то мне поведение кода не нравится, а как исправить незнаю. Народ подскажите в какую сторону думать.
код:
int ledPin; int ledPanel; long previousMillis = 0; //long previousMillis2 = 0;// здесь будет храниться время последнего изменения состояния светодиода long interval1 = 5000; //long interval2 = 500; // интервал мигания в миллисекундах void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); Serial.begin(9600); } void loop() { for (ledPanel=8; ledPanel<=10; ledPanel++) { digitalWrite(ledPanel, HIGH); cikleOn(); Serial.print("LedPanelON: "); Serial.println(ledPanel); iterval(); // delay(100); } iterval(); for (ledPanel=8; ledPanel<=10; ledPanel++) { digitalWrite(ledPanel, LOW); cikleOff(); Serial.print("LedPanelOFF: "); Serial.println(ledPanel); iterval(); //delay(100); } } void iterval() { if (millis() - previousMillis > interval1) { previousMillis = millis(); } } void cikleOn() { for (ledPin=2; ledPin<8; ledPin++) { digitalWrite(ledPin, LOW); Serial.print("LedPinON: "); Serial.println(ledPin); iterval(); // delay(100); } } void cikleOff() { for (ledPin=2; ledPin<8; ledPin++) { digitalWrite(ledPin, HIGH); Serial.print("LedPinOFF: "); Serial.println(ledPin); iterval(); //delay(100); } }вы не избавились от delay
вам надо разобратся с этим примером....
воткните в дуньку два диода и помигайте ими поочередно без delay
а лучше воткнуть диоды между двумя выходами через резистор (как у вас)
Как не избавился? Все delay закоментированы. Или я что то не так понимаю?
вам надо чтоб в такой-то промежуток времени (
if(currentMillis - previousMillis > interval)) какието выходы были в hi а другие в lowЯ пробовал оборачивать код в оператор if с. millis, но у меня не получилось. при компиляции ошибка выскакивала.
Не выходит что то каменный цветок. Попробовал убрать delay, взял скетч моргания светодиодом, вставил в него свой код, но что то не работает код, вернее работает но не так как нужно: цикл крутится но загорания и последовательного погасания сегментов нет.
Народ подскажите плиз куда рыть, вот код:
//const int ledPin = 13; // номер выхода, подключенного к светодиоду int ledPin; int ledPanel; //long previousMillis = 0; //long interval1 = 50; unsigned long currentMillis; //int ledState = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis = 0; // храним время последнего переключения светодиода long interval = 1000; // интервал между включение/выключением светодиода (1 секунда) void setup() { Serial.begin(9600); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); } void loop() { // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval) { // сохраняем время последнего переключения previousMillis = currentMillis; for (ledPanel=8; ledPanel<=10; ledPanel++) { digitalWrite(ledPanel, HIGH); cikleOn(); Serial.print("LedPanelON: "); Serial.println(ledPanel); } } if(currentMillis - previousMillis > interval) { // сохраняем время последнего переключения previousMillis = currentMillis; for (ledPanel=8; ledPanel<=10; ledPanel++) { digitalWrite(ledPanel, LOW); cikleOff(); Serial.print("LedPanelOFF: "); Serial.println(ledPanel); //iterval(); //delay(100); } } } void cikleOn() { if(currentMillis - previousMillis > interval) { //previousMillis = currentMillis; for (ledPin=2; ledPin<=7; ledPin++) { digitalWrite(ledPin, LOW); Serial.print("LedPinON: "); Serial.println(ledPin); //iterval(); // delay(100); } } } void cikleOff() { if(currentMillis - previousMillis > interval) { //previousMillis = currentMillis; for (ledPin=2; ledPin<=7; ledPin++) { digitalWrite(ledPin, HIGH); Serial.print("LedPinOFF: "); Serial.println(ledPin); //iterval(); //delay(100); } } }Судя по сериал монитору почемуто не отрабатывается как положено цикл for в функциях cikleOn и cikleOff с положенным интервалом.