Выдержка времени без delay(pot1);
- Войдите на сайт для отправки комментариев
Вс, 03/12/2017 - 15:45
Здравствуйте, делаю штуку которая будет поднимаь из стакана пакетик с чаем через определенное время, работает до 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);
}
Миллис, пилять, МИЛЛИС!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Точно. Да поможет вам Святой millis().
Тыкните носом пожалуйста, вот сделал с миллис, но не работает:
// 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); } }Может вы напишете код по методичке #176
Тыкните носом пожалуйста, вот сделал с миллис, но не работает:
// 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 строка вообще вне конкуренции.
Тыкните носом пожалуйста, вот сделал с миллис, но не работает:
// 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 строка вообще вне конкуренции.
Ага, тоже поржал))
И надо ли городить такой огород только из-за пакетика с чаем? Он неплохо и в неподвижном состоянии заваривается. Хотя... Может не о пакетике речь?))
да, у меня есть трудности с програимрованием, но я учусь. так написал чтобы все заглохло на час. delay(3600000);
А на счет кода, вот это соблюдается, вроди как.
.......
Ну не может процессор уснуть вечным сном. А если уснет то не оживет. Вот вы закончили учебу(работу) и надо прийти завтра с утра. Вы что вышли за ворота и легли рядом спать до утра. Ну не живут сейчас так. Не работают по 16 часов в сутки. У людей есть часы. Часы в даном смысле это millis(). И вот человек едет домой спать, одтыхать, играть в онлайн игры. А утром едет на работу вовремя. Пользуясь этими часами.
Почитайте здесь. Простенько и доступно. Можете поштудировать qwone, но для неофитов у него слишком заумно. ИМХО.
UPD, поправил ссылку, криво вставилась.
Квон всем мозги заполоскал своими классами. Нужны они, не нужны - лепи их пачками.
hubll, что не так в работе вашего кода? Вы же написали контроллеру: ничего не делать 3600000 мсек, он ничего и не делает.
Сформулируйте для себя простыми словами и крайне подробно - какие действия МК должен совершить для получения результата таким, как вы его себе предствили.
выдержку времени в 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); }Вот я и думаю как перети на миллис, или что-то другое.
Вот этот код весь
// 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); // } }Для начала почитайте какие бывают типы данных, что то мне подсказывает, что проблемы начинаются после 32 секунд.
bwn прав, посмотрите, какую максимальную величину может хранить pot1:
---------------------
Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел. int занимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1)
---------------------
ООО. Спасибо большое, век живы век учись. проверил, там действительно 32 с, а дальше не работает.
да, у меня есть трудности с програимрованием, но я учусь.
Так потратьте часик и прочитайте пару раз весь раздел "Программирование", хоть будете представлять что можно, а что нельзя. ИМХО.
Согласен. Исправил 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); // } }Спасибо за помощь, туперь буду заравивать чай удобно, с уставкой от 0 до 341 с. Чуть позже скину фото того что получилось.