Автомат для заправки
- Войдите на сайт для отправки комментариев
Втр, 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; }
Первую проблему решил, как сразу не дошел.
Теперь нужно что-то придумать с обнулением..