Виндинговый автомат
- Войдите на сайт для отправки комментариев
Вс, 12/11/2017 - 14:53
добрый день.в прогроммирование не очень понимаю, есть скетч не доработаный ещё но в полне рабочий на железе проверял, делал его не я .суть такая что хочу реализовать чтоб после кинутых денег в монетник и нажатия кнопки шол отсчёт денег и литров обратно в ноль
[code] #include <TimerOne.h> #include <LiquidCrystal.h> // Наливает правильно кнопка стоп работает // задействованы аналоговые входы /* pin 0 на ардуино (16)на дисплей контакт 6 (E) – соответствует линии SCK (15) pin 2 на ардуино на дисплее контакт 5 (RW) – соответствует линии MOSI (14) pin 1 на ардуино на дисплее контакт 4 (RS) – соответствует линии CS на дисплее контакт 15,1,20 GND на дисплее контакт 2,19 +5V контакт 4 – (RS) – соответствует линии CS (например 7) контакт 5 – (RW) – соответствует линии MOSI (например 8) контакт 6 – (E) – соответствует линии SCK (например 3) */ #include <LiquidCrystal.h>//библиотека для работы с LCD LiquidCrystal lcd(14, 15, 16, 17, 18, 19);//инициализация портов //Задаем битовую маску для вывода У byte f2[8] = { 0b10001, 0b10001, 0b01001, 0b00111, 0b00001, 0b00001, 0b11110, 0b00000, } ; byte f7[8] = { //Задаем битовую маску для вывода П 0b11111, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b00000, } ; byte f8[8] = { //Задаем битовую маску для вывода Л 0b00111, 0b01001, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b00000, } ; byte f9[8] = { //Задаем битовую маску для вывода Н 0b10001, 0b10001, 0b10001, 0b11111, 0b10001, 0b10001, 0b10001, 0b00000, } ; byte f12[8] = {//Задаем битовую маску для вывода И 0b10001, 0b10001, 0b10011, 0b10101, 0b11001, 0b10001, 0b10001, 0b00000, } ; byte f13[8] = {//Задаем битовую маску для вывода Ц 0b10010, 0b10010, 0b10010, 0b10010, 0b10010, 0b11110, 0b00011, 0b00000, }; byte f14[8]= { //задаем битовую маску для буквы Б 0b11111, 0b10000, 0b10000, 0b11110, 0b10001, 0b10001, 0b11110, 0b00000, }; //..........Запуск раз в 600 секунд ......... int timer = LOW; // этой переменной устанавливаем состояние таймера интервал таймера = низкий long timerMillis = 0; // храним время последнего таймера long timerinterval = 600000; // интервал между включение/выключением таймера unsigned long timercurrentMillis = 0;//беззнаковый длиный Таймер текущего мс = 0 #include <TimerOne.h> long previousMillis1 = 1000; //длинная предыдущая Миллис 1 = 1000; long previousMillis = 0; // длинные предыдущие Миллис = 0; const int buttonwater = 3; // Кнопка налива воды const int Pinwater = 5; // Номер пина к которому подключён счетчик воды const int valveissue = 6; // Клапан выдачи воды int counterwater = 0; // Счетчи импульсов воды int dialHasFinishedRotatingAfterMsWater = 2; // Счетчи импульсов воды по истечению 10 Ms прекращаеться прием импульсов int debounceDelayWater = 1; // Счетчи импульсов воды импульсы менее 15 Ms не считаються long lastStateChangeTimeWater = 0; // измеряем время int needToPrintWater = 0; // нужнен для напечатать воды = 0; int lastStateWater = LOW; //Счетчи импульсов воды Состояние в прошлом int trueStateWater = LOW; //Счетчи импульсов воды Состояние в теперь int buttonwaterState= LOW; //Состояние кнопки налива воды если HIGH вода наливаеться если LOW счетчик импульсов воды меньше или равно нулю вода остоновлена. float countmoney=0; // Счетчик денег количество поплавков = 0; int Litrmoney=100; //Литр денег=100; Деньги умноженные на 351 // СЧЁТЧИК ДЕНЕГ long lastStateChangeTime = 0; //длиное время последнего изменения состояния = 0; измеряем время int needToPrint = 0; //нужно напечатать =0 int buttonClearD; //кнопка очистить D int dialHasFinishedRotatingAfterMs = 100; //int циферблат закончил вращение после Ms = 100; int debounceDelay = 10; // импульсы менее 10 Ms не считаються int lastState = LOW; //Состояние в прошлом int trueState = HIGH; //Состояние в теперь int buttonwaterD; //кнопка воды //добавляем переменные для новой кнопки int flag=0; // СЧЁТЧИК КОПЕЕК int needToPrint1 = 0; // Счетчик (для подсчета импульсов) int count1; // Номер пина к которому подключён номеронабиратель int in1 = 2; int reading1; int lastState1 = LOW; //последние состояние 1= низкое int trueState1 = LOW; //истиный состояние 1= низкое long lastStateChangeTime1 = 0; //длиные время последнего изменения состояния 1 = 0; int cleared1 = 0; //очищен 1 = 0 int dialHasFinishedRotatingAfterMs1 = 500; //цеферблат закончил вращение int debounceDelay1 = 20; //задержка между моментом float moneysum=0.00; //денежную сумму void setup() { Serial.begin(9600); lcd.begin(16, 2);//инициализация дисплея lcd.createChar(2, f2); //Создаем букву У lcd.createChar(7, f7); //Создаем букву П lcd.createChar(8, f8); //Создаем букву Л lcd.createChar(12, f12); //Создаем букву И lcd.createChar(9, f9); //Создаем букву Н lcd.createChar(13,f13);//создаем букву Ц lcd.createChar(14,f14);//создаем букву Б pinMode(2, INPUT_PULLUP); //монетоприемник китай pinMode(buttonwater, INPUT_PULLUP); //ПИН 3 КНОПКА НАЛИВА ВОДЫ запрограмированная на ввод с подключением к ножке резистора к + 5v pinMode(5, INPUT_PULLUP); //запрограмированная на ввод с подключением к ножке резистора к + 5v Номер пина к которому подключён счетчик вод pinMode(6, OUTPUT ); //запрограмированная на вывод Клапан выдачи воды digitalWrite(valveissue, LOW); //цифровая запись выпуск калапана низкий уровень lcd.setCursor(0, 0); lcd.print(" BHEC"); lcd.write(12); lcd.print("TE ABAHC "); lcd.setCursor(0, 1); lcd.write(13); lcd.print("EHA 1 "); lcd.write(8); lcd.write(12); lcd.print("TP 3 p."); } void loop() { //..................кнопка новая if(digitalRead(3)== LOW && flag==0 && countmoney != 0 && Litrmoney-counterwater >= 0)//если кнопка нажата //если(цифровой чтение(3)== низкий && флаг==0 &&считать деньги != 0&& Litr деньги счетчик воды >= 0)//если кнопка нажата { digitalWrite(6,!digitalRead(6)); //цифровой запись цифровой чтение flag=1; //флаг=1 } { if (digitalRead(3) == HIGH ) //если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... flag=0;//обнуляем переменную flag } // РАБОТАЕМ С СЧЁТЧИКОМ ВОДЫ int readingwater = digitalRead(Pinwater); //значение воды = цифровое считывание(вывод воды); if ((millis() - lastStateChangeTimeWater) > dialHasFinishedRotatingAfterMsWater) { //если ((миллисе() - последнее время изменения воды) > циферблат закончит вращаться после мс воды) if (needToPrintWater) {//потребность напечатать воду needToPrintWater = 0; //нужно распечатать воду } } if (readingwater != lastStateWater) { //если (читая вода != последнее заявление воды Логическое отрицание НЕТ прошлое состояние не соответствует теперешнему lastStateChangeTimeWater = millis(); //время последнего изменения состояния Вода Присваивание переменной lastStateChangeTime теперешненеее значение millis } if ((millis() - lastStateChangeTimeWater) > debounceDelayWater) {//если ((миллисе() - последнее время изменения воды) > де отказов задержка воды if (readingwater != trueStateWater) { trueStateWater = readingwater; if (trueStateWater == HIGH) { // увеличиваем счетчик на 1, если состояние пина HIGH counterwater++; needToPrintWater = 1; // необходимо вывести итоговую цифру по окончанию вращения диска номеронабирателя } } } lastStateWater = readingwater;//последние состояние воды=значение воды if ( (Litrmoney-counterwater) <= 0 ) //литр деньги -счотчик воды { digitalWrite(valveissue, LOW); // Отключает Клапан выдачи воды Litrmoney=1; //литр деньги counterwater =0;//счотчик воды countmoney=0; //считать деньги moneysum=0; //денежная сумма if (counterwater == 1) { //счотчик воды } lcd.setCursor(0, 0); lcd.print(" BHEC"); lcd.write(12); lcd.print("TE ABAHC "); lcd.setCursor(0, 1); lcd.write(13); lcd.print("EHA 1 "); lcd.write(8); lcd.write(12); lcd.print("TP 3 p."); } // считаем копейки reading1 = digitalRead(2);//чтение1=цифровое чтение 2 монетник китай if ((millis() - lastStateChangeTime1) > dialHasFinishedRotatingAfterMs1) { //Последнее изменение времени 1 > циферблат закончил поворот после мс 1 // Цифра не набирается, или считывается последний импульс if (needToPrint1) {//нужно распечатать 1 needToPrint1 = 0; //нужно распечатать 1=0 if (count1 == 1) //количество 1==1 { moneysum=0.00; //денежная сумма=0,00 } if (count1 == 2)//имп { moneysum=1; //руб } if (count1 == 3)//имп { moneysum=2; //руб } if (count1 == 4)//имп { moneysum=5; //руб } if (count1 == 5)//имп { moneysum=10; //руб } moneysum=moneysum*1;// умножает на lcd деньги countmoney=moneysum+countmoney;//считать деньги=деньги+деньги считать ПЛЮСУЕТ ДЕНЬГИ НА LCD //Litrmoney=(countmoney*10); //литр деньги=деньги считать*10 Litrmoney=(countmoney*200);//литр деньги=деньги считать*200 ПЛЮСУЕТ ЛИТРЫ НА LCD lcd.clear(); lcd.setCursor(0, 0); lcd.print("ABAHC "); //сумма денег lcd.print(countmoney); //сумма денег lcd.print(" P"); lcd.write(2); lcd.write(14); lcd.setCursor(0, 1); lcd.write(8); lcd.write(12); lcd.print("TPbI "); lcd.print(Litrmoney); //литр деньги count1 = 0; //графа cleared1 = 0;//снят очищеный } } if (reading1 != lastState1) {//чтение 1 != последнее состояние 1 lastStateChangeTime1 = millis();//время последнего изменения состояния 1 = миллис } if ((millis() - lastStateChangeTime1) > debounceDelay1) {//последние состояние изменен,времени задержка if (reading1 != trueState1) {//чтение 1 истиное положение trueState1 = reading1; if (trueState1 == HIGH) { // увеличиваем счетчик на 1, если состояние пина HIGH высокое count1++;//графа 1++ needToPrint1 = 1; // необходимо вывести итоговую цифру по окончанию вращения диска номеронабирателя } } } lastState1 = reading1;//последнее состояние 1 = чтение 1 } [/code]
кидайте деньги - посмотрим :)
в смысле ? (кидайте деньги - посмотрим :) )
вы хотите что-то реализовать, но сами не разбираетесь - верно я понимаю?
Значит вам нужен исполнитель, который вряд ли станет работать бесплатно, тем более что проект коммерческий.
У нас на форуме есть отдельный раздел, где делают проекты за деньги - называется "Ищу исполнителя"
СПАСИБО Я ПОНЕЛ,ПРОСТО ХОТЕЛ СПРОСИТЬ КАК СДЕЛАТЬ ЧТОБ В ОБРАТНОМ ПОРЯДКЕ СЧИТАЛ ПОСЛЕ НАЖАТИЯ КНОПКИ.
Вычитать из суммы стоимость литра, как он только "прошел" через функцию учета в вашем скетче.
А какие еще есть варианты?