Ви не увійшли.
Сторінки 1
Подскажите как сделать прерывание по таймеру так чтобы диоды загорались и тухли по очередно c интервалам 0,8сек
int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;
int led5 = 6;
int led6 = 7;
volatile unsigned long int timerLED1;
unsigned long int timePreview = 0;
bool LEDOn = 0;
ISR (TIMER0_COMPA_vect)
{
timerLED1++;
if(timerLED1 - timePreview >= 800)
{
timePreview = timerLED1;
digitalWrite(led1, 1);
}
}
void setup()
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
TCCR0A |= (1 << WGM01);
OCR0A = 0xF9;
TIMSK0 |= (1 << OCIE0A);
TCCR0B |= (1 << CS01) | (1 << CS00);
sei();
}
void loop()
{
}
Ну, так и вперёд!
Ты смысл-то динамической индикации понимаешь? Как она вообще работает? Если да, то всё, что нужно ты уже умеешь, теперь делай.
Как сделаешь, я могу рассказать тебе как это делается правильно на самом деле.
Намудри так намудрил теперь попробую оптимизирувать спасибо за помощь
int anodPins[] = {A1, A2, A3, A4};
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12};
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(anodPins[i], OUTPUT);
}
for (int i = 0; i < 8; i++) {
pinMode(segmentsPins[i], OUTPUT);
}
}
int seg0[] = {1, 1, 1, 1, 1, 1, 0, 0};
int seg1[] = {0, 1, 1, 0, 0, 0, 0, 0}; //Цифра 1
int seg2[] = {1, 1, 0, 1, 1, 0, 1, 0}; //Цифра 2
int seg3[] = {1, 1, 1, 1, 0, 0, 1, 0}; //Цифра 3
int seg4[] = {0, 1, 1, 0, 0, 1, 1, 0}; //Цифра 4
int seg5[] = {1, 0, 1, 1, 0, 1, 1, 0}; //Цифра 5
int seg6[] = {1, 0, 1, 1, 1, 1, 1, 0}; //Цифра 6
int seg7[] = {1, 1, 1, 0, 0, 0, 0, 0}; //Цифра 7
int seg8[] = {1, 1, 1, 1, 1, 1, 1, 0}; //Цифра 8
int seg9[] = {1, 1, 1, 1, 0, 1, 1, 0}; //Цифра 9
void loop() {
int i = 0;
for (int k = 0; k < 8; k++) {
digitalWrite(segmentsPins[k], ((seg1[k] == 1) ? LOW : HIGH));
}
digitalWrite(anodPins[i], HIGH); // Подали напряжение на анод - все индикаторы загорелись
delay(1); // Дали паузу глазу воспринять
digitalWrite(anodPins[i], LOW); // Сняли напряжение с анода, чтобы переключение катодов не вызывали мерцание
int a = 1;
for (int k = 0; k < 8; k++) {
digitalWrite(segmentsPins[k], ((seg2[k] == 1) ? LOW : HIGH));
}
digitalWrite(anodPins[a], HIGH); // Подали напряжение на анод - все индикаторы загорелись
delay(1); // Дали паузу глазу воспринять
digitalWrite(anodPins[a], LOW);
int c = 2;
for (int k = 0; k < 8; k++) {
digitalWrite(segmentsPins[k], ((seg3[k] == 1) ? LOW : HIGH));
}
digitalWrite(anodPins[c], HIGH); // Подали напряжение на анод - все индикаторы загорелись
delay(1); // Дали паузу глазу воспринять
digitalWrite(anodPins[c], LOW);
int x = 3;
for (int k = 0; k < 8; k++) {
digitalWrite(segmentsPins[k], ((seg4[k] == 1) ? LOW : HIGH));
}
digitalWrite(anodPins[x], HIGH); // Подали напряжение на анод - все индикаторы загорелись
delay(1); // Дали паузу глазу воспринять
digitalWrite(anodPins[x], LOW);
}
Попробуй сделать i (в int i = 0;) единицей или двойкой, посмотри, что будет
уже 0=равен первой цифре 1=второй 2=третий 3=четвертой
Хорошо, не выводи пока. Просто убери цикл. Вывелась только одна первая цифра? Если да, попробуй вывести вторую.
Немного понял теперь могу вывести только одну цифру теперь буду думать как несколько вывисти
int anodPins[] = {A1, A2, A3, A4};
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12};
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(anodPins[i], OUTPUT);
}
for (int i = 0; i < 8; i++) {
pinMode(segmentsPins[i], OUTPUT);
}
}
int seg0[] = {1, 1, 1, 1, 1, 1, 0, 0};
int seg1[] = {0, 1, 1, 0, 0, 0, 0, 0}; //Цифра 1
int seg2[] = {1, 1, 0, 1, 1, 0, 1, 0}; //Цифра 2
int seg3[] = {1, 1, 1, 1, 0, 0, 1, 0}; //Цифра 3
int seg4[] = {0, 1, 1, 0, 0, 1, 1, 0}; //Цифра 4
int seg5[] = {1, 0, 1, 1, 0, 1, 1, 0}; //Цифра 5
int seg6[] = {1, 0, 1, 1, 1, 1, 1, 0}; //Цифра 6
int seg7[] = {1, 1, 1, 0, 0, 0, 0, 0}; //Цифра 7
int seg8[] = {1, 1, 1, 1, 1, 1, 1, 0}; //Цифра 8
int seg9[] = {1, 1, 1, 1, 0, 1, 1, 0}; //Цифра 9
void loop() {
int i = 0;
for (int k = 0; k < 8; k++) {
digitalWrite(segmentsPins[k], ((seg1[k] == 1) ? LOW : HIGH));
}
digitalWrite(anodPins[i], HIGH); // Подали напряжение на анод - все индикаторы загорелись
delay(1); // Дали паузу глазу воспринять
digitalWrite(anodPins[i], LOW); // Сняли напряжение с анода, чтобы переключение катодов не вызывали мерцание
}
Ну, если понял, то что тебе мешает выводить разные числа? Убирай нахрен цикл вывода одного и того же в 4 разряда (строку for (int i = 0; i < 4; i++) { и соответствующую закрывающую скобку) и выводи сначала одну цифру. потом также вторую, потом также третью. Что мешает?
И да, кстати, во всех твоих примерах последним идёт 0. Надеюсь, ты пробовал делать его 1 и знаешь что при этом получается.
блин не выходит либо я дибил либо не так собрал
Ты сделал, что я сказал? Сделай, покажи мне как ты выводишь 2222, тогда поговорим. Просто покаж вывод.
Пока ты этого не сделаешь, даже не думай, что ты что-то понял. Ничего ты не понял.
я понял ка это
A, B, C, D, E, F, G,DP - распиновка сегментов
{1, 1, 1, 1, 1, 1, 0, 0} //Цифра 0
{0, 1, 1, 0, 0, 0, 0, 0}, //Цифра 1
{1, 1, 0, 1, 1, 0, 1, 0}, //Цифра 2
{1, 1, 1, 1, 0, 0, 1, 0}, //Цифра 3
{0, 1, 1, 0, 0, 1, 1, 0}, //Цифра 4
{1, 0, 1, 1, 0, 1, 1, 0}, //Цифра 5
{1, 0, 1, 1, 1, 1, 1, 0}, //Цифра 6
{1, 1, 1, 0, 0, 0, 0, 0}, //Цифра 7
{1, 1, 1, 1, 1, 1, 1, 0}, //Цифра 8
{1, 1, 1, 1, 0, 1, 1, 0} //Цифра 9
только как водить число с разными елементами
В строке
int seg[] = {0, 1, 1, 0, 0, 0, 0, 0};
Меняй 0 на 1 и смотри, что получается. Когда тебе покажется, что понял, попробуй вывести 2222, потом 3333. Когда это сделаешь, дальше легче пойдёт.
Меняй только эту строку. Разберись с нею досконально!
это я понял мне как вести чтобы числа были разные к примеру 1234 или 9321
на данный момент скетч выводит на индикатор 1111 помогите исправить та чтобы выводил 12.21
int anodPins[] = {A1, A2, A3, A4};
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12};
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(anodPins[i], OUTPUT);
}
for (int i = 0; i < 8; i++) {
pinMode(segmentsPins[i], OUTPUT);
}
}
int seg[] = {0, 1, 1, 0, 0, 0, 0, 0};
void loop() {
for (int i = 0; i < 4; i++) {
for (int b = 0; b < 8; b++) {
digitalWrite(segmentsPins[b], ((seg[b] == 1) ? LOW : HIGH));
}
digitalWrite(anodPins[i], HIGH);
delay(1);
digitalWrite(anodPins[i], LOW);
}
}
а в обратном направлении тогда как они должны загораться и гаснуть?
8,87,876,765,654,543,432,321,21,1
а гаснуть как должны?
Да 1.12.123.234.345.456.567.678.78.8. и потом наборот я сделал только в одну сторону int i = 2;
int PIN_BUTTON = 10;
void setup()
{
Serial.begin(9600);
for(i=2; i<10; i++)
pinMode(i, OUTPUT);
}
void loop()
{
int buttonState = digitalRead(PIN_BUTTON);
Serial.println(buttonState);
if (!buttonState) {
delay(50);
return;
}
digitalWrite(2, 1);
delay(1000);
digitalWrite(3, 1);
delay(1000);
digitalWrite(4, 1);
delay(1000);
digitalWrite(5, 1);
digitalWrite(2, 0);
delay(1000);
digitalWrite(6, 1);
digitalWrite(3, 0);
delay(1000);
digitalWrite(7, 1);
digitalWrite(4, 0);
delay(1000);
digitalWrite(8, 1);
digitalWrite(5, 0);
delay(1000);
digitalWrite(9, 1);
digitalWrite(6, 0);
delay(1000);
digitalWrite(7, 0);
delay(1000);
digitalWrite(8, 0);
delay(1000);
digitalWrite(9, 0);
delay(1000);
}
Нужен скетч так чтобы при первом нажатии кнопки диоды загорались в по порядку 1-8 при втором нажатии наоборот 8-1
Сторінки 1