Виндинговый автомат
- Войдите на сайт для отправки комментариев
Вс, 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]
кидайте деньги - посмотрим :)
в смысле ? (кидайте деньги - посмотрим :) )
вы хотите что-то реализовать, но сами не разбираетесь - верно я понимаю?
Значит вам нужен исполнитель, который вряд ли станет работать бесплатно, тем более что проект коммерческий.
У нас на форуме есть отдельный раздел, где делают проекты за деньги - называется "Ищу исполнителя"
СПАСИБО Я ПОНЕЛ,ПРОСТО ХОТЕЛ СПРОСИТЬ КАК СДЕЛАТЬ ЧТОБ В ОБРАТНОМ ПОРЯДКЕ СЧИТАЛ ПОСЛЕ НАЖАТИЯ КНОПКИ.
Вычитать из суммы стоимость литра, как он только "прошел" через функцию учета в вашем скетче.
А какие еще есть варианты?