Прошу помощи.

69ika
Offline
Зарегистрирован: 05.11.2013

Всем привет. Я новичёк в програмировании ардуино и МК как таковых.

Необходима ваша помощь. На работе накрылся тазом один древний прибор( 1952 Г.В.) необходима его заменить.  

Суть в чём. Прибор Считает время и включает нагрузку. а также замеряет время от пуска до разрыва контакта. Точность прибора 1 сотая секунды. Время работы 123 секунды максимум. 

Задача в принципе проста. Нужно через порт задовать время в диапазоне от 0,01 сек до 123сек.При этом должна включаться нагрузка на заданное время (использую полевик для этих целей). Но оснаваная задача для меня получилась вот в чем. Я немогу сделать так чтоб у меня замерялось время от пуска до разрыва контакта. Подскажите пожалуйста, как это можно реализовать. 

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

так все-таки - задавать (заранее) или замерять (по факту) ?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Используя millis() - легко

http://arduino.ru/Reference/Millis

69ika
Offline
Зарегистрирован: 05.11.2013

Суть в чём. Изначально надо вводить время в ручную для настройки, желательно чтобы время было на экране , но это не обязательно. А потом надо замерить время т.е. Я ввожу время 123 сек. механизм начал работу и по размыканию контакта он мне выплёвывает время на экран и отрубает устройство. 

 

Lipt0n
Offline
Зарегистрирован: 04.11.2013

69ika пишет:

 по размыканию контакта

Программа стартует сразу после ввода времени или же по замыканию этого контакта?

Я так понимаю схема следующая -

1. Вы вводите время

2.Зажимаете кнопку(она же размыкающий контакт) 

3.Программа начинает выполняться.

4.Включается таймер

5.Включается нагрузка.

6.Если кнопка отжата(контакт разомкнулся) или прошло 123 секунды (или сколько задали) то программа прекращается

7.Выводится значение таймера

8.Отключается нагрузка

 

Правильно я понял?

69ika
Offline
Зарегистрирован: 05.11.2013

Lipt0n пишет:

69ika пишет:

 по размыканию контакта

Программа стартует сразу после ввода времени или же по замыканию этого контакта?

Я так понимаю схема следующая -

1. Вы вводите время

2.Зажимаете кнопку(она же размыкающий контакт) 

3.Программа начинает выполняться.

4.Включается таймер

5.Включается нагрузка.

6.Если кнопка отжата(контакт разомкнулся) или прошло 123 секунды (или сколько задали) то программа прекращается

7.Выводится значение таймера

8.Отключается нагрузка

 

Правильно я понял?

Абсолютно верно. только некоторые пункты идут одновременно. Но суть программы именно в этом.

Lipt0n
Offline
Зарегистрирован: 04.11.2013

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

int WorkTime=123000;  //время, которое задается в микросекундах
unsigned long startTime=0;		//сюда будет записываться время старта программы
unsigned long oldTime = 0; //переменная отсчета времени работы МК
boolean isRunning=0; // будет показано, что программа уже запущена
int loadPin=10;		//Контакт нагрузки
int button=12;			//Контакт "размыкания"
boolean finished=0;   // флаг, который не позволит запуститься программе, если таймер истек, а кнопку не отжали

void setup(){
 Serial.begin (9600);
pinMode(loadPin,OUTPUT);
pinMode(button, INPUT);
}

void start(){
	if (millis()-oldTime >=10){   // запускаем функцию каждые 10 микросекунд
		oldTime = millis();		// записываем в переменную текущее время МК
		if(isRunning=0)			//Если это первый запуск - записываем текущее время МК в качестве времени старта
			startTime = millis();
		isRunning=1;			//Помечаем программу как уже запущенную
		WorkTime = WorkTime - 10; //Отсчитываем те самые 10 микросекунд
		if(WorkTime<0){			//Если таймер истек, то ...
			loadPin=0;			// Отключаем нагрузку
			startTime=millis()-startTime;	// Вычисляем время выполнения (Вычитаем из текущего времени время запуска)
			isRunning=0;  //Помечаем что программа не выполняется
			finished=1;   // Записываем флан
			Serial.println("Счетчик истек! Время выполнения - "+startTime); //Вывод сообщения в консоль
		}
		if(button=0){			//Если мы отпустили кнопку...
			loadPin=0;			//Отключаем нагрузку
			startTime=millis()-startTime;	// Вычисляем время выполнения (Вычитаем из текущего времени время запуска)
			isRunning=0;  //Помечаем что программа не выполняется
			finished=0;
			Serial.println("Размыкание контакта! Время выполнения - "+startTime); //Вывод сообщения в консоль
		}
	}
}

void loop(){
if(button=1 and finished=0)
start();
}

UPD. Читал справочник и наткнулся на данную функцию http://arduino.ru/Reference/PulseIn , которая должна выполнять те же действия, но я с ней не знаком.

69ika
Offline
Зарегистрирован: 05.11.2013

Огромное спасибо! Вопрос. ВВод значение не по умалчанию это менять первую строку кода? ( значение)

Lipt0n
Offline
Зарегистрирован: 04.11.2013

69ika пишет:

Огромное спасибо! Вопрос. ВВод значение не по умалчанию это менять первую строку кода? ( значение)

Рано говорить спасибо, пока устройство не опробовано в полевых условиях :) Я вполне мог что-то не учесть.

Вне зависимости от того какое значение Вы там пропишите - оно будет по-умолчанию, т.к. грузится из МК. (отвечает за это первое значение. Оно в МИЛИсекундах, Вы писали, что задаете точность в САНТИсекундах - 1000 и 100 единиц в секунде соответственно).

Для того чтобы не прошивать МК каждый раз нужно дописать код, который будет принимать значение с компьютера. Вот пример со светодиодом:

http://www.arduino.cc/en/Tutorial/Dimmer

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

Lipt0n, ошибка на ошибке в коде....

Lipt0n
Offline
Зарегистрирован: 04.11.2013

com пишет:

Lipt0n, ошибка на ошибке в коде....

С точки зрения неработоспособности кода или его нерациональности?

UPD. В услловиях я использовал оператор присвоения (=), а не оператор сравнения (==). Я недавно программку писал на Delphi, вот оттуда это равно и приелось. И digitalRead я не использовал, тоже верно.

За указание на ошибки спасибо.В своё оправдание могу лишь сказать, что писал всё "на лету" пока мысль не вылетела и больше всего меня волновала логика(в ней то я не ошибся?:)).

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

digitalread сразу в глаза бросилось, button - это номер пина, а не его состояние, поэтому его изменение и выглядит несколько странно. для флагов надо отдельные переменные заводить

и самое начало - start() никогда не вызовется

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