Счётчик с шагом 0.1

woow
Offline
Зарегистрирован: 21.02.2013

Прошу сильно не бить , только начинаю эксперименти с Arduino .

Не могу понять как сделать счётчик нажатия кнопки , но с шагом не 1 а 0.1

т.е. с каждым нажатие значение на LCD увеличивалось на 0.1 . Не нашёл ни одного похожего проекта где можно былобы подсмотреть как это реализовано  :(

woow
Offline
Зарегистрирован: 21.02.2013

woow пишет:

Прошу сильно не бить , только начинаю эксперименти с Arduino .

Не могу понять как сделать счётчик нажатия кнопки , но с шагом не 1 а 0.1

т.е. с каждым нажатие значение на LCD увеличивалось на 0.1 . Не нашёл ни одного похожего проекта где можно былобы подсмотреть как это реализовано  :(

Что здесь нужно изменить чтобы изменился шаг ?

01 	#include <LiquidCrystal.h>
02 	const int SensorPin = 8;
03 	int signal = 0;
04 	int Counter = 0;
05 	int lastSignal = 0;
06 	LiquidCrystal lcd(12, 10, 3, 4, 5, 6);
07 	void setup() {
08 	lcd.clear();
09 	delay(100);
10 	lcd.begin(16, 2);
11 	lcd.print("Sensor1::>");
12 	lcd.setCursor(11, 0);
13 	pinMode(SensorPin, INPUT);
14 	}
15 	void loop()
16 	{
17 	 
18 	signal = digitalRead(SensorPin);
19 	if (signal != lastSignal)
20 	{
21 	if (signal == HIGH)
22 	{
23 	Counter++;
24 	lcd.print(Counter);
25 	lcd.setCursor(11,0);
26 	delay(1);
27 	}
28 	lastSignal = signal;
29 	}
01  

 

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

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

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

Просто сделайте вывод на дисплей как 0,1 не переходя на вещественные числа.

#include <LiquidCrystal.h>
const int SensorPin = 8;
int signal = 0;
int Counter = 0;
int lastSignal = 0;
LiquidCrystal lcd(12, 10, 3, 4, 5, 6);

void setup() {
  lcd.begin(16, 2);
  lcd.clear();
  delay(100);
  lcd.setCursor(0, 0);
  lcd.print("Sensor1::>");
}
void loop()
{
  signal = digitalRead(SensorPin);
  if (signal != lastSignal)
  {
    if (signal == HIGH)
    {
      Counter++;
      lcd.setCursor(11,0);
      lcd.print(Counter/10);
      lcd.print(".");
      lcd.print(Counter%10); 
      delay(1);
    }
    lastSignal = signal;
  }
}

и учтите, если это кнопка, то она может "дребезжать", что бы устранить дребезг, нужно увеличить задержку в 35 строке.

woow
Offline
Зарегистрирован: 21.02.2013

Спасибо !!!

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

woow, замените int Counter = 0; на float Counter =0;

Так же измените строку  23  на Counter=Counter+0.1;

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

nestandart пишет:

woow, замените int Counter = 0; на float Counter =0;

Так же измените строку  23  на Counter=Counter+0.1;

А со вторым знаком после запятой (нулем) что потом делать?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>А со вторым знаком после запятой (нулем) что потом делать?<<

А зачем вообще что то с ним делать ? 

Вот сейчас проверил предложеный мной вариант. Все правильно.

Получаются значения 0.10 0.20 0.30 0.40 и т.д.

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

Перефразирую - зачем этот ноль?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Вам мешает этот 0 ?

Вы показали один вариант , я другой.

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Считайте целыми, а перед выводом поделите на 10, или выводите количество десятков, потом точку, потом единицы. Примерно так:

int temp;
...
temp=Counter/10;
LCD.print(temp);
LCD.print(".");
temp=Counter % 10;
LCD.print(temp);

 

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

AlexFisher пишет:

Считайте целыми, а перед выводом поделите на 10, или выводите количество десятков, потом точку, потом единицы. Примерно так:

int temp;
...
temp=Counter/10;
LCD.print(temp);
LCD.print(".");
temp=Counter % 10;
LCD.print(temp);

В сообщении #3 код разверните )

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Ну да... Поленился внимательно посмотреть, извините. "не переходите на вещественные числа" - приставка "не" потерялась по пути от глаз к мозгу :( Но это не плагиат, я тоже сам придумал!

woow
Offline
Зарегистрирован: 21.02.2013

Спасибо , все варианты работают  .

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

Если я правильно понял , если мне при достижении нужного значения (например 2.5) требуется получить сигнал на определёном выходе , в варианте с "int"  нужно сравнивать со значением в 10 раз большим (25) , а с "float" соответствует тому что вижу на LCD (2.5) ?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>Было интересно узнать что один и тот же результат можно получить двумя разными путями.<<

На самом деле вариантов гораздо больше.

 

>>а с "float" соответствует тому что вижу на LCD (2.5) ?<<

Да, именно так.

Небольшая поправка. Вариант с float выводит сотые доли. Т.е. на дисплее буде 2.50 а не 2.5.

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

maksim пишет:
А со вторым знаком после запятой (нулем) что потом делать?
Сам спросил, сам отвечу - можно и float выводить с одним знаком, достаточно в print() передать вторым параметром количество знаков после запятой.

  float Counter = 0;
  ...
  lcd.print(Counter, 1);
  ...
  Counter += 0.1;

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>достаточно в print() передать вторым параметром количество знаков после запятой.<<

Вот этого не знал.  maksim, не поделитесь ссылкой на первоисточник? Может еще чего полезного почерпну.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>Сам спросил, сам отвечу - можно и float выводить с одним знаком,<<

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

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

 

Это так , для более углубленого понимания.

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

Первоисточник самый первоисточный ) http://arduino.cc/en/Serial/Print