Подскажите новичку

pelmen
pelmen аватар
Offline
Зарегистрирован: 04.04.2012

Уважаемые гуру

Нужно сделать таймер, заданное время по нажатию кнопки начинает отсчет до нуля.

При таком цикле кнопку можно и не держать, он всёравно отсчитает до нуля.

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

Вот что я сделал:

#include <LiquidCrystal.h>
#include <EEPROM.h>

LiquidCrystal lcd(4, 5, 10, 11, 12, 9);
int switchPinGO = 8; // номер входа, подключенный к кнопке
int switchPinUp = 7;
int switchPinDown = 3;
int beep=2;
int x;
int a=1;
int y;
void setup()
{
pinMode(switchPinGO, INPUT);
pinMode(switchPinUp, INPUT);
pinMode(switchPinDown, INPUT);
pinMode(beep, OUTPUT);
Serial.begin(9600);
lcd.begin(20, 2);
lcd.print(" Timer");
delay(3000);
}

void loop()
{

if (digitalRead(switchPinUp) == HIGH)
{
x=EEPROM.read(a)+1;
lcd.clear();
lcd.setCursor(9, 0);
lcd.print(x);
EEPROM.write(1, x);
delay(500);
}

else if (digitalRead(switchPinDown) == HIGH)
{
x=EEPROM.read(a)-1;
lcd.clear();
lcd.setCursor(9, 0);
lcd.print(x);
EEPROM.write(1, x);
delay(500);
}

else if (digitalRead(switchPinGO) == HIGH)
{
y=EEPROM.read(a);
while (y!=0)
{
y=y-1;
lcd.clear();
lcd.setCursor(9, 0);
lcd.print(y);
delay(1000);
}}

else
{
if (y==0) tone(beep,1000,300);
y=EEPROM.read(a);
lcd.clear();
lcd.setCursor(9, 0);
lcd.print(y);
delay(50);
}
}

 

Спасибо

 

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

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

pelmen
pelmen аватар
Offline
Зарегистрирован: 04.04.2012

 Компоненты: ардуино, LCD, 3 кнопки (плюс, минус, старт) , динамик.

Плюс и минус выставляют время старта таймера в секундах и значение записывается в EEPROM.

При нажатии на СТАРТ начинается отсчет времени от значения которое в памяти до нуля.

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

Так вот на данный момент написан цикл, который запускает таймер по нажатии кнопки и независимо от того, будешь ты удерживать кнопку СТАРТ или нет, он досчитает до нуля.

А нужно сделать, что  бы нажал на СТАРТ и УДЕРЖИВАЕШЬ, тогда происходит отсчет, а когда отпустил показания возвращаются к значению из EEPOM, независимо, досчитал он до нуля или нет.

Реальное применение это заготовка вставляется в оснастку (происходит нажатие на кнопку внутри остнастки) и греется, через заданное время идет сигнал оператору "вынимай".

Спасибо

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

Ну попробуйте так:

#include <LiquidCrystal.h>
#include <EEPROM.h>

LiquidCrystal lcd(4, 5, 10, 11, 12, 9);
int switchPinGO = 8; // номер входа, подключенный к кнопке
int switchPinUp = 7;
int switchPinDown = 3;
int beep=2;
int x; 
int a=1;
int y;
void setup()
{
  pinMode(switchPinGO, INPUT); 
  pinMode(switchPinUp, INPUT);
  pinMode(switchPinDown, INPUT);
  pinMode(beep, OUTPUT);
  Serial.begin(9600);
  lcd.begin(20, 2);
  lcd.print(" Timer");
  delay(3000); 
}

void loop() 
{

  if (digitalRead(switchPinUp) == HIGH)
  {
    x=EEPROM.read(a)+1;
    lcd.clear();
    lcd.setCursor(9, 0);
    lcd.print(x);
    EEPROM.write(1, x);
    delay(500);
  }

  else if (digitalRead(switchPinDown) == HIGH)
  {
    x=EEPROM.read(a)-1;
    lcd.clear();
    lcd.setCursor(9, 0);
    lcd.print(x);
    EEPROM.write(1, x);
    delay(500);
  }

  else if (digitalRead(switchPinGO) == HIGH)
  {
    y=EEPROM.read(a);
    while (y!=0 && digitalRead(switchPinGO == HIGH))
    {
      y=y-1;
      lcd.clear();
      lcd.setCursor(9, 0);
      lcd.print(y);
      delay(1000);
    }
    if(y==0) 
    {
      tone(beep,1000,300);
    }
  }

  else
  {
    if (y==0) 
    {
      tone(beep,1000,300);
    }
    y=EEPROM.read(a);
    lcd.clear();
    lcd.setCursor(9, 0);
    lcd.print(y);
    delay(50); 
  }
}

 

pelmen
pelmen аватар
Offline
Зарегистрирован: 04.04.2012

 Ничего не изменилось. К сожалению...

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

LiquidCrystal lcd(4, 5, 10, 11, 12, 9);
int switchPinGO = 8; // номер входа, подключенный к кнопке
int switchPinUp = 7;
int switchPinDown = 3;
int beep=2;
int x; 
int a=1;
int y;
void setup()
{
  pinMode(switchPinGO, INPUT); 
  pinMode(switchPinUp, INPUT);
  pinMode(switchPinDown, INPUT);
  pinMode(beep, OUTPUT);
  Serial.begin(9600);
  lcd.begin(20, 2);
  lcd.print(" Timer");
  delay(3000); 
}

void loop() 
{

  if (digitalRead(switchPinUp) == HIGH)
  {
    x=EEPROM.read(a)+1;
    lcd.clear();
    lcd.setCursor(9, 0);
    lcd.print(x);
    EEPROM.write(1, x);
    delay(500);
  }

  if (digitalRead(switchPinDown) == HIGH)
  {
    x=EEPROM.read(a)-1;
    lcd.clear();
    lcd.setCursor(9, 0);
    lcd.print(x);
    EEPROM.write(1, x);
    delay(500);
  }

  if (digitalRead(switchPinGO) == HIGH)
  {
    y=EEPROM.read(a);
    while (y!=0 && digitalRead(switchPinGO == HIGH))
    {
      y=y-1;
      lcd.clear();
      lcd.setCursor(9, 0);
      lcd.print(y);
      delay(1000);
    }
    if(y==0) 
    {
      tone(beep,1000,300);
      y=EEPROM.read(a);
      lcd.clear();
      lcd.setCursor(9, 0);
      lcd.print(y);
      delay(50);
    }
  }
}

 

pelmen
pelmen аватар
Offline
Зарегистрирован: 04.04.2012

 К сожалению опять мимо.

Кнопку СТАРТ отпускаешь, а циферки продолжают отсчитывать время.

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

LiquidCrystal lcd(4, 5, 10, 11, 12, 9);
int switchPinGO = 8; // номер входа, подключенный к кнопке
int switchPinUp = 7;
int switchPinDown = 3;
int beep=2;
int x; 
int a=1;
int y;
void setup()
{
  pinMode(switchPinGO, INPUT); 
  pinMode(switchPinUp, INPUT);
  pinMode(switchPinDown, INPUT);
  pinMode(beep, OUTPUT);
  Serial.begin(9600);
  lcd.begin(20, 2);
  lcd.print(" Timer");
  delay(3000); 
}

void loop() 
{

  if (digitalRead(switchPinUp) == HIGH)
  {
    x=EEPROM.read(a)+1;
    lcd.clear();
    lcd.setCursor(9, 0);
    lcd.print(x);
    EEPROM.write(1, x);
    delay(500);
  }

  else if (digitalRead(switchPinDown) == HIGH)
  {
    x=EEPROM.read(a)-1;
    lcd.clear();
    lcd.setCursor(9, 0);
    lcd.print(x);
    EEPROM.write(1, x);
    delay(500);
  }

  else if (digitalRead(switchPinGO) == HIGH)
  {
    y=EEPROM.read(a);
    while (y!=0 && digitalRead(switchPinGO) == HIGH)
    {
      y=y-1;
      lcd.clear();
      lcd.setCursor(9, 0);
      lcd.print(y);
      delay(1000);
    }
    if(y==0) 
    {
      tone(beep,1000,300);
    }
  }

  else
  {
    if (y==0) 
    {
      tone(beep,1000,300);
    }
    y=EEPROM.read(a);
    lcd.clear();
    lcd.setCursor(9, 0);
    lcd.print(y);
    delay(50); 
  }
}

 

pelmen
pelmen аватар
Offline
Зарегистрирован: 04.04.2012

 Алелуя

Заработало

только новый косяк

Держишь кнопу

Таймер отсчитывает до нуля, пищит и начинает снова отсчитывать.

А это не верно

alexeyholin1973
Offline
Зарегистрирован: 13.04.2012

Здравствуйте! Подскажите пожалуйста, какой шаблонный образ имеет программа на Arduion, что является у программы точкой ввода (подобно main() )  ?

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

alexeyholin1973 пишет:

Здравствуйте! Подскажите пожалуйста, какой шаблонный образ имеет программа на Arduion, что является у программы точкой ввода (подобно main() )  ?

void setup() {
  // put your setup code here, to run once:
  // запускается только один раз, после каждой подачи питания или сброса платы Arduino.
}

void loop() {
  // put your main code here, to run repeatedly: 
  // крутится в цикле, позволяя вашей программе совершать вычисления и реагировать на них.
}

 

Из файла main.cpp:

#include <WProgram.h>

int main(void)
{
	init();

	setup();
    
	for (;;)
		loop();
        
	return 0;
}

 

alexeyholin1973
Offline
Зарегистрирован: 13.04.2012

Спасибо!

alexeyholin1973
Offline
Зарегистрирован: 13.04.2012

У меня есть ещё вопрос) 

Можно ли использовать для программирования не оригинальную среду Arduino, но другую среду, например, желательно, Visual Studio ?

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

Думаю, что нет, я по крайней мере там ничего подобного не видел. Если вы более или менее можите работать в Visual Studio, то вам будет не сложно работать в Arduino IDE.

step962
Offline
Зарегистрирован: 23.05.2011

alexeyholin1973 пишет:

У меня есть ещё вопрос) 

Можно ли использовать для программирования не оригинальную среду Arduino, но другую среду, например, желательно, Visual Studio ?

Можно.

Только сказав А, придется сказать Б и отказаться от применения нативного бутлоадера Ардуино (он работает только в связке с интегрированным в IDE модулем ISP-программирования).
 Либо найти в Интернете программу, которая может заливать готовые HEX-файлы в Ардуино, используя его родной бутлоадер (ибо просто заливальщиков просто пруд пруди - с их помощью тот же бутлоадер прописывают в чип).
 Либо найти протокол обмена между аплоадером и бутлоадером и написать свою программу, которая будет "правильно" отдавать HEX-файл на устройство.
 Но после сказанных А и Б что у вас от Ардуино останется? Только пресловутый форм-фактор, который тоже не догма, ибо  mini, nano, fio и прочие lilypad...

А это уже опасная крамола. От нее уже недалеко до мысли о том, а не перейти ли на гораздо более удобную для отладки плату (что-нибудь вроде). А для подобных еретиков есть только один путь - позорное изгнание из рядов истинных ардуинолюбов.

Так что не шутите с огнем... ;)

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

Тогда на вопрос:

"Можно ли использовать для программирования не оригинальную среду Arduino, а например, блокнот?"

ответ будет: 

"Можно.

Только сказав А, придется сказать Б, В, Г и Д...." )