100 рублей на телефон тому кто подскажет

mimoxodom
Offline
Зарегистрирован: 24.05.2017

Есть скетч, считает не все  импульсы с счетчика. Стоит датчик скорости вращения двигателя. (светодиод-оптопара). Если что-то не понятно спрашивайте.

// купюроприемник IC A7 V7
const int moneyPin1 = 2;
// монетоприемник CH-926
const int moneyPin2 = 3;

int pulse1 = 0;
int pulse2 = 0;
unsigned long timeAllPulse1 = 2000; // макс. время приема купюры
unsigned long timeAllPulse2 = 1800; // макс. время приема монеты
unsigned long timeCount1 = 0;
unsigned long timeCount2 = 0;
unsigned long duration;
float ostatok = 0.0;
int klapan = 13; //клапан
int shetchik = 14; // счетчик воды
int val = 0;// переменная импульсов от счетчика
int ostval = 0;
int var = 0;
float litr = 0.0;
int rbut = 10; //кнопка ручного управления

float nominals2[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
float sum = 0.0;
// дисплей WH1602
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

void setup()
{
  Serial.begin(9600);
  pinMode(rbut, INPUT);
  pinMode(shetchik, INPUT);
  pinMode(klapan, OUTPUT);
  digitalWrite(klapan, LOW);
  pinMode(moneyPin1, INPUT);
  pinMode(moneyPin2, INPUT);
  //attachInterrupt(0,count_pulse,FALLING);
  attachInterrupt(1, count_pulse2, FALLING);
  //Serial.println("coin ready");
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("coin ok!");
}

void loop()
{
  duration = pulseIn(shetchik, HIGH);
  if (duration > 0) {                // если переменная дуратион больше нуля, а по сути количество импульсов больше 0
    val++;                            // то импулься плюсуются
    Serial.println(val);
  }
  // прошло максимальное время приема монеты?
  if (pulse2 > 0 && (millis() - timeCount2) > timeAllPulse2)
  {
    sum += nominals2[pulse2];
    //Serial.print("pulse2=");
    //Serial.println(pulse2);
    //Serial.print("money2=");
    Serial.println(nominals2[pulse2]);

    lcd.clear();
    lcd.setCursor(0, 0); lcd.print("1=");
    lcd.setCursor(2, 0); lcd.print(nominals2[pulse2]);
    lcd.setCursor(0, 1); lcd.print("*=");
    lcd.setCursor(2, 1); lcd.print(sum);
    pulse2 = 0;
  }
  if (digitalRead(rbut) == HIGH) {   // если кнопка ручного разлива нажата
    if (sum >= 1.40) {             // если сумма больше либо равно 1,40
      litr = sum / 1.40;             //переменная литр равна сумма деленое на 1.40 (при сумме 2 рабля = 1,43)
      //Serial.println(litr);           // выводим в монитор количество литров
      var = litr * 5;                 // переменная ВАР равна литр множенное на 5 (от балды взято) импульсов (ВАР = 1,43*5=7,15)
      ostatok = sum - (litr * 1.40);    // остаток равен сумма - (литр * 1,40) (остаток = 2-(1,43*1,40)=0)
      //Serial.println(var);
      //Serial.println(ostatok);
      digitalWrite(klapan, HIGH);      // включаем клапан если соблюдено условие нажатой кнопки и сумме более 1,4
      //Serial.println("start001");
      if (var == val) {                 //если количество поступивших импульсов равно ВАР
        digitalWrite(klapan, LOW);       // выключаем клапан
        Serial.println("stop001");      //пишем в монитор СТОП 001
        if (ostatok != 1) {             // если остаток не равен 1
          var = 0;                     // то устанавливаем ВАР в ноль   (это количество импульсов равное внесенной сумме)
          val = 0;                    // и устанавливаем ВАЛ в ноль  (ВАЛ это бегущие импульсы от счетчика )
          sum = ostatok;
        }
      }
      //Serial.println(var);
    }
  }

  else {
    digitalWrite(klapan, LOW);
    val = var - val;
  }
}

/* else if (val == var) {
   digitalWrite(klapan, LOW);
   Serial.println("stop001");
 }*/
//else digitalWrite(klapan, LOW);
//Serial.println("stop002");

// обработка прерывания монетоприемника - получить кол-во импульсов
//
void count_pulse2()
{
  //detachInterrupt(0);
  detachInterrupt(1);
  pulse2++;
  if (pulse2 == 1)
    timeCount2 = millis();
  //attachInterrupt(0,count_pulse,FALLING);
  attachInterrupt(1, count_pulse2, FALLING);
}

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

... там королевич mimoxodom пленяет грозного царя...

Непонятно чего барину непонятно

зачем в обработчике детач и аттач? Поставьте cli и sei

Или noInterrupts и Interrupts

И ишшо вдогоночку

Внутри функции обработки прерывания не работает delay(), значения возвращаемые millis() не изменяются. Возможна потеря данный передаваемых по последовательному соединению (Serial data) в момент выполнения функциии обработки прерывания. Переменные, изменяемые в функции, должным быть объявлены как volatile.

SQwix
Offline
Зарегистрирован: 12.05.2017

mimoxodom пишет:
100 рублей на телефон тому кто подскажет

Есть скетч, считает не все  импульсы с счетчика. Стоит датчик скорости вращения двигателя. (светодиод-оптопара). Если что-то не понятно спрашивайте.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SQwix пишет:

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

И я присоединюсь.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Тоже рупь закину! ТС пиши номер!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вона оно как!

Ужо выходит прибыльное дело.

 

PS. Интересно, что надо написать, чтобы народ скинулся минимум рублей по 10?

lean_74
Offline
Зарегистрирован: 22.12.2015

andriano пишет:

Вона оно как!

Ужо выходит прибыльное дело.

 

PS. Интересно, что надо написать, чтобы народ скинулся минимум рублей по 10?

Ник на Клапауций поменяй :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lean_74 пишет:

Ник на Клапауций поменяй :)

А если я поменяю на sss - мне чёнить перепадёт?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

lean_74 пишет:

Ник на Клапауций поменяй :)

А если я поменяю на sss - мне чёнить перепадёт?

Только если на SS то точно перепадёт )))