Автомат для заправки

nickell2008
Offline
Зарегистрирован: 03.10.2014

Создаю автомат для заправки на основе ардуино. Смысл такой:

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;
  }

 

nickell2008
Offline
Зарегистрирован: 03.10.2014

Первую проблему решил, как сразу не дошел.

Теперь нужно что-то придумать с обнулением..