Прошу помощи в написании секундомера с РАБОЧЕЙ кнопкой на дисплее ТМ1637!!!
- Войдите на сайт для отправки комментариев
Втр, 27/03/2018 - 00:09
Доброго времени суток, господа!
Я в програмировании почти полный ноль(только поглощаю это дело), и поэтому спустя несколько суток поспешил обратится за помощью.
У меня задача, создать секундомер/счётчик времени, чтобы при нажатой кнопке он отсчитывал, а при отжатой стоял на паузе.
Я пытался сделать на разных шаблонах, но в каждом из них были свои проблемы.
Прошу помочь выбрать наиболее оптимальный вариант из приложеных скетчей, и помочь его оптимизировать да заставить работать.
Вот первый вариант:
//Это есть начало сиего треша. #include <EEPROM.h> #include <TimerOne.h> #include <avr/pgmspace.h> #include <TM1637.h> #define ON 1 #define OFF 0 int8_t TimeDisp[] = {0x00,0x00,0x00,0x00}; unsigned char ClockPoint = 0; unsigned char Update; unsigned char microsecond_10 = 0; unsigned char second; unsigned char _microsecond_10 = 0; unsigned char _second; unsigned int eepromaddr; boolean Flag_ReadTime; #define CLK 4//pins definitions for TM1637 and can be changed to other ports #define DIO 5 TM1637 tm1637(CLK,DIO); void setup() { tm1637.set(0);// яркость в скобках от 0 до 7 tm1637.init(); Timer1.initialize(97979779);// чем меньше число в скобках, тем быстрее идёт время Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR } void loop() { if(Update == ON) { TimeUpdate(); tm1637.display(TimeDisp); } } void TimingISR() { microsecond_10 ++; Update = ON; if(microsecond_10 == 100){ second ++; if(second == 99) { second = 0; } microsecond_10 = 0; } ClockPoint = (~ClockPoint) & 0x01; if(Flag_ReadTime == 0) { _microsecond_10 = microsecond_10; _second = second; } } void TimeUpdate(void) { if(ClockPoint)tm1637.point(POINT_OFF);//POINT_ON = 1,POINT_OFF = 0; включение и выключение двоеточия else tm1637.point(POINT_OFF); TimeDisp[2] = _microsecond_10 / 10; TimeDisp[3] = _microsecond_10 % 10; TimeDisp[0] = _second / 10; TimeDisp[1] = _second % 10; Update = OFF; } void stopwatchStart()//timer1 on { Flag_ReadTime = 0; } void stopwatchPause()//timer1 off if [CS12 CS11 CS10] is [0 0 0]. { TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12)); } void stopwatchReset() { stopwatchPause(); Flag_ReadTime = 0; _microsecond_10 = 0; _second = 0; microsecond_10 = 0; second = 0; Update = ON; }
А вот второй:
// неСпортивный секундомер #include <MsTimer2.h> #include <TM1637.h> #include <Button.h> #define CLK 3 #define DIO 2 TM1637 tm1637(CLK, DIO); Button buttonReset(16, 10); // кнопка СБРОС, вывод 16 (A2) Button buttonStartStop(17, 10); // кнопка ПУСК/СТОП, вывод 17 (A3) byte mode = 0; // режим, 0 - СТОП, 1 - ПУСК unsigned long msTime = 0; // время интервала, милисекунды byte minTime = 0; // время интервала, минуты byte decMinTime = 0; // время интервала, десятки минуты unsigned long prevTime; // предыдущее значение времени unsigned long curentTime; // текущее значение времени //----------------------------------------------------------------------------СЕТАП БЛЯ----------------------------------------------------------------------------- void setup() { MsTimer2::start(); // разрешение прерывания tm1637.init(); //инициализация. НЕ ТРОГАТЬ СВОИМИ КРИВЫМИ РУКАМИ tm1637.set(0); // яркость от 0 до 7 } //-------------------------------------------------------------------------------ЛУП БЛЯ------------------------------------------------------------------------------------------- void loop() { //--------------------------------------------------------------------- переключение режима СТАРТ/СТОП------------------------------------------------------- if ( buttonStartStop.flagClick == true ) { buttonStartStop.flagClick = false; // сброс признака // инверсия режима if ( mode == 0) { mode = 1; // СТАРТ } else { // СТОП mode = 0; } } //----------------------------------------------------------------------------- кнопка СБРОС------------------------------------------------ if ( buttonReset.flagClick == true ) { buttonReset.flagClick = false; // сброс признака msTime = 0; minTime = 0; decMinTime = 0; } //------------------------------------------------------------------------------- отсчет времени------------------------------------------------ if ( mode == 0 ) { // СТОП prevTime = millis(); } else { // ПУСК curentTime = millis(); // чтение текущего времени msTime += curentTime - prevTime; // прибавление времени к милисекундам if ( msTime > 59999 ) { // милисекунды переполнились, больше минуты msTime -= 60000; minTime ++; // +1 к единицам минут if ( minTime > 9 ) { // единицы минут переполнились minTime -= 10; decMinTime ++; // +1 к десяткам минут } } prevTime = curentTime; // перегрузка предыдущего времени } //--------------------------------------------------------------------------------------------- отображение времени ------------------------------------------------------------------------ //Вывод значения счетчика на дисплей void TimeUpdate(void) { if (ClockPoint)tm1637.point(POINT_OFF); //POINT_ON = 1,POINT_OFF = 0; включение и выключение двоеточия else tm1637.point(POINT_OFF); TimeDisp[2] = _microsecond_10 / 10; TimeDisp[3] = _microsecond_10 % 10; TimeDisp[0] = _second / 10; TimeDisp[1] = _second % 10; Update = OFF; }
Уважаемые форумчане, жду вашей помощи!
Вообщем с горем пополам, вышла такая штука:
Оно заработало!)
Раскажу в кратце что это за устройства планируются.
Это будет игровым устройством(для квестовых игр), ретривером - для "добычи ресурсов". Кол-во добытых ресурсов будет отображатся на дисплее. "Добываться" они будут путём замыкания "кнопки" старт(хитрая антуражная система, не суть).
Теперь задача дополнилась.
Надо сделать так, чтобы с одного "ретривера" можно было перекачать добытые ресурсы, на другой "ретривер" .
Сейчас схематически нарисую предположительную картину работы....
Как то так!)
По началу думал для "откачивания" просто сделать другой код, аналогичный кнопке, на обратный отчёт, но в таком случае выкачивающий "ретривер" мог бы качатся от "жертвы" бесконечно, что есть читерство.
Какие мысли есть на счёт того, чтобы "откачав" груз "ретривера" жертвы до нуля, процесс остановился?
Перезалью в тему с другим названием, сие устарело
спустя несколько суток поспешил
Дейстительно, поспешил. Поковырялся бы хоть несколько месяцев сам.
Тем более, что
Оно заработало!)
Точно - поспешил!
И сроки горят, и сраки горят.
Абсолютно согласен, многому ещё учится, очень многому.
И сроки горят, и сраки горят.
Абсолютно согласен, многому ещё учится, очень многому.
Обьясните - нафига вы за это беретесь, если по своим же словам - полный нуль в этом? Еще и сроки какие-то горят...
Обьясните - нафига вы за это беретесь, если по своим же словам - полный нуль в этом? Еще и сроки какие-то горят...
Ибо сказано, дурину может кодить любая домохозяйка, а домохозяин и подавно. Забыли сказать, что тех.минимум выучить придется. А так, да, истинно, любая домохозяйка умеющая читать. Читать отставить, писать. Вот, теперь правильно.