Xscs проблема настройки
- Войдите на сайт для отправки комментариев
Пнд, 24/09/2012 - 00:03
сделал часы http://arduino.ru/forum/apparatnye-voprosy/led-2-tsifry-8-kontaktov-prik...
если код в начальном виде все нормально как только добавляю переменную все сбивается и начинается отсчет после 60 в минутах.
unsigned long time;
int latchPin = 10;//Пин подключен к ST_CP входу 74HC595
int clockPin = 6;//Пин подключен к SH_CP входу 74HC595
int dataPin = 7;//Пин подключен к DS входу 74HC595
int dir = 1; ;// задержка
int led1 = 8;
int led2 = 9; //мин
int led3 =11;
int led4 =12; //часы
int led5 = 4; //сек
int led6 = 5; //сек
int min1=59; // настройка минут
int cas2 = 23; //настройка часов
boolean catod = 0;
void setup() {
//устанавливаем режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
Serial.begin(9600);
}
byte mask[10] =
{
B11010111, //0
B00010001,//1
B01100111,//2
B01110101,//3
B10110001,//4
B11110100,//5
B11110110,//6
B01010001,//7
B11110111,//8
B11110101//9
/*
B11111001, // 0
B01100000, // 1
B10101011, // 2
B01101011, // 3
B01110010, // 4
B01011011, // 5
B11011011, // 6
B01101000, // 7
B11111011, // 8
B01111011 // 9
*/
};
byte maskSek[10] =
{
B11111001, // 0
B01100000, // 1
B10101011, // 2
B01101011, // 3
B01110010, // 4
B01011011, // 5
B11011011, // 6
B01101000, // 7
B11111011, // 8
B01111011 // 9
};
void loop()
{
time = millis();
int sek = time/1000;
int minyt = (time/1000)/60;
int cas = (minyt/60);
int minyt2 = minyt;
if(cas>0) minyt2 =(minyt-60*cas);
if((time/1000)>60) sek =(sek-60*minyt);
// настройка времени
Serial.print(cas);
Serial.print("c.");
Serial.print(minyt2);
Serial.print("m:");
Serial.print(sek);
Serial.println("s:");
// точка
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00001000); // передаем последовательно на dataPin
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
digitalWrite(led3, 1);
delay(dir); // пауза перед следующей итерацией
digitalWrite(led3, 0);
// ждет секунду, перед следующей итерацией цикла.
// минуты
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, mask[(minyt2)/10]); // целые
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
digitalWrite(led2, 1);
delay(dir);// пауза перед следующей итерацией
digitalWrite(led2, 0);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, mask[(minyt2)%10]); // десятые
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
digitalWrite(led1, 1);
delay(dir); // пауза перед следующей итерацией
digitalWrite(led1, 0);
///////////
// часы
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, mask[(cas)%10]); // передаем последовательно на dataPin
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
digitalWrite(led3, 1);
delay(dir); // пауза перед следующей итерацией
digitalWrite(led3, 0);
//
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, mask[(cas)/10]); // передаем последовательно на dataPin
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
digitalWrite(led4, 1);
delay(dir); // пауза перед следующей итерацией
digitalWrite(led4, 0);
// второй экран секунды
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, maskSek[sek/10]); // передаем последовательно на dataPin
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
digitalWrite(led6, 1);
delay(dir);// пауза перед следующей итерацией
digitalWrite(led6, 0);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, maskSek[sek%10]); // передаем последовательно на dataPin
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
digitalWrite(led5, 1);
delay(dir); // пауза перед следующей итерацией
digitalWrite(led5, 0);
}
не могу вставить переменные чтоб можно было настраивать часы
Для начала по коду, что бы не плодить одни и теже куски кода, нужно создать функцию, которая выводит цыфру на дисплей.
Единственная глобальная переменная у вас это time, вот к ней и можно плюсовать настройку.
unsigned long time, time_setup; int latchPin = 10;//Пин подключен к ST_CP входу 74HC595 int clockPin = 6;//Пин подключен к SH_CP входу 74HC595 int dataPin = 7;//Пин подключен к DS входу 74HC595 int dir = 1; ;// задержка int led1 = 8; int led2 = 9; //мин int led3 =11; int led4 =12; //часы int led5 = 4; //сек int led6 = 5; //сек int min1 = 59; // настройка минут int cas2 = 23; //настройка часов void setup() { // Расчет миллисекунд time_setup = min1*60000 + cas2*3600000; //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); Serial.begin(9600); } byte mask[10] = { B11010111, //0 B00010001,//1 B01100111,//2 B01110101,//3 B10110001,//4 B11110100,//5 B11110110,//6 B01010001,//7 B11110111,//8 B11110101//9 /* B11111001, // 0 B01100000, // 1 B10101011, // 2 B01101011, // 3 B01110010, // 4 B01011011, // 5 B11011011, // 6 B01101000, // 7 B11111011, // 8 B01111011 // 9 */ }; byte maskSek[10] = { B11111001, // 0 B01100000, // 1 B10101011, // 2 B01101011, // 3 B01110010, // 4 B01011011, // 5 B11011011, // 6 B01101000, // 7 B11111011, // 8 B01111011 // 9 }; void loop() { time = millis()+time_setup; int sek = time/1000; int minyt = (time/1000)/60; int cas = (minyt/60); int minyt2 = minyt; if(cas>0) minyt2 =(minyt-60*cas); if((time/1000)>60) sek =(sek-60*minyt); // настройка времени Serial.print(cas); Serial.print("c."); Serial.print(minyt2); Serial.print("m:"); Serial.print(sek); Serial.println("s:"); // точка out(led3, B00001000); // передаем последовательно на dataPin // минуты out(led2, mask[(minyt2)/10]); // целые out(led1, mask[(minyt2)%10]); // десятые // часы out(led3, mask[(cas)%10]); // передаем последовательно на dataPin out(led4, mask[(cas)/10]); // передаем последовательно на dataPin // второй экран секунды out(led6, maskSek[sek/10]); // передаем последовательно на dataPin out(led5, maskSek[sek%10]); } void out(int catode, int numeric){ digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, numeric); // передаем последовательно на dataPin digitalWrite(latchPin, HIGH); //"защелкиваем" регистр digitalWrite(catode, 1); delay(dir); // пауза перед следующей итерацией digitalWrite(catode, 0); }не понял. с минутами разобрался счас мучаю часы чтоб после 23 в 0 уходили
вроде все работает
осталось узнать какое отставание или опережение с точными часами и внести поправки
Смотрите сообщение #2, я его подредактировал.
86 строкой добавить if(cas > 23) cas =cas-24; чтоб после 23 шло не 24 а 0. код у вас пограмотней написан и занимает на 200кб меньше а так оба работают нормально.
может разжуете - unsigned long time, time_setup; ??
и воид loop после точки буду благодарен!!!
В 20 строке расчитываются миллисекунды time_setup изходя из min1 и cas2, и плюсуется к глобальной переменной time.
а так объявляются переменные одного типа, то есть так тоже самое:
я имею ввиду в самом верху. первая строка.
а и вроде и остальное понял. кроме 114 и 116
я имею ввиду в самом верху. первая строка.
unsigned long time, time_setup;
а так объявляются переменные одного типа, то есть так тоже самое:
unsigned long time;
unsigned long time_setup;
а и вроде и остальное понял. кроме 114 и 116
Функции