Возобновление цикла loop

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Добрый день!

С моей точки зрения - нерешаемая задача, но не мне судить:

1. идет выполнение цикла loop (паровоз едет по рельсам, на пути два геркона - кнопки - реализовано челночнье движение, старт, разгон, проехали над герконом - выход на крейсерскую скорость, проехали над другим геркном - торможение, смена полярности ( l293d), пауза (millis), разгон....)

2. выключили макет

3. включили питание макета, питание пришло на ардуино и ....

Как в этот момент продолжить выполнять действие выполняемое в момент 2.???

 

Заранее спасибо! 

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

Т.е. выключение макета?

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Выключение ардуино, как и включение происходит при выключении всего макета (железнодорожный макет в масштабе 1-87), от которого в свою очередь запитана ардуино

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

Перечитайте  свой вопрос и пункт N 2. Потом попробуйте еще раз ответить на заданный вопрос.

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Видимо из-за скудности ума ваш вопрос я не понял, додумал его и ответил на то что надумал) задайте более конструктивный вопрос пожалуйста)

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

Medvedev81 пишет:

2. выключили макет

...

Как в этот момент продолжить выполнять действие выполняемое в момент 2.???

...

Какое действие ваша ардуина должна выполнять? Я не вижу в пункте 2 ничего, кроме выключения.

Coolerr
Offline
Зарегистрирован: 30.06.2014

Ну из того что понял, как минимум сохранять значения переменных в память, а в момент включения считывать из памяти и прога типа "продолжится", но значения миллис если их все время сохранять ушатают память очень быстро, как я понял пункт2 штука внезапная? Автор я правильно понял? Автор, косноязычие плохая штука, учитесь выражаться яснее.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Либо тупо насиловать EEPROM (прикинуть, на сколько хватит). Либо делать контроль внешнего питания и при отключении переходить на резервное, чтобы "сохраниться".

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Вы поняли абсолютно верно. Внезапное выключение питания.

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Coolerr пишет:

Ну из того что понял, как минимум сохранять значения переменных в память, а в момент включения считывать из памяти и прога типа "продолжится"

Это можно реализовать ? 

Если не миллис а например чтение serial print перед каждым действием?

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Предложение следующее:

1. Организовать отдельное питание ардуины на 5сек (можно конденсаторами).

2. При пропадании питания на основном макете писать в ЕЕПРОМ и останавливать программу.

3. Убрать паузы (на вклейках в форуме есть варианты).

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

Мне более интересно, что будет, если после включения сразу дать крейсерскую скорость (допустим, что лепестричество пропало на этом этапе). Или, допустим, модель по инерции проехала геркон, но не зафиксировала данный факт, так как контроля уже не было. ...газануть прямо в отбойник что ли?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

sadman41 пишет:

Мне более интересно, что будет, если после включения сразу дать крейсерскую скорость (допустим, что лепестричество пропало на этом этапе). Или, допустим, модель по инерции проехала геркон, но не зафиксировала данный факт, так как контроля уже не было. ...газануть прямо в отбойник что ли?

Это еще хорошо, что модель паровоза, а не самолета

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

ИМХО. надо на трассе расставить больше герконов. После пропадпния питания запускаем "аварийный режим" и тихим шагом движемся до ближайшего контрольного пункта, где определяем свое местонахождение и запускаем программу с этого места.

При таком раскладе ЕЕПРОМ вообще не нужен.

kalapanga
Offline
Зарегистрирован: 23.10.2016

b707 пишет:

ИМХО. надо на трассе расставить больше герконов. После пропадпния питания запускаем "аварийный режим" и тихим шагом движемся до ближайшего контрольного пункта, где определяем свое местонахождение и запускаем программу с этого места.

При таком раскладе ЕЕПРОМ вообще не нужен.

Еще надо знать в какую сторону ехать. Боюсь, что без запоминания таки не обойтись.

Medvedev81
Offline
Зарегистрирован: 20.12.2017

kalapanga] </p> <p>[quote=b707 пишет:

Еще надо знать в какую сторону ехать. Боюсь, что без запоминания таки не обойтись.

Да.. очень важно в какую сторону и как...
Как же реализовать запоминание?

Medvedev81
Offline
Зарегистрирован: 20.12.2017

mykaida пишет:

Предложение следующее:

1. Организовать отдельное питание ардуины на 5сек (можно конденсаторами).

2. При пропадании питания на основном макете писать в ЕЕПРОМ и останавливать программу.

3. Убрать паузы (на вклейках в форуме есть варианты).

3. Паузы это delay? Если да, то не использую

2. Еепром это как и что такое?

1. Я думал над отдельном питании .. допетрил только до батарейки, как в Биос. А кондером это как?

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

Можно еще ионистором, думаю.

Medvedev81
Offline
Зарегистрирован: 20.12.2017

2. Еепром это как и что такое? - матчасть изучил, 100000 циклов записи в еепром. В реальности это сколько? 100000 обращений - 50000 включений/выключений, верно?

Ионистор - альтернатива конденсатору?

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Если решения нет, возможно действительно - при включении доказывать состав до дополнительных герконов на старт/финиш точках на самой малой скорости, и после сработает - остановка, смена полярности, millis, и по основному алгоритму?

kalapanga
Offline
Зарегистрирован: 23.10.2016

Medvedev81 пишет:
Если решения нет, возможно действительно - при включении доказывать состав до дополнительных герконов на старт/финиш точках на самой малой скорости, и после сработает - остановка, смена полярности, millis, и по основному алгоритму?

Ну почему же решения нет? Решение Вам написали. Делаете схему контроля напряжения, делаете резервное питание (аккумуляторы, ионисторы, батарейки). И в случае отключения электричества записываете состояние макета в еепром. В таком режиме Вам её ресурса хватит за глаза. 

Если не хотите/не можете с этим разобраться, попробуйте придумать какой-нибудь алгоритм безопасного адекватного включения макета, типа процитированного.

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Если честно, я не понял что решение найдено)
1. Хочу разобраться, а смогу или нет - это покажет время;
2. Буду искать схему контроля питания
3. Результат выложу

Всем спасибо

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

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

Medvedev81
Offline
Зарегистрирован: 20.12.2017

sadman41 пишет:

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

1. Я не знаю фигня или нет, но гораздо эффектнее выглядит когда ты включаешь макет, а поезд поехал как ни в чем не бывало, а не откатывается до геркона/концевика;

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

3. Был бы признателен если кто-то встречал подобный скетч - с отправкой в еепром состояния скетча при отключении пеитания - поделитесь)

 

 

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

Нет у скетча никакого сохраняемого состояния. Сохранить можно только значения переменных. Вот подумайте, какие переменные вам нужно сохранить, чтобы из нулевого состояния определить, где вы находитесь, в какую сторону ехать и с какой скоростью. И учтите, что перемещения модели вне времени контроля микроконтроллером никак не могут быть учтены сохранением в EEPROM или еще куда-то.

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Спасибо

Ушел в глухую берлогу думать

 

Vovka
Vovka аватар
Offline
Зарегистрирован: 04.09.2018

А еще можно насиловать внешнюю EEPROM, стоит копейки, например

В теле программы писать в EEPROM только измененные данные

Medvedev81
Offline
Зарегистрирован: 20.12.2017
//пробуем пока без герконов

int IN1 = 8; //input1 подключен к выводу 8 
int IN2 = 7;
int EN1 = 9;
int LED1 = 4;
int LED2 = 13;
int flag1 = 0; // вводим переменную для кнопки/геркона 1
int flag2 = 0; // вводим переменную для кнопки/геркона 2

void setup()
{
 pinMode (EN1, OUTPUT);
 pinMode (IN1, OUTPUT);
 pinMode (IN2, OUTPUT);
 pinMode (LED1, OUTPUT);
 pinMode (LED2, OUTPUT);
  {
 pinMode(2, OUTPUT);
 pinMode(12, OUTPUT);
 }

}
void loop()
 
  
{
   {
  if(digitalRead(2)==HIGH&&flag1==0)//если кнопка 1 нажата   
     // и перемення flag1 равна 0 , то ..) 

      {            
       digitalWrite(4,!digitalRead(4));

       flag1=1;

        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%
      }
      
        
      if(digitalRead(2)==LOW&&flag1==1)//если кнопка 1 НЕ нажата 
     //и переменная flag1 равна - 1 ,то ... 
      {    
        flag1=0;//обнуляем переменную flag1 
      }
    }
     
    {
  if(digitalRead(12)==HIGH&&flag2==0)//если кнопка 2 нажата   
     // и перемення flag2 равна 0 , то ..) 

      {            
       digitalWrite(13,!digitalRead(13));

       flag2=1;

        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%
      }
      
        
      if(digitalRead(12)==LOW&&flag2==1)//если кнопка 2 НЕ нажата 
     //и переменная flag2 равна - 1 ,то ... 
      {    
          flag2=0;//обнуляем переменную flag2 
      }   
 
     }

 

{

 {
  digitalWrite (IN2, HIGH); // задаем
  digitalWrite (IN1, LOW);  // полярность
  analogWrite(EN1,55); //разгон
 
   {
   //время выполнения 
  	unsigned long a = millis();
  	while(millis()-2000 < a);
   //конец времени выполнения
   }
  analogWrite(EN1,105);//средний ход
   {
   //время выполнения 
  	unsigned long a = millis();
  	while(millis()-2000 < a);
  //конец времени выполнения
    }
  analogWrite(EN1,255);//крейсерская скорость
  	{
    //время выполнения 
  	unsigned long a = millis();
  	while(millis()-2000 < a);
    //конец времени выполнения
     }
  analogWrite(EN1,105);//средний ход
  	{
    //время выполнения 
  	unsigned long a = millis();
 	while(millis()-2000 < a);
    //конец времени выполнения
   	}
   analogWrite(EN1,55);//торможение
  	{
    //время выполнения 
  	unsigned long a = millis();
 	while(millis()-2000 < a);
    //конец времени выполнения
   	}
   analogWrite(EN1,0);//стоянка
  	{
    //время выполнения 
  	unsigned long a = millis();
 	while(millis()-2000 < a);
    //конец времени выполнения
   	}
  digitalWrite (IN2, LOW);  // смена 
  digitalWrite (IN1, HIGH); // полярности
 }
} 
}  

Вот такой код надумался

По направлению движения - 

переменные 

EN1

IN1

IN2

эти данные помогут продолжить двигаться в нужном направлении с нужной скоростью 

Соответственно при считывании этих данных поезд продолжит движение.

Но, если питание выключилось на EN1 = 55 как ему понять какое значение  EN1 следующее - 105 или 0?

Опять я что-то упускаю....

 

 

 

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Уже вижу ошибку. 

Ввожу regim иначае не прекину полярность.

Но вопрос осталя....

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

Medvedev81, Если вы такой используете код для опроса кнопок(геркона), то воспользуйтесь этим.

/**/
const byte btnPin = 2;
bool btn = 1;
void setup() {
  Serial.begin(9600);
  pinMode(btnPin, INPUT_PULLUP);
}

void loop() {
  if (!digitalRead(btnPin) && btn) {
    delay(10);
    btn = 0;
    Serial.println("down");
  }
  if (digitalRead(btnPin) && !btn) {
    delay(10);
    btn = 1;
    Serial.println("up");
  }
}
/**/

 

Medvedev81
Offline
Зарегистрирован: 20.12.2017

Medvedev81, Если вы такой используете код для опроса кнопок(геркона), то воспользуйтесь этим.

Очень круто но не очень понятно... Я как раз не могу понять как мне читать вторую кнопку, режим ее не хочет читать


     if(digitalRead(2)==HIGH&&flag1==0)//если кнопка нажата   
     // и перемення flag1 равна 0 , то ... 
     { 
       regim1 ++;   
       flag1 =1; 
         
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
          
        if(regim1>2)//ограничим количество режимов 
        { 
          regim1 =1;//так как мы используем только одну кнопку, 
                   // то переключать режимы будем циклично 
        } 
       
     } 
       
      if(digitalRead(2)==LOW&&flag1==1)//если кнопка НЕ нажата 
     //и переменная flag1 равна - 1 ,то ... 
     { 
          
        flag1=0;//обнуляем переменную "кнопка 1" 
     } 
      
       
       
    if(regim1==1)//первый режим 
    { 
      digitalWrite(4,HIGH);//включаем синий диод 
      digitalWrite(13,LOW); 
        
        
      //добавим значение en1
    } 
    if(regim1==2)//второй режим 
    { 
      digitalWrite(13,HIGH);//включаем желтый диод
      digitalWrite(4,LOW); 
        
      //добавим значение en1 
    } 
  if(digitalRead(2)==HIGH&&flag2==0)//если кнопка нажата   
     // и перемення flag2 равна 0 , то ... 
     { 
       regim2 ++;   
       flag2 =1; 
         
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
          
        if(regim2>2)//ограничим количество режимов 
        { 
          regim2 =1;//так как мы используем только одну кнопку, 
                    // то переключать режимы будем циклично 
        } 
       
     } 
       
      if(digitalRead(2)==LOW&&flag2==1)//если кнопка НЕ нажата 
     //и переменная flag1 равна - 1 ,то ... 
     { 
          
        flag2=0;//обнуляем переменную "кнопка 1" 
     } 
      


       
       
    if(regim2==1)//первый режим 
    { 
      digitalWrite(4,HIGH);//включаем оба диода 
      digitalWrite(13,HIGH); 
        
        
      //добавим значение en1
    } 
    if(regim2==2)//второй режим 
    { 
      digitalWrite(13,LOW);//выключаем оба диода
      digitalWrite(4,LOW); 
        
      //добавим значение en1 
    } 

А как вашими переменными читать ?

Medvedev81
Offline
Зарегистрирован: 20.12.2017

qwone пишет:

Medvedev81, Если вы такой используете код для опроса кнопок(геркона), то воспользуйтесь этим.

/**/
const byte btnPin = 2;
bool btn = 1;
void setup() {
  Serial.begin(9600);
  pinMode(btnPin, INPUT_PULLUP);
}

void loop() {
  if (!digitalRead(btnPin) && btn) {
    delay(10);
    btn = 0;
    Serial.println("down");
  }
  if (digitalRead(btnPin) && !btn) {
    delay(10);
    btn = 1;
    Serial.println("up");
  }
}
/**/

 

Ваш просто очень короче и как-то красивее но пока не пойму что он делает

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

А он просто опрашивает 4 кнопки и действия отправляет в Serial

/**/
const byte btn1Pin = 2;
bool btn1 = 1;
const byte btn2Pin = 3;
bool btn2 = 1;
const byte btn3Pin = 4;
bool btn3 = 1;
const byte btn4Pin = 5;
bool btn4 = 1;
void setup() {
  Serial.begin(9600);
  pinMode(btn1Pin, INPUT_PULLUP);
  pinMode(btn2Pin, INPUT_PULLUP);
  pinMode(btn3Pin, INPUT_PULLUP);
  pinMode(btn4Pin, INPUT_PULLUP);
}

void loop() {
  /*1 кнопка*/
  if (!digitalRead(btn1Pin) && btn1) {
    delay(10);
    btn1 = 0;
    Serial.println("btn1 down");
  }
  if (digitalRead(btn1Pin) && !btn1) {
    delay(10);
    btn1 = 1;
    Serial.println("btn1 up");
  }
  /*2 кнопка*/
  if (!digitalRead(btn2Pin) && btn2) {
    delay(10);
    btn2 = 0;
    Serial.println("btn2 down");
  }
  if (digitalRead(btn2Pin) && !btn2) {
    delay(10);
    btn2 = 1;
    Serial.println("btn2 up");
  }
  /*3 кнопка*/
  if (!digitalRead(btn3Pin) && btn3) {
    delay(10);
    btn3 = 0;
    Serial.println("btn3 down");
  }
  if (digitalRead(btn3Pin) && !btn3) {
    delay(10);
    btn3 = 1;
    Serial.println("btn3 up");
  }
  /*4 кнопка*/
  if (!digitalRead(btn4Pin) && btn4) {
    delay(10);
    btn4 = 0;
    Serial.println("btn4 down");
  }
  if (digitalRead(btn4Pin) && !btn4) {
    delay(10);
    btn4 = 1;
    Serial.println("btn4 up");
  }
}
/**/

 

Medvedev81
Offline
Зарегистрирован: 20.12.2017
//пробуем пока без герконов


#include<avr/interrupt.h>

int IN1 = 8; //input1 подключен к выводу 8 
int IN2 = 7;
int EN1 = 9;
int LED1 = 4;
int LED2 = 13;
int flag1 = 0; // вводим переменную для кнопки/геркона 1
int flag2 = 0; // вводим переменную для кнопки/геркона 2
int regim1 = 1; //переменная считает нажатия на кнопку 1
int regim2 = 1; //переменная считает нажатия на кнопку 2

//подсказка гуру
const byte btn1Pin = 2;
bool btn1 = 1;
const byte btn2Pin = 4;
bool btn2 = 1;
const byte btn3Pin = 14;
bool btn3 = 1;
const byte btn4Pin = 15;
bool btn4 = 1;


void setup()
  
{
 Serial.begin(9600);
pinMode(btn1Pin, INPUT_PULLUP);
pinMode(btn2Pin, INPUT_PULLUP);
pinMode(btn3Pin, INPUT_PULLUP);
pinMode(btn4Pin, INPUT_PULLUP);

 pinMode (EN1, OUTPUT);
 pinMode (IN1, OUTPUT);
 pinMode (IN2, OUTPUT);
 pinMode (LED1, OUTPUT);
 pinMode (LED2, OUTPUT);
  {
 pinMode(2, OUTPUT);
 pinMode(12, OUTPUT);
 }

}
void loop()
 
  
{
  /*
   {
  if(digitalRead(2)==HIGH&&flag1==0)//если кнопка 1 нажата   
     // и перемення flag1 равна 0 , то ..) 

      {            
       digitalWrite(4,!digitalRead(4));

       flag1=1;

        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%
      }
      
        
      if(digitalRead(2)==LOW&&flag1==1)//если кнопка 1 НЕ нажата 
     //и переменная flag1 равна - 1 ,то ... 
      {    
        flag1=0;//обнуляем переменную flag1 
      }
    }
     
    {
  if(digitalRead(12)==HIGH&&flag2==0)//если кнопка 2 нажата   
     // и перемення flag2 равна 0 , то ..) 

      {            
       digitalWrite(13,!digitalRead(13));

       flag2=1;

        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%
      }
      
        
      if(digitalRead(12)==LOW&&flag2==1)//если кнопка 2 НЕ нажата 
     //и переменная flag2 равна - 1 ,то ... 
      {    
          flag2=0;//обнуляем переменную flag2 
      }   
 
     }
   */
   //подсказка гуру
   /*1 кнопка*/
  if (!digitalRead(btn1Pin) && btn1) {
    delay(10);
    btn1 = 0;
    digitalWrite(4,HIGH);//включаем синий диод 
    digitalWrite(13,LOW); 
    Serial.println("btn1 down");
  }
  if (digitalRead(btn1Pin) && !btn1) {
    delay(10);
    btn1 = 1;
    digitalWrite(4,LOW);//включаем желтый диод 
    digitalWrite(13,HIGH); 
    Serial.println("btn1 up");
  }
  /*2 кнопка*/
  if (!digitalRead(btn2Pin) && btn2) {
    delay(10);
    btn2 = 0;
    digitalWrite(4,HIGH);//включаем оба диода 
    digitalWrite(13,HIGH); 
    Serial.println("btn2 down");
  }
  if (digitalRead(btn2Pin) && !btn2) {
    delay(10);
    btn2 = 1;
    digitalWrite(4,LOW);//выключаем оба диода 
    digitalWrite(13,LOW); 
    Serial.println("btn2 up");
  }
  /*3 кнопка*/
  if (!digitalRead(btn3Pin) && btn3) {
    delay(10);
    btn3 = 0;
    Serial.println("btn3 down");
  }
  if (digitalRead(btn3Pin) && !btn3) {
    delay(10);
    btn3 = 1;
    Serial.println("btn3 up");
  }
  /*4 кнопка*/
  if (!digitalRead(btn4Pin) && btn4) {
    delay(10);
    btn4 = 0;
    Serial.println("btn4 down");
  }
  if (digitalRead(btn4Pin) && !btn4) {
    delay(10);
    btn4 = 1;
    Serial.println("btn4 up");
  }
   
{

 {
  digitalWrite (IN2, HIGH); // задаем
  digitalWrite (IN1, LOW);  // полярность
  analogWrite(EN1,55); //разгон
 
   {
   //время выполнения 
  	unsigned long a = millis();
  	while(millis()-2000 < a);
   //конец времени выполнения
   }
  analogWrite(EN1,105);//средний ход
   {
   //время выполнения 
  	unsigned long a = millis();
  	while(millis()-2000 < a);
  //конец времени выполнения
    }
  analogWrite(EN1,255);//крейсерская скорость
  	{
    //время выполнения 
  	unsigned long a = millis();
  	while(millis()-2000 < a);
    //конец времени выполнения
     }
  analogWrite(EN1,105);//средний ход
  	{
    //время выполнения 
  	unsigned long a = millis();
 	while(millis()-2000 < a);
    //конец времени выполнения
   	}
   analogWrite(EN1,55);//торможение
  	{
    //время выполнения 
  	unsigned long a = millis();
 	while(millis()-2000 < a);
    //конец времени выполнения
   	}
   analogWrite(EN1,0);//стоянка
  	{
    //время выполнения 
  	unsigned long a = millis();
 	while(millis()-2000 < a);
    //конец времени выполнения
   	}
  digitalWrite (IN2, LOW);  // смена 
  digitalWrite (IN1, HIGH); // полярности
 }
} 
}  

qwone пишет:

А он просто опрашивает 4 кнопки и действия отправляет в Serial

/**/
const byte btn1Pin = 2;
bool btn1 = 1;
const byte btn2Pin = 3;
bool btn2 = 1;
const byte btn3Pin = 4;
bool btn3 = 1;
const byte btn4Pin = 5;
bool btn4 = 1;
void setup() {
  Serial.begin(9600);
  pinMode(btn1Pin, INPUT_PULLUP);
  pinMode(btn2Pin, INPUT_PULLUP);
  pinMode(btn3Pin, INPUT_PULLUP);
  pinMode(btn4Pin, INPUT_PULLUP);
}

void loop() {
  /*1 кнопка*/
  if (!digitalRead(btn1Pin) && btn1) {
    delay(10);
    btn1 = 0;
    Serial.println("btn1 down");
  }
  if (digitalRead(btn1Pin) && !btn1) {
    delay(10);
    btn1 = 1;
    Serial.println("btn1 up");
  }
  /*2 кнопка*/
  if (!digitalRead(btn2Pin) && btn2) {
    delay(10);
    btn2 = 0;
    Serial.println("btn2 down");
  }
  if (digitalRead(btn2Pin) && !btn2) {
    delay(10);
    btn2 = 1;
    Serial.println("btn2 up");
  }
  /*3 кнопка*/
  if (!digitalRead(btn3Pin) && btn3) {
    delay(10);
    btn3 = 0;
    Serial.println("btn3 down");
  }
  if (digitalRead(btn3Pin) && !btn3) {
    delay(10);
    btn3 = 1;
    Serial.println("btn3 up");
  }
  /*4 кнопка*/
  if (!digitalRead(btn4Pin) && btn4) {
    delay(10);
    btn4 = 0;
    Serial.println("btn4 down");
  }
  if (digitalRead(btn4Pin) && !btn4) {
    delay(10);
    btn4 = 1;
    Serial.println("btn4 up");
  }
}
/**/

 

Вообще не реагирует.

Сразу зажигает синий диод а на нажатия кнопок не реагирует

Сериал выкидывает 3 down и 4 down, так как я их на аналог повесил, а с 2 и 4 пина кнопки ничего не меняют

Такое ощущение что не туда поплыли

 

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

Medvedev81 пишет:
Такое ощущение что не туда поплыли
Ну вы мне напоминаете чукчу из анекдота. Вот зачем вы столько туфты туда всунули. Или вы спецом пишете неработающий скетч. Мол научимся писать неработающий скетч будем потом учится писать (!!!)работающий .

Чукча едет в такси. Вдруг на дороге появлется старушка. Таксист влево - старушка влево. Таксист вправо - старушка вправо. Чудом удалось ее не сбить. Но посмотрев в зеркало, таксист увидел бабульку лежащей на дороге.
- Ты, таксиста, плохой охотник. Если бы чукча не открыл дверцу, бабка бы ушла. 

 

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

Medvedev81, а вот это што за ужас?

 while(millis()-2000 < a);

кто вас научил так интервалы отмерять?

Эта конструкция - полный аналог лператора delay(2000)  и она точно так же блокирует работу программы на 2 секунды. С таким кодом никакой опрос кнопок работать не будет