Выдержка времени без delay(pot1);

hubll
Offline
Зарегистрирован: 08.03.2015

Здравствуйте, делаю штуку которая будет поднимаь из стакана пакетик с чаем через определенное время, работает до 25 сек, задержка выставляется потенциометром и выводися на Олед дисплей, задержка через delay(pot1); 

Когда задержка меньше 25 сек, то все работет, а конгда больше то нет - ничего не происходит. Подскажите как сделать выдержку времени без делей. Перерыл и наши и иностранные сайты, ничего не нашел. 



// Arduino Uno:
// ----------------------
// Дисплей:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//           SCL pin   -> Arduino Analog 5 or the dedicated SCL pin


#include <OLED_I2C.h>
#include <Servo.h>

RBD::Timer timer;
Servo servo1;
int switchPin = 8;
OLED  myOLED(SDA, SCL, 8);
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
const int in1 = 6;    // управление двигателем
const int in2 = 7;    // управление двигателем

int sensorValue = 0;



void setup()


{ 
  pinMode(switchPin, INPUT_PULLUP);    
  pinMode(A0, INPUT);  
  myOLED.begin();
  myOLED.setFont(SmallFont);
  servo1.attach(3); 
  servo1.write(230); 
  pinMode(in1, OUTPUT);      // драйверу двигателя
  pinMode(in2, OUTPUT);      // драйверу двигателя
    digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  delay(5000); 
      digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  Serial.begin(9600);




}

void loop()

{

  if(digitalRead(switchPin) == LOW)
  {     
   int pot;
  int pot1;
  
  
  pot = pot/3;
  myOLED.clrScr();
  myOLED.setFont(BigNumbers);
  myOLED.printNumI(pot, CENTER, 20);
  myOLED.update(); 
  

 //   digitalWrite(in1, LOW);
 // digitalWrite(in2, HIGH);
 // delay(1000);  
  }
  else
  {
    servdvig();
  }
  delay(10); 
 
}


void servdvig()
{

  int pot;
  int pot1;
  pot = analogRead(A0);
  pot = pot/3;
  pot1 = pot*1000;


    digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  delay(5000); 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  servo1.write(70);

  delay(3600000); 
   
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Миллис, пилять, МИЛЛИС!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

Точно. Да поможет вам Святой millis().

hubll
Offline
Зарегистрирован: 08.03.2015

Тыкните носом пожалуйста, вот сделал с миллис, но не работает:


// Arduino Uno:
// ----------------------
// Дисплей:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//           SCL pin   -> Arduino Analog 5 or the dedicated SCL pin


#include <OLED_I2C.h>
#include <Servo.h>
#include <RBD_Timer.h> 
unsigned long timing;

Servo servo1;
int switchPin = 8;
OLED  myOLED(SDA, SCL, 8);
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
const int in1 = 6;    // управление двигателем
const int in2 = 7;    // управление двигателем





void setup()


{  int pot;
  int pot1;
  pinMode(switchPin, INPUT_PULLUP);    
  pinMode(A0, INPUT);  
  myOLED.begin();
  myOLED.setFont(SmallFont);
  servo1.attach(3); 
  servo1.write(230); 
  pinMode(in1, OUTPUT);      // драйверу двигателя
  pinMode(in2, OUTPUT);      // драйверу двигателя
    digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  delay(5000); 
      digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  Serial.begin(9600);




}

void loop()

{

  if(digitalRead(switchPin) == LOW)
  {     
    int pot;
   pot = analogRead(A0);
  pot = pot/3;
  myOLED.clrScr();
  myOLED.setFont(BigNumbers);
  myOLED.printNumI(pot, CENTER, 20);
  myOLED.update(); 
  

 //   digitalWrite(in1, LOW);
 // digitalWrite(in2, HIGH);
 // delay(1000);  
  }
  else
  {
    servdvig();
  }
  delay(10); 
 
}


void servdvig()
{

  int pot;
  int pot1;
  pot = analogRead(A0);
  pot = pot/3;
  pot1 = pot*1000;

if(millis() - timing > pot1);{

    digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  delay(5000); 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  servo1.write(70);

  delay(3600000); 

  
  }
}

 

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

Может вы напишете код по методичке #176

bwn
Offline
Зарегистрирован: 25.08.2014

hubll пишет:

Тыкните носом пожалуйста, вот сделал с миллис, но не работает:


// Arduino Uno:
// ----------------------
// Дисплей:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//           SCL pin   -> Arduino Analog 5 or the dedicated SCL pin


#include <OLED_I2C.h>
#include <Servo.h>
#include <RBD_Timer.h> 
unsigned long timing;

Servo servo1;
int switchPin = 8;
OLED  myOLED(SDA, SCL, 8);
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
const int in1 = 6;    // управление двигателем
const int in2 = 7;    // управление двигателем





void setup()


{  int pot;
  int pot1;
  pinMode(switchPin, INPUT_PULLUP);    
  pinMode(A0, INPUT);  
  myOLED.begin();
  myOLED.setFont(SmallFont);
  servo1.attach(3); 
  servo1.write(230); 
  pinMode(in1, OUTPUT);      // драйверу двигателя
  pinMode(in2, OUTPUT);      // драйверу двигателя
    digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  delay(5000); 
      digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  Serial.begin(9600);




}

void loop()

{

  if(digitalRead(switchPin) == LOW)
  {     
    int pot;
   pot = analogRead(A0);
  pot = pot/3;
  myOLED.clrScr();
  myOLED.setFont(BigNumbers);
  myOLED.printNumI(pot, CENTER, 20);
  myOLED.update(); 
  

 //   digitalWrite(in1, LOW);
 // digitalWrite(in2, HIGH);
 // delay(1000);  
  }
  else
  {
    servdvig();
  }
  delay(10); 
 
}


void servdvig()
{

  int pot;
  int pot1;
  pot = analogRead(A0);
  pot = pot/3;
  pot1 = pot*1000;

if(millis() - timing > pot1);{

    digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  delay(5000); 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  servo1.write(70);

  delay(3600000); 

  
  }
}

 

Зачот. 96 строка вообще вне конкуренции.

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

bwn пишет:

hubll пишет:

Тыкните носом пожалуйста, вот сделал с миллис, но не работает:


// Arduino Uno:
// ----------------------
// Дисплей:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//           SCL pin   -> Arduino Analog 5 or the dedicated SCL pin


#include <OLED_I2C.h>
#include <Servo.h>
#include <RBD_Timer.h> 
unsigned long timing;

Servo servo1;
int switchPin = 8;
OLED  myOLED(SDA, SCL, 8);
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
const int in1 = 6;    // управление двигателем
const int in2 = 7;    // управление двигателем





void setup()


{  int pot;
  int pot1;
  pinMode(switchPin, INPUT_PULLUP);    
  pinMode(A0, INPUT);  
  myOLED.begin();
  myOLED.setFont(SmallFont);
  servo1.attach(3); 
  servo1.write(230); 
  pinMode(in1, OUTPUT);      // драйверу двигателя
  pinMode(in2, OUTPUT);      // драйверу двигателя
    digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  delay(5000); 
      digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  Serial.begin(9600);




}

void loop()

{

  if(digitalRead(switchPin) == LOW)
  {     
    int pot;
   pot = analogRead(A0);
  pot = pot/3;
  myOLED.clrScr();
  myOLED.setFont(BigNumbers);
  myOLED.printNumI(pot, CENTER, 20);
  myOLED.update(); 
  

 //   digitalWrite(in1, LOW);
 // digitalWrite(in2, HIGH);
 // delay(1000);  
  }
  else
  {
    servdvig();
  }
  delay(10); 
 
}


void servdvig()
{

  int pot;
  int pot1;
  pot = analogRead(A0);
  pot = pot/3;
  pot1 = pot*1000;

if(millis() - timing > pot1);{

    digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  delay(5000); 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  servo1.write(70);

  delay(3600000); 

  
  }
}

 

Зачот. 96 строка вообще вне конкуренции.

Ага, тоже поржал))

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

И надо ли городить такой огород только из-за пакетика с чаем? Он неплохо и в неподвижном состоянии заваривается. Хотя... Может не о пакетике речь?))

hubll
Offline
Зарегистрирован: 08.03.2015

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

А на счет кода, вот это соблюдается, вроди как.

.......

Что я требую от классов:
1 - что бы в них обязательно были public методы setup() и loop()
2-  что бы представители этих классов,что из одного класса,что из разных, могли взаимно не тормозить друг друга. 
...,...
 
 
 
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

 Ну не может процессор уснуть вечным сном. А если уснет то не оживет. Вот вы закончили учебу(работу) и надо прийти завтра с утра. Вы что вышли за ворота и легли рядом спать до утра. Ну не живут сейчас так. Не работают по 16 часов в сутки. У людей есть часы. Часы в даном смысле это millis(). И вот человек едет домой спать, одтыхать, играть в онлайн игры. А утром едет на работу вовремя. Пользуясь этими часами.

bwn
Offline
Зарегистрирован: 25.08.2014

Почитайте  здесь. Простенько и доступно. Можете поштудировать qwone, но для неофитов у него слишком заумно. ИМХО.

UPD, поправил ссылку, криво вставилась.

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

Квон всем мозги заполоскал своими классами. Нужны они, не нужны - лепи их пачками.

hubll, что не так в работе вашего кода? Вы же написали контроллеру: ничего не делать 3600000 мсек, он ничего и не делает.

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

hubll
Offline
Зарегистрирован: 08.03.2015

выдержку времени в 3600000 он делает правильно, а вот тут delay(pot1); 


void servdvig()
{

  int pot;
  int pot1;
  pot = analogRead(A0);
  pot = pot/3;
  pot1 = pot*1000;

delay(pot1);   // вот эту выдержку он делает до 25 с нормально, а если она больше 25, то
// действия которые ниже он не выполняет. Эта выдержка накручивается потенциометром. 


    digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  delay(5000); 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  servo1.write(70);

  delay(3600000); 
   
}

Вот я  и думаю как перети на миллис, или что-то другое.

hubll
Offline
Зарегистрирован: 08.03.2015

Вот этот код весь 


// Arduino Uno:
// ----------------------
// Дисплей:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//           SCL pin   -> Arduino Analog 5 or the dedicated SCL pin


#include <OLED_I2C.h>
#include <Servo.h>
#include <RBD_Timer.h> 
unsigned long timing;

Servo servo1;
int switchPin = 8;
OLED  myOLED(SDA, SCL, 8);
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
const int in1 = 6;    // управление двигателем
const int in2 = 7;    // управление двигателем





void setup()


{  int pot;
  int pot1;
  pinMode(switchPin, INPUT_PULLUP);    
  pinMode(A0, INPUT);  
  myOLED.begin();
  myOLED.setFont(SmallFont);
  servo1.attach(3); 
  servo1.write(230); 
  pinMode(in1, OUTPUT);      // драйверу двигателя
  pinMode(in2, OUTPUT);      // драйверу двигателя
    digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  delay(5000); 
      digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  Serial.begin(9600);




}

void loop()

{

  if(digitalRead(switchPin) == LOW)
  {     
    int pot;
   pot = analogRead(A0);
  pot = pot/3;
  myOLED.clrScr();
  myOLED.setFont(BigNumbers);
  myOLED.printNumI(pot, CENTER, 20);
  myOLED.update(); 
  
  }
  else
  {
    servdvig();
  }
  delay(10); 
 
}


void servdvig()
{

  int pot;
  int pot1;
  pot = analogRead(A0);
  pot = pot/3;
  pot1 = pot*1000;

// if(millis() - timing > pot1);{
delay(pot1); 
    digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  delay(5000); 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  servo1.write(70);

  delay(3600000); 

  
  // }
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Для начала почитайте какие бывают типы данных, что то мне подсказывает, что проблемы начинаются после 32 секунд.

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

bwn прав, посмотрите, какую максимальную величину может хранить pot1:

---------------------

Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел. int занимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1)

---------------------

hubll
Offline
Зарегистрирован: 08.03.2015

ООО. Спасибо большое, век живы век учись. проверил, там действительно 32 с, а дальше не работает.

bwn
Offline
Зарегистрирован: 25.08.2014

hubll пишет:

да, у меня есть трудности  с програимрованием, но я учусь. 

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

hubll
Offline
Зарегистрирован: 08.03.2015

Согласен. Исправил int на long. Работает


// Arduino Uno:
// ----------------------
// Дисплей:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//           SCL pin   -> Arduino Analog 5 or the dedicated SCL pin


#include <OLED_I2C.h>
#include <Servo.h>
#include <RBD_Timer.h> 
unsigned long timing;

Servo servo1;
int switchPin = 8;
OLED  myOLED(SDA, SCL, 8);
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
const int in1 = 6;    // управление двигателем
const int in2 = 7;    // управление двигателем





void setup()


{  long pot;
  long pot1;
  pinMode(switchPin, INPUT_PULLUP);    
  pinMode(A0, INPUT);  
  myOLED.begin();
  myOLED.setFont(SmallFont);
  servo1.attach(3); 
  servo1.write(230); 
  pinMode(in1, OUTPUT);      // драйверу двигателя
  pinMode(in2, OUTPUT);      // драйверу двигателя
    digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  delay(5000); 
      digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  Serial.begin(9600);




}

void loop()

{

  if(digitalRead(switchPin) == LOW)
  {     
    long pot;
   pot = analogRead(A0);
  pot = pot/3;
  myOLED.clrScr();
  myOLED.setFont(BigNumbers);
  myOLED.printNumI(pot, CENTER, 20);
  myOLED.update(); 
  
  }
  else
  {
    servdvig();
  }
  delay(10); 
 
}


void servdvig()
{

  long pot;
 long pot1;
  pot = analogRead(A0);
  pot = pot/3;
  pot1 = pot*1000;

// if(millis() - timing > pot1);{
delay(pot1); 
    digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  delay(5000); 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  servo1.write(70);

  delay(3600000); 

  
  // }
}

 

hubll
Offline
Зарегистрирован: 08.03.2015

Спасибо за помощь, туперь буду заравивать чай удобно, с уставкой от 0 до 341 с. Чуть позже скину фото того что получилось.

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

hubll пишет:

Что я требую от классов:
1 - что бы в них обязательно были public методы setup() и loop()
2-  что бы представители этих классов,что из одного класса,что из разных, могли взаимно не тормозить друг друга. 
Ну, за взаимное неторможение!