таймер-часы, помогите с кодом ))

missa
Offline
Зарегистрирован: 06.11.2013

может у кого есть скетч на использование 4х семи-сегментного индикатора под таймер-часы... ну чтобы производил отсчет, можно было остановить и обнулить... совсем туплю ^_(((

missa
Offline
Зарегистрирован: 06.11.2013

ну хорошо, ни у кого нет, может кто подскажет как сделать так, чтобы мигала точка только между секундами и минутами. а-то мигают все четыри... не знаю как исправить

vvadim
Offline
Зарегистрирован: 23.05.2012

точка это отдельный светодиод, вот им и мигайте. посмотрите распиновку индикатора

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вот юзайте если сами не хотите писать

общий катод или анод не помню. массив если что надо будет менять и пару строк

//============================================================================
//  Программные часы с 7 сегментным индикатором
//============================================================================

//============================================================================
//  Выводы подключения 7 сегментного индикатора
//============================================================================
#define DIGIT1 7
#define DIGIT2 11
#define DIGIT3 12
#define DIGIT4 A2

#define SEGMENTA 8
#define SEGMENTB 13
#define SEGMENTC A0
#define SEGMENTD A4
#define SEGMENTE A5
#define SEGMENTF 9
#define SEGMENTG A1
#define SEGMENT_DP A3

//============================================================================
//  Переменные хранения времени
//============================================================================
long prevmicros = 0;  //переменная для хранения значений таймера
byte sek = 0;          //значение секунд
byte minu = 0;         //значение минут
byte chas = 0;         //значение часов
boolean counter=false; // счетчик для полусекунд

void setup(){
//============================================================================
//  Настраиваем выводы на выход
//============================================================================
  pinMode(DIGIT1, OUTPUT);
  pinMode(DIGIT2, OUTPUT);
  pinMode(DIGIT3, OUTPUT);
  pinMode(DIGIT4, OUTPUT);

  pinMode(SEGMENTA, OUTPUT);
  pinMode(SEGMENTB, OUTPUT);
  pinMode(SEGMENTC, OUTPUT);
  pinMode(SEGMENTD, OUTPUT);
  pinMode(SEGMENTE, OUTPUT);
  pinMode(SEGMENTF, OUTPUT);
  pinMode(SEGMENTG, OUTPUT);
  pinMode(SEGMENT_DP, OUTPUT);
}

void loop(){

  if (micros() - prevmicros >500000){    
    prevmicros = micros();        //принимает значение каждые полсекунды
    counter=!counter;
    if (counter==false)
    {     
      sek++;                      //переменная секунда + 1
      digitalWrite(SEGMENT_DP,0); //включаем точки
    }
    else 
    {
      digitalWrite(SEGMENT_DP,1); //выключаем точки
    }
    
//============================================================================
//  Считачем часы минуты секунды
//============================================================================
    if(sek>59){    //если переменная секунда больше 59 ...
      sek=0;       //сбрасываем ее на 0
      minu++;      //пишем +1 в переменную минута
    }
    if(minu>59){   //если переменная минута больше 59 ...
      minu=0;      //сбрасываем ее на 0
      chas++;      //пишем +1 в переменную час
    }
    if(chas>23){   //если переменная час больше 23 ...
      chas=0;      //сбрасываем ее на 0
    }
  }

//============================================================================
//  разбиваем часы,минуты и секунды на цифры (секунды только на время тестирования)
//============================================================================  
  byte chas_1 = chas/10;  //1 цифра часов
  byte chas_2 = chas%10;  //2 цифра часов
  byte minu_1 = minu/10;  //1 цифра минут
  byte minu_2 = minu%10;  //2 цифра минут
  byte sek_1 = sek/10;    //1 цифра секунд
  byte sek_2 = sek%10;    //2 цифра секунд
  
//============================================================================
//  Выводим время
//============================================================================  
  vivod(minu_1);
  digitalWrite(DIGIT1,1);
  digitalWrite(DIGIT1,0);
  vivod(minu_2);
  digitalWrite(DIGIT2,1);
  digitalWrite(DIGIT2,0);
  vivod(sek_1);
  digitalWrite(DIGIT3,1);
  digitalWrite(DIGIT3,0);
  vivod(sek_2);
  digitalWrite(DIGIT4,1);
  digitalWrite(DIGIT4,0);
 
}
//============================================================================
//  Массив с включаемыми сегментами индикатора соответстуеющие цифрам
//============================================================================  
byte cifr(byte y, byte x){
  byte myArray[10][7]={
  {0,0,0,0,0,0,1}, // цифра 0
  {1,0,0,1,1,1,1}, // цифра 1
  {0,0,1,0,0,1,0}, // цифра 2
  {0,0,0,0,1,1,0}, // цифра 3
  {1,0,0,1,1,0,0}, // цифра 4
  {0,1,0,0,1,0,0}, // цифра 5
  {0,1,0,0,0,0,0}, // цифра 6
  {0,0,0,1,1,1,1}, // цифра 7
  {0,0,0,0,0,0,0}, // цифра 8
  {0,0,0,0,1,0,0}, // цифра 9
 };
return myArray[y][x];
}
//============================================================================
//  Управление сегментами индикатор соответствующее числу number
//============================================================================

void vivod(byte number){
  digitalWrite(SEGMENTA,(cifr(number,0)));
  digitalWrite(SEGMENTB,(cifr(number,1)));
  digitalWrite(SEGMENTC,(cifr(number,2)));
  digitalWrite(SEGMENTD,(cifr(number,3)));
  digitalWrite(SEGMENTE,(cifr(number,4)));
  digitalWrite(SEGMENTF,(cifr(number,5)));
  digitalWrite(SEGMENTG,(cifr(number,6)));
}
  

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

можно обойтись без массива если переделать под этот код

void Vivod(byte n) {
  if((n!=1)&&(n!=4)){                           
    digitalWrite(SEGMENTA,1);           // сегмент A
  }
  if((n!=5)&&(n!=6)){                     
    digitalWrite(SEGMENTB,1);           // сегмент B
  }
  if(n!=2){                           
    digitalWrite(SEGMENTC,1);           // сегмент C
  }
  if((n!=1)&&(n!=4)&&(n!=7)){               
    digitalWrite(SEGMENTD,1);           // сегмент D
  }
  if((n==0)||(n==2)||(n==6)||(n==8)){   
    digitalWrite(SEGMENTE,1);           // сегмент E
  }
  if((n!=1)&&(n!=2)&&(n!=3)&&(n!=7)){   
    digitalWrite(SEGMENTF,1);           // сегмент F
  }
  if((n!=0)&&(n!=1)&&(n!=7)){     
    digitalWrite(SEGMENTG,1);           // сегмент G
  }
}

остановку и обнуление сами добавляйте

com
Offline
Зарегистрирован: 06.09.2013

jeka_tm пишет:

вот юзайте если сами не хотите писать

общий катод или анод не помню. массив если что надо будет менять и пару строк

это код чего угодно, но только не часов на 4-х 7-мисегментных индикаторах. либо половину потеряли когда копипастили

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

com пишет:

jeka_tm пишет:

вот юзайте если сами не хотите писать

общий катод или анод не помню. массив если что надо будет менять и пару строк

это код чего угодно, но только не часов на 4-х 7-мисегментных индикаторах. либо половину потеряли когда копипастили

да ладно. а я и не знал. видно часы которые я реально запускал не должны были работать)))

что же вас смутило что вы так яросто утверждаете что это не должно работать

com
Offline
Зарегистрирован: 06.09.2013

приведите схему подключения

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в коде в начале смециально названо чтобы было понятно что куда подключать

#define DIGIT1 7
#define DIGIT2 11
#define DIGIT3 12
#define DIGIT4 A2

#define SEGMENTA 8
#define SEGMENTB 13
#define SEGMENTC A0
#define SEGMENTD A4
#define SEGMENTE A5
#define SEGMENTF 9
#define SEGMENTG A1
#define SEGMENT_DP A3

это для кого написано? читать научитесь

com
Offline
Зарегистрирован: 06.09.2013

а вот хамить не надо

если бы попытались подумать и соотнести схему с кодом, то поняли бы, что ваши часы выводят все, кроме собственнов часов - минуты выводят, секунды выводят, а именно часы - нет

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

секунды для тестирования выводятся. чтобы понять все ли правильно подключено

когда все норм. и цифры правильно показываются. разряды не перепутали меняется на 

  vivod(chas_1);
  digitalWrite(DIGIT1,1);
  digitalWrite(DIGIT1,0);
  vivod(chas_2);
  digitalWrite(DIGIT2,1);
  digitalWrite(DIGIT2,0);
  vivod(minu_1);
  digitalWrite(DIGIT3,1);
  digitalWrite(DIGIT3,0);
  vivod(minu_2);
  digitalWrite(DIGIT4,1);
  digitalWrite(DIGIT4,0);

если сразу включить часы и минуты проверка затянется

а при чем здесь схема подключения?

missa
Offline
Зарегистрирован: 06.11.2013

ребята, не ругайтесь - смысла-то нет кровь портить. сип-сип, код работает, часики тикают))) тока остановку-то как сделать? и как эти точки после 1 и 3 диг'а убрать - мамочки как раздражает, чё-т мучаюсь - ничего не получается... туплю не потому что тупая, а потому что ещё не умею (первый курс^~/) хотя может и тупая малёх

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

укажите какие точки вы хотите зажечь

предполагаю у вас такой дисплей

у меня лежит дисплей в нем только средние работают а точки не работают (вроде так)

а бывают наоборот. какой у вас

кстати если применить дисплей с 6 цифрами можно выводить часы минуты и секунды

чтобы останавливать нужно добавить кнопку и ее обработку, в том числе с защитой от дребезга

и в этот кусок добавить условие

if (micros() - prevmicros >500000){    
    prevmicros = micros();        //принимает значение каждые полсекунды
    counter=!counter;
    if (counter==false && button_1 == true)        // button_1 будет переменная зависящая от кнопки 1
    {     
      sek++;                                  //переменная секунда + 1
      digitalWrite(SEGMENT_DP,0); //включаем точки
    }
    else 
    {
      digitalWrite(SEGMENT_DP,1); //выключаем точки
    }

честно сказать не самое лучше решение, будет происходить такое что запускаться не сразу, а через какое то время, секунду максимум. если это вас устроит то все норм. если нет то надо сделать по другому

вот пример работы с кнопками

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

обнулять значения будем от кнопки button_2

   if(button_2 == true) {    //если кнопка 2 нажата
      sek=0;      //сбрасываем  на 0 секунды
      minu=0;     //сбрасываем  на 0 минуты 
      chas=0;     //сбрасываем  на 0 часы
  }

 

missa
Offline
Зарегистрирован: 06.11.2013

у меня только такой (NFD-3641BS), с общим анодом, программа, кстати для общего анода и написана. вот хотелось бы чтобы мигали только 2 точки. ща попробую остановку))) и где это вы всё учите....

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а какие точки должны светиться?

вам повезло, а то пришлось бы инвертировать массив

буквально полгода назад был почти как вы. много читал и пробовал. когда что то не получается или не понимешь задаешь вопрос

missa
Offline
Зарегистрирован: 06.11.2013

ну вторая и четвёртая, чтобы типа делили визуально минуты и часы. мне бы ещё кнопки вбахать надо, которыми можно установить время вручную, с этим и мучаюсь в данный момент.^%// я то-к на форумах могу учить, книжки на инглиш, а мы не оч дружим... я тут про закон ома вроде как в первый раз два месяца назад услышала. думаю вы не были почти как я)))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну я же сказал почти. я имел в виду программирование.

должны светиться постоянно или моргать как секундные точки?

missa
Offline
Зарегистрирован: 06.11.2013

вот я хотела чтобы моргали, но......   я оказалась барышней переменчивой - откопала LCD дисплей и все  это добро перекинула на него (скетч, конеч стырила, ну да там похоже было) + забахала кнопки чтобы можно было выставлять время, сижу - будильник колдую.. но .... у меня вопрос остался не решённым - может знаете - как мне с помощью кнопки останаливать время и снова запускать не обнуляя? спасибки, кстати за ссылку про кнопки - многое выучила - там было и про остановку (пример со светодиодами), но у меня почему-то не работает (наверно чё-т не так делаю), может уже имели с этим дело-a

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так я же давал код как остановить и снова запустить. и как обнулить тоже. просто делаете обработку снопки. состояние кнопки записываете в переменную button_1 типа boolean

if (micros() - prevmicros >500000){    
    prevmicros = micros();        //принимает значение каждые полсекунды
    counter=!counter;
    if (counter==false && button_1 == true)        // button_1 будет переменная зависящая от кнопки 1
    {     
      sek++;                                  //переменная секунда + 1
      digitalWrite(SEGMENT_DP,0); //включаем точки
    }
    else 
    {
      digitalWrite(SEGMENT_DP,1); //выключаем точки
    }

когда кнопка false счет остановится, когда true запустится

missa
Offline
Зарегистрирован: 06.11.2013

это ж вы про 7-сегментник, верно? а как на LCD дисплее остановить? я, верно, точно туплю... 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

это счет и ему по барабану дисплей и что вы выводите.

if (micros() - prevmicros >500000){    
    prevmicros = micros();        //принимает значение каждые полсекунды
    counter=!counter;
    if (counter==false && button_1 == true)
    {     
      sek++;                      //переменная секунда + 1
    }
    
//============================================================================
//  Считачем часы минуты секунды
//============================================================================
    if(sek>59){    //если переменная секунда больше 59 ...
      sek=0;       //сбрасываем ее на 0
      minu++;      //пишем +1 в переменную минута
    }
    if(minu>59){   //если переменная минута больше 59 ...
      minu=0;      //сбрасываем ее на 0
      chas++;      //пишем +1 в переменную час
    }
    if(chas>23){   //если переменная час больше 23 ...
      chas=0;      //сбрасываем ее на 0
    }
  }

попробуйте сделать так

missa
Offline
Зарегистрирован: 06.11.2013

блин... не получается - вообще тогда при запуске ардуино отсчёт не идет.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

код обработки кнопки приложите

missa
Offline
Зарегистрирован: 06.11.2013
#include <LiquidCrystal.h>

long prevmicros = 0;

int sek = 0;
int minutt = 0;
int time = 0;
int knappM = 0; 
int knappT = 0; 
boolean counter = false; 

LiquidCrystal lcd (12, 10, 5, 4, 3, 2);

void setup (){

  lcd.begin (16, 2);
  pinMode (8, INPUT);
  pinMode (6, INPUT);
  pinMode (13, OUTPUT);

}

void loop (){
  if (micros () < prevmicros) {
    prevmicros = 0;
  }
  if (micros () - prevmicros > 500000){
    prevmicros = micros ();
    counter = !counter;
    if (counter == false) {
      sek ++;


    
      lcd.setCursor (6, 1);
      lcd.print (":"); 
      lcd.setCursor (9, 1);
      lcd.print (":");
    }

    else
    {
      lcd.setCursor (9, 1);
      lcd.print (" ");
      lcd.setCursor (6,1);
      lcd.print (" ");
    }

    if (sek>59)
    {
      sek = 0;
      minutt++;
    }

    if (minutt>59)..
    {
      minutt = 0;
      time++; 
    }

    if (time>23)
    {
      time = 0;
    }

   

    lcd.setCursor (4, 1); 
   
    if (time <10){
      lcd.print ("0");
      lcd.print (time);
    } 
    else lcd.print (time);

    lcd.setCursor (7, 1); 
    
    if (minutt <10){
      lcd.print ("0");
      lcd.print (minutt); 
    } // antall minutter
    else lcd.print (minutt);

    lcd.setCursor (10, 1);
    
    if (sek <10){
      lcd.print ("0");
      lcd.print (sek); 
    } 
    else lcd.print (sek);
  }





  if (digitalRead (8) == HIGH&&knappM == 0)
    
  {
    minutt++; 
    sek = 0; 
    knappM++; 
   
   
    


    if (time < 10)
    {
      lcd.setCursor (5, 1);
      lcd.print (time);
      lcd.setCursor (4, 1);
      lcd.print ("0");
    }
    else {
      lcd.setCursor (4, 1);
      lcd.print (time);
    }
    if (minutt < 10)
    {
      lcd.setCursor (8, 1);
      lcd.print (minutt);
      lcd.setCursor (7, 1);
      lcd.print ("0");
    }
    else
    {
      lcd.setCursor (7, 1); 
      lcd.print (minutt);
    }
    lcd.setCursor (10, 1);
    lcd.print (sek);
  }

  if (digitalRead (8) == LOW&&knappM == 1)
   
  {
    knappM = 0; 
  }


  if (digitalRead (6) == HIGH&&knappT == 0)
   
  {
    time++; 
    sek = 0; 
    knappT++; 
    
    


    if (time < 10)
    {
      lcd.setCursor (5, 1);
      lcd.print (time);
      lcd.setCursor (4, 1);
      lcd.print ("0");
    }
    else {
      lcd.setCursor (4, 1);
      lcd.print (time);
    }
    if (minutt < 10)
    {
      lcd.setCursor (8, 1);
      lcd.print (minutt);
      lcd.setCursor (7, 1);
      lcd.print ("0");
    }
    else
    {
      lcd.setCursor (7, 1); 
      lcd.print (minutt);
    }

    lcd.setCursor (10, 1);
    lcd.print (sek);
  }

  if (digitalRead (6) == LOW&&knappT == 1) 
    
  {
    knappT = 0;
  }



  lcd.setCursor (5, 0);
  lcd.print ("KLOKKE");

}

помогите, кто может, не могу закончить программу - есть LCD дисплей, считает время + можно выставить время вручную. как остановить часы так, чтобы время остановилось при нажатии на кнопку, а при повторном нажатии обнулило значение и считывало время заново с нуля? желательно избежать глобальных переменних, но мне уже пофиг, лишь бы программку дописать... 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

попробуйте для начала так. это ваш код только немного переделанный

#include <LiquidCrystal.h>

long prevmicros = 0;

int sek = 0;
int minutt = 0;
int time = 0;
int knappM = 0; 
int knappT = 0; 
boolean counter = false; 

LiquidCrystal lcd (12, 10, 5, 4, 3, 2);

void setup (){
  lcd.begin (16, 2);
  pinMode (8, INPUT);
  pinMode (6, INPUT);
  pinMode (13, OUTPUT);
}

void loop (){
  if (micros () < prevmicros) {
    prevmicros = 0;
  }
  if (micros() - prevmicros >500000){    
    prevmicros = micros();        //принимает значение каждые полсекунды
    counter=!counter;
    if (counter==false){     
      sek++;                      //переменная секунда + 1
      //выводим точки
      lcd.setCursor (6, 1);
      lcd.print (":"); 
      lcd.setCursor (9, 1);
      lcd.print (":");
    }
    else
    {
      lcd.setCursor (6,1);
      lcd.print (" ");
      lcd.setCursor (9, 1);
      lcd.print (" ");
    }

    //считаем часы минуты секунды
    if (sek>59){
      sek = 0;
      minutt++;
    }
    if (minutt>59){
      minutt = 0;
      time++; 
    }
    if (time>23){
      time = 0;
    }
    vivod(); //выводим время
  }

  lcd.setCursor (5, 0);
  lcd.print ("KLOKKE");


  if (digitalRead (8) == HIGH&&knappM == 0){
    minutt++; 
    if (minutt>59){
      minutt = 0;
    }
    sek = 0; 
    knappM = 1;
    vivod();
  }

  if (digitalRead (6) == HIGH&&knappT == 0){
    time++; 
    if (time>23){
      time = 0;
    }
    sek = 0; 
    knappT = 1;
    vivod();
  }

  if (digitalRead (8) == LOW && knappM == 1){
    knappM = 0; 
  }
  if (digitalRead (6) == LOW&&knappT == 1){
    knappT = 0;
  }
}


void vivod(){
  lcd.setCursor (4, 1); 
  lcd.print (time/10);
  lcd.print (time%10);

  lcd.setCursor (7, 1); 
  lcd.print (minutt/10);
  lcd.print (minutt%10);

  lcd.setCursor (10, 1);
  lcd.print (sek/10);
  lcd.print (sek%10);
}

вам нужно добавить еще одну кнопку для остановки и запуска

но сначала проверьте этот. все так же работает или нет

missa
Offline
Зарегистрирован: 06.11.2013

агась, здорово, этот работае

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

у вас не бывает когда выставляете время что за одно нажатие не одна а сразу 2-3 цифры прибавляется?

missa
Offline
Зарегистрирован: 06.11.2013

не-а, все отлично работает )) 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну тогда добавляйте кнопку и пробуйте. если не получится пишите. но попробуйте сами

и старайтесь не писать огромные коды. если что то повторяется несколько раз используйте функции

missa
Offline
Зарегистрирован: 06.11.2013

aaa  спасибочки, я попробую=)) мя-у 

missa
Offline
Зарегистрирован: 06.11.2013

уфф...слушайте, ну не могу я эти часы остановить - что ж такое-то...  мозгов-то, видно, так и не прибавилось за неделю. у меня экзамен в 9.00, так я или с законченной програмкой или нет.. если есть желание помочь и время, ну, или жаль дурёху, помогите плизя, а-т у меня совсем чёт не получается.. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

пробуйте. еще одна кнопка на 7 выводе для остановки и запуска

#include <LiquidCrystal.h>

long prevmicros = 0;

int sek = 0;
int minutt = 0;
int time = 0;
int knappM = 0; 
int knappT = 0; 
boolean counter = false; 
boolean razr = false; 

LiquidCrystal lcd (12, 10, 5, 4, 3, 2);

void setup (){
  lcd.begin (16, 2);
  pinMode (8, INPUT);
  pinMode (6, INPUT);
  pinMode (7, INPUT);
  pinMode (13, OUTPUT);
  digitalWrite(7, HIGH);
}

void loop (){
  if (micros () < prevmicros) {
    prevmicros = 0;
  }
  if ((micros() - prevmicros >500000) && razr == false){    
    prevmicros = micros();        //принимает значение каждые полсекунды
    counter=!counter;
    if (counter==false){     
      sek++;                      //переменная секунда + 1
      //выводим точки
      lcd.setCursor (6, 1);
      lcd.print (":"); 
      lcd.setCursor (9, 1);
      lcd.print (":");
    }
    else
    {
      lcd.setCursor (6,1);
      lcd.print (" ");
      lcd.setCursor (9, 1);
      lcd.print (" ");
    }

    //считаем часы минуты секунды
    if (sek>59){
      sek = 0;
      minutt++;
    }
    if (minutt>59){
      minutt = 0;
      time++; 
    }
    if (time>23){
      time = 0;
    }
    vivod(); //выводим время
  }

  lcd.setCursor (5, 0);
  lcd.print ("KLOKKE");


  if (digitalRead (8) == HIGH&&knappM == 0){
    minutt++; 
    if (minutt>59){
      minutt = 0;
    }
    sek = 0; 
    knappM = 1;
    vivod();
  }

  if (digitalRead (6) == HIGH&&knappT == 0){
    time++; 
    if (time>23){
      time = 0;
    }
    sek = 0; 
    knappT = 1;
    vivod();
  }

  if (digitalRead (8) == LOW && knappM == 1){
    knappM = 0; 
  }
  if (digitalRead (6) == LOW&&knappT == 1){
    knappT = 0;
  }
  if (digitalRead (7) == LOW){
    razr != razr;
  }
}


void vivod(){
  lcd.setCursor (4, 1); 
  lcd.print (time/10);
  lcd.print (time%10);

  lcd.setCursor (7, 1); 
  lcd.print (minutt/10);
  lcd.print (minutt%10);

  lcd.setCursor (10, 1);
  lcd.print (sek/10);
  lcd.print (sek%10);
}

надо было раньше написать что не получается. зачем так долго тянули

missa
Offline
Зарегистрирован: 06.11.2013

не работает....вообще ничего не получается, ардуино на кнопку не реагирует

maksim
Offline
Зарегистрирован: 12.02.2012
#include <LiquidCrystal.h>

unsigned long prevmillis = 0;

byte sek = 0;
byte minutt = 0;
byte time = 0; 

boolean razr = false; 

LiquidCrystal lcd (12, 10, 5, 4, 3, 2);

void setup ()
{
  lcd.begin (16, 2);
  pinMode (13, OUTPUT);
}

void loop ()
{
  if (!razr && (millis() - prevmillis >= 500))
  {
    prevmillis = millis();        //принимает значение каждые полсекунды
    static boolean counter = false; 
    if (counter)
    {     
      sek++;                      //переменная секунда + 1
      to4ki(1); //выводим точки
      //считаем часы минуты секунды
      if (sek > 59)
      {
        sek = 0;
        minutt++;
      }
      if (minutt > 59)
      {
        minutt = 0;
        time++; 
      }
      if (time > 23) time = 0;
      vivod(); //выводим время
    }
    else to4ki(0);  
    counter = !counter;
  }


  static bool knappM = 0;
  if (!knappM && digitalRead(8))
  {
    minutt++; 
    if (minutt > 59) minutt = 0;
    sek = 0; 
    knappM = 1;
    vivod();
  }

  static bool knappT = 0;
  if (!knappT && digitalRead(6))
  {
    time++; 
    if(time > 23) time = 0;
    sek = 0; 
    knappT = 1;
    vivod();
  }

  static bool knappS = 0;
  if(!knappS && digitalRead(7))
  {
    razr != razr;
    knappS = 1;
    delay(100);
  }

  if (knappM && !digitalRead(8)) knappM = 0; 
  if (knappT && !digitalRead(6)) knappT = 0;
  if (knappS && !digitalRead(7)) knappS = 0;
}


void vivod()
{
  lcd.setCursor (5, 0);
  lcd.print ("KLOKKE");
  lcd.setCursor (4, 1); 
  lcd.print (time/10);
  lcd.print (time%10);

  lcd.setCursor (7, 1); 
  lcd.print (minutt/10);
  lcd.print (minutt%10);

  lcd.setCursor (10, 1);
  lcd.print (sek/10);
  lcd.print (sek%10);
}

void to4ki(bool en)
{
  lcd.setCursor(6, 1);
  lcd.print(en?':':' '); 
  lcd.setCursor(9, 1);
  lcd.print(en?':':' ');
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

спасибо максим доработал код

максим подскажите как это работает?

lcd.print(en?':':' ');

и еще вопрос. это условие . так можно писать вроде если только что то одно будет выполнятся?

в смысле не нужны фигурные скобки

читается: если knappM не равен нулю и инвертированное значение на 8 выводе не равно нулю то knappM равен нулю. так? 

if (knappM && !digitalRead(8)) knappM = 0;

 

maksim
Offline
Зарегистрирован: 12.02.2012

Работает так:

    en  ?   ':'   :  ' ' ;
if(en == 1) ':' else ' ' ;

Эквивалентные строки:

if(   knappM   &&   !digitalRead(8)  ) knappM = 0;
if(knappM == 1 && digitalRead(8) == 0) knappM = 0;

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

maksim пишет:

Работает так:

    en  ?   ':'   :  ' ' ;
if(en == 1) ':' else ' ' ;

Эквивалентные строки:

if(   knappM   &&   !digitalRead(8)  ) knappM = 0;
if(knappM == 1 && digitalRead(8) == 0) knappM = 0;

 

спасибо

missa
Offline
Зарегистрирован: 06.11.2013

jeka_tm - спасибо вам большое! вы меня тогда так выручили, я проект, кстати на 4 защитила - ну, я не все необходимые задания сделала + выучила-таки C++

а знаете ли вы язык программирования VHDL? у меня классика жанра - контрольная не сделана, а сдать надо 28-го... мне по-справедливости, т.е. за денежку)))
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

поздравляю. но я не владею тем языком