Помогите с переменной

Alex88
Offline
Зарегистрирован: 07.03.2020

Привет, я новичёк строго не судите ))) 

Не могу написать код , необходимо чтобы прибавлялясь еденица в переменую "Menge" при условии смены 0 на 1 и снова на 0 на сенсоре и не важно какое время было значение 0 или 1. У меня же получаеться так что если на датчике 1 то в переменную Menge еденица добовляеться множество раз безпрерывно.  

вот код,


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

byte  N;
char  b0;
char  b1;
char  b2;
char  sensor;
long  Menge;

void setup()
{
  lcd.init();

   N = 1;

   b0 = 0;

   b1 = 0;

   b2 = 0;

   sensor = 0;

   Menge = 0;

  pinMode(10,INPUT);
  pinMode(9,INPUT);
  pinMode(8,INPUT);
  pinMode(2,INPUT);
    lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Menge");
  lcd.setCursor(7, 0);
  lcd.print("St");

}


void loop()
{
    lcd.setCursor(0, 1);
    lcd.print(Menge);
     b0 = digitalRead(10);
     b1 = digitalRead(9);
     b2 = digitalRead(8);
     sensor = digitalRead(2);
    if (sensor == 1) {
       Menge = Menge + 1;

    }

}

Помогите пожалуйста как мне организовать такую функцию.

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

А как бы Вы это делали сами - без компьютера. Вот смотрите на экран телека и если экран был чёрным, потом стал белым, а потом снова стал чёрным, то надо выпить пива. Попробуйте по шагам (по пунктам) расписать что бы Вы в этой ситуации делали?

negavoid
Offline
Зарегистрирован: 09.07.2016
void loop()
{
     static volatile int oldMenge = 0;

     lcd.setCursor(0, 1);
     lcd.print(Menge);
     b0 = digitalRead(10);
     b1 = digitalRead(9);
     b2 = digitalRead(8);

     sensor = digitalRead(2);
     if ( sensor != oldMenge )
     {
        Menge++;
        oldMenge = sensor;
     }
}

 

negavoid
Offline
Зарегистрирован: 09.07.2016

От, Евгений Петрович, постоянно по-доброму завидую вашему терпению при работе с учениками, но я противник этого вот такого подхода. Да, возможно, реалист и станет умнее, сам догадамшись, но мне кажется, лучше по проклятой капиталистической системе, когда препод даёт ответ с примером, пусть даже он будет и не по канонам, но одновременно ведь даётся и толчок, человек попетрит-попетрит и в конце концов допетрит. А по отечественной системе ему сразу кажется, что его чморанули, и энергию свою пускает не на поиск ответа и понимание, а на бессмысленную и бесполезную злобу вместо просвещения. А потом и получаем то, что имеется, так и живём.

Alex88
Offline
Зарегистрирован: 07.03.2020

У меня знаний языка просто практически нет. Программа была составленна в графической оболочке Ardublock.Я наверное не четко выразил то что мне нужно сделать. Теперь с вашими поправками происходит следуюшее при каждой смене состояния на сенсоре прибавляеться 1 в переменную. Тоесть 0 на сенсоре то +1 в переменную далее 1 на сенсоре снова +1 к переменной. Нужно чтобы происходило по следующему на сенсоре 01 тогда в переменную +1. Чтото типа цикла Сенсор "0,1" + в переменную Сенсор "0,1" +1 в переменную и тд.

 

negavoid
Offline
Зарегистрирован: 09.07.2016

А, я по вечерней сини вас неправильно понял.

Alex88
Offline
Зарегистрирован: 07.03.2020

Буду очень признателен вашей помоши. Ну подскажите чайникам.... 

negavoid
Offline
Зарегистрирован: 09.07.2016
void loop()
{
     static volatile int state = 0;

     lcd.setCursor(0, 1);
     lcd.print(Menge);
     b0 = digitalRead(10);
     b1 = digitalRead(9);
     b2 = digitalRead(8);

     sensor = digitalRead(2);

     if ( ( sensor == 0 ) && ( state == 0 ) ) { state = 1; }
     if ( ( sensor == 1 ) && ( state == 1 ) ) { state = 2; }
     if ( state == 2 )
     {
        Menge++;
        state = 0;
     }
}

 

Alex88
Offline
Зарегистрирован: 07.03.2020

Огромное человеческое СПАСИБО!!! теперь все ништяк )))

negavoid
Offline
Зарегистрирован: 09.07.2016

Конец истории. Никакого срача (с утра будет, вангую). Никому никакого чморения. Всё без негатива. Спасибо в конце. И не нужны топики на 5 страниц с обсуждением необходимости унижений и страданий неофитов. Так может, из консерватории, просто надо повыкидывать совковский грёбаный подход, а, деды?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

negavoid пишет:

Так может, из консерватории, просто надо повыкидывать совковский грёбаный подход, а, деды?

Нет.

negavoid
Offline
Зарегистрирован: 09.07.2016

Диду, ну я ж не про тебя :) А почему нет-то? Лучше с болью, страданиями, и унижениями, как завещал дедушка Ленин?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

потомуш, нынешний подход учит действовать по шаблону, а совецкий - включать мозги. 

negavoid
Offline
Зарегистрирован: 09.07.2016

Нет, не согласен. Я имел удовольствие учиться и у нас и там, по обоим. По советскому включай-не включай, а всё равно получишь х#й, откуда ж взяться пониманию (знанию), коль ментор только пи#дит на тебя. Единственное, что получишь - умение мастерски изворачиваться. Что и наблюдаем по жизни.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

очень зависит от ментора.  Таких, кто только звиздит нада гнать ссаными тряпками.

negavoid
Offline
Зарегистрирован: 09.07.2016

Надо, да :)

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Раз отслеживаем изменения состояния входа - без прерывания это моветон !

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

Komandir пишет:

Раз отслеживаем изменения состояния входа - без прерывания это моветон !

особенно на 2 пине, хотя, вспоминая анекдот, что существует 99 способов и, первый о котором студент не знал - лёжа, может и нет???

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

void loop()
{
     static bool lastvalue = false;

     lcd.setCursor(0, 1);
     lcd.print(Menge);
     b0 = digitalRead(10);
     b1 = digitalRead(9);
     b2 = digitalRead(8);

     if (digitalRead(2) != lastvalue) {

        Menge++;
        lastvalue = !lastvalue;

     }
}

 

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

negavoid пишет:

Конец истории. Никакого срача (с утра будет ....

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

Сказать сразу с готовым примером - по мне признак неуважения - это показать, что ты не веришь в способность человека решить задачу самостоятельно и даёшь решение, лишь бы он отвязался и самому поменьше работать.

Alex88
Offline
Зарегистрирован: 07.03.2020

Negavoid абсолютно прав! Судите сами получил ответ с примером узнал о Функции state из ответа, загуглил узнал что то новое, проэкт начал дальнейшее продвижение, если снова возникнет подобная задача ответ уже имею и некое понимание. За что ещё раз благодарю за быструю помощь. А из ответа ЕвгенияП я не получил ничего, не помощи и у меня не возникла какая-то мотивация. Скорее всего пошол бы просто на другой форум за помощью. Темболие я объяснил что я чайник в этом деле, мне даже сложно было в поисковик правильно задать вопрос, о том чего я хочу найти =)) без обид пишу как оно есть. Но из ответа можно сделать выводы. Да возможно будут возникать и в дальнейшем на ваш взгляд нелепые вопросы но получая ответ с объяснением и с примером человек понимает и узнает что-то новое и так шаг за шагом набераеться опыта и возможно что потом наканецто не будет мучить вас новыми вопросами.,

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

Что за функция state? Просветите и меня...

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

Alex88 пишет:
А из ответа ЕвгенияП я не получил ничего, не помощи

Вы имеете в виду мой пост #1? Так я там и не пытался ничего объяснить. Я Вас попросил простыми русскими словами сформулировать что именно и как Вы собираетесь делать. И не надо говорить, что "знаний языка просто практически нет". Какого языка? Я просил Вас сформулировать простыми русскими словами. Без этого (чёткого понимания что делаешь) никакое программирование невозможно в принципе, от слова "совсем".

Вы сделали это? Нет! Вместо этого Вы дождались готового решения и "узнали о Функции state", т.е. не поняли Вы ровным счётом ничего. Даже не поняли какой бред говорите про эту "функцию".

Так что, дорогой, Вам не помогли, а сделали за Вас. Помочь Вам пытался я, и если бы Вы делали то, что сказано, то действительно что-то поняли бы. Но для этого нужно было поработать, а не "хавать готовое". Понимание всегда приходит через усилия и работу. Без усилий приходят только заблуждения про "функцию state".

Alex88
Offline
Зарегистрирован: 07.03.2020

state это отслеживание изменения состояния с кнопки датчита и тд.

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Alex88 пишет:
state это отслеживание изменения состояния с кнопки датчита и тд.

Ну завели вы переменную state, а где геттер и сеттер для нее. Вот и получилось у вас "Купыла мамо коныка/слоныка. А конык/слонык без ногы.Яка цыкава играшка. О Гы Гы Гы"

int state;
void setState(int s) {
  state = s;
  /*еще немного кода*/
}
int getState() {
  return state;
}

void setup() {


}

void loop() {

}

 

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

геттер и сеттер без класса? Квона кто-то подменил.

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

Alex88 пишет:

возможно по правильному state это именуетьс не  функцией как я ее назвал но принцип я понял. 


забавно вышло, хотели поддержать negavoid, а получилось наоборот, своими рассуждениями про "функцию state" вы показали, что не стоило вам подачку давать, не поняли вы ровно ничего...

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

DetSimen пишет:

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

void loop()
{
     static bool lastvalue = false;

     lcd.setCursor(0, 1);
     lcd.print(Menge);
     b0 = digitalRead(10);
     b1 = digitalRead(9);
     b2 = digitalRead(8);

     if (digitalRead(2) != lastvalue) {

        Menge++;
        lastvalue = !lastvalue;

     }
}

 

со второго прохода тока понял, что её сбросит в ноль ...(как компилятор стал, двухпроходный ))) )