Автомат для заправки
- Войдите на сайт для отправки комментариев
Втр, 04/11/2014 - 12:40
Создаю автомат для заправки на основе ардуино. Смысл такой:
1. Вводятся деньги через купюроприемник
2. Нажимается кнопка подтверждения
3. Включается цикл, который работает, пока переменные litr и liters не прировняются.
4. Идет задержка , выводится сообщение.
5. Все обнуляется.
Но, после нажатия клавиши цикл не срабатывает, и сразу выбивает на финальное сообщение. И не могу придумать, как все сбросить.
int switchPin = 8; // кнопка для включения заправки
boolean lastButton = LOW;
boolean currentButton = LOW;
int nasosPin = 4;
int klapanPin = 5;
// Блок расходомера
#define FLOWSENSORPIN 3
// count how many pulses!
volatile uint16_t pulses = 0;
// track the state of the pulse pin
volatile uint8_t lastflowpinstate;
// you can try to keep time of how long it is between pulses
volatile uint32_t lastflowratetimer = 0;
// and use that to calculate a flow rate
volatile float flowrate;
// Interrupt is called once a millisecond, looks for any pulses from the sensor!
SIGNAL(TIMER0_COMPA_vect) {
uint8_t x = digitalRead(FLOWSENSORPIN);
if (x == lastflowpinstate) {
lastflowratetimer++;
return; // nothing changed!
}
if (x == HIGH) {
//low to high transition!
pulses++;
}
lastflowpinstate = x;
flowrate = 1000.0;
flowrate /= lastflowratetimer; // in hertz
lastflowratetimer = 0;
}
void useInterrupt(boolean v) {
if (v) {
// Timer0 is already used for millis() - we'll just interrupt somewhere
// in the middle and call the "Compare A" function above
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);
} else {
// do not call the interrupt function COMPA anymore
TIMSK0 &= ~_BV(OCIE0A);
}
}
// Конец блока расходомера
const int moneyPin2=2; // купюроприемник
int pulse2=0;
unsigned long timeAllPulse2=2000; // макс. время приема купюры
unsigned long timeCount2=0;
float sum=0.0;
float liters=0.0;
float litr=0.0;
int kol_im=0;
// дисплей Goodview LCD JXD0802A YG
// Библиотеки для русского языка
#include <LiquidCrystalRus.h>
#include <LiquidCrystalExt.h>
#include <LineDriver.h>
// Данные с пинов дисплея на ардуино
LiquidCrystalRus lcd(32,30,28,26,24,22);
void setup()
{
lcd.begin(16,2);
pinMode(switchPin, INPUT); // кнопка
// Расходомер
pinMode(FLOWSENSORPIN, INPUT);
digitalWrite(FLOWSENSORPIN, HIGH);
lastflowpinstate = digitalRead(FLOWSENSORPIN);
useInterrupt(true);
//
pinMode(nasosPin, OUTPUT); //насос
pinMode(klapanPin, OUTPUT); //клапан
Serial.begin(9600);
pinMode(moneyPin2,INPUT);
// включение диспечера прерываний
attachInterrupt(0,count_pulse2,FALLING);
lcd.clear(); // очистка
lcd.setCursor(6,0); lcd.print("Добро");
lcd.setCursor(4,1); lcd.print("пожаловать!");
delay(2000);
lcd.clear(); // очистка
lcd.setCursor(6,0); lcd.print("Введите");
lcd.setCursor(4,1); lcd.print("средства!");
delay(1000);
}
void loop()
{
// прошло максимальное время приема купюры?
if(pulse2>0 && (millis()-timeCount2)>timeAllPulse2)
{
litr=money(pulse2);
}
// Начало работы програмы после подтверждения кнопкой о залитии
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH && sum>0)
{
liters=0;
Serial.print(litr);
while (liters > litr)
{
// расходомер
//подсчет количества литров
liters = pulses;
liters /= 7.5;
liters /= 60.0;
lcd.clear();
lcd.setCursor(0,0);lcd.print("Введено = ");
lcd.setCursor(10,0);lcd.print(sum);
lcd.setCursor(0,1);lcd.print("Залито = ");
lcd.setCursor(8,1);lcd.print(liters);
digitalWrite(nasosPin,HIGH); //насос вкл
delay(500);
digitalWrite(klapanPin, HIGH);// клапан откр
Serial.print(liters); Serial.println(" Liters");
delay(100);
}
digitalWrite(nasosPin,LOW); //насос выкл
digitalWrite(klapanPin, LOW);// клапан закр
lcd.clear(); // очистка
lcd.setCursor(6,0); lcd.print("Спасибо");
lcd.setCursor(3,1); lcd.print("за покупку!");
delay(3000);
sum = 0.0;
}
}
float money(int pulse)
{
kol_im=pulse*5; // определение купюры
sum+=kol_im; // суммирование
float lt = sum/20; //
lcd.clear();
lcd.setCursor(0,0);lcd.print("Введено = ");
lcd.setCursor(10,0);lcd.print(sum);
lcd.setCursor(0,1);lcd.print("Литров = ");
lcd.setCursor(8,1);lcd.print(lt);
pulse2=0;
return lt;
}
// обработка прерывания купюроприемника - получить кол-во импульсов
void count_pulse2()
{
detachInterrupt(0);
pulse2++;
if(pulse2==1)
{
timeCount2=millis();
timeCount2=timeCount2-timeAllPulse2;
if (50>timeCount2>99) pulse2=1;
}
attachInterrupt(0,count_pulse2,FALLING);
}
//Калибровка кнопки
boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if (last != current)
{
delay(5);
current = digitalRead(switchPin);
}
return current;
}
Первую проблему решил, как сразу не дошел.
Теперь нужно что-то придумать с обнулением..