Виндинговый автомат

zver1985
Offline
Зарегистрирован: 31.10.2017

добрый день.в прогроммирование не очень понимаю, есть скетч не доработаный ещё но в полне рабочий на железе проверял, делал его не я .суть такая что хочу реализовать чтоб после кинутых денег в монетник и нажатия кнопки  шол отсчёт денег и литров обратно в ноль



[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]


 

b707
Offline
Зарегистрирован: 26.05.2017

кидайте деньги - посмотрим :)

zver1985
Offline
Зарегистрирован: 31.10.2017

в смысле ?  (кидайте деньги - посмотрим :) )

b707
Offline
Зарегистрирован: 26.05.2017

вы хотите что-то реализовать, но сами не разбираетесь - верно я понимаю?

Значит вам нужен исполнитель, который вряд ли станет работать бесплатно, тем более что проект коммерческий.

У нас на форуме есть отдельный раздел, где делают проекты за деньги - называется "Ищу исполнителя"

zver1985
Offline
Зарегистрирован: 31.10.2017

СПАСИБО Я ПОНЕЛ,ПРОСТО ХОТЕЛ СПРОСИТЬ КАК СДЕЛАТЬ ЧТОБ В ОБРАТНОМ ПОРЯДКЕ СЧИТАЛ ПОСЛЕ НАЖАТИЯ КНОПКИ.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вычитать из суммы стоимость литра, как он только "прошел" через функцию учета в вашем скетче.

А какие еще есть варианты?