Подскажите новичку
- Войдите на сайт для отправки комментариев
Пт, 12/08/2016 - 20:41
//имитатор датчика глубины
#define SK_PLUS 13 //импульсы по одному проводу (датчик вращается по часовой)
#define SK_MINUS 12 //импульсы по другому проводу (датчик вращается против часовой)
#define LED 11 //светодиод индикатор 10 оборотов
void setup()
{
pinMode(SK_MINUS, OUTPUT);
pinMode(SK_PLUS, OUTPUT);
pinMode(LED, OUTPUT);
}
void loop()
{
for (int x = 0; x < 100; x++) {
digitalWrite(SK_PLUS, HIGH);
delay(100);
digitalWrite(SK_PLUS, LOW);
delay(100);
if (x == 10 ) { //моргает через 10 циклов for всего один раз
digitalWrite(LED, HIGH); //как сделать, что бы через каждые 10 метров(циклов)
delay(100); //вспыхивал светодиод
digitalWrite(LED, LOW);
delay(100);
}
}
for (int y = 0; y < 100; y++) {
digitalWrite(SK_MINUS, HIGH);
delay(100);
digitalWrite(SK_MINUS, LOW);
delay(100);
if (y == 10, 20, 30, 40, 50) {
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
}
}
}
if (x % 10 == 0)
Спасибо огромное
Подскажите пожалйуста как этот код написать без delay?
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Попробуйте сменить подход. Вот Вам пример для спуска, для подема напишите сами. Код делает тоже что и for но не вешает систему
//имитатор датчика глубины #define SK_PLUS 13 //импульсы по одному проводу (датчик вращается по часовой) #define SK_MINUS 12 //импульсы по другому проводу (датчик вращается против часовой) #define LED 11 //светодиод индикатор 10 оборотов unsigned long currentTime; //Переменная для pause int spusk = 0; int podem = 0; int var = 0; void setup() { pinMode(SK_MINUS, OUTPUT); pinMode(SK_PLUS, OUTPUT); pinMode(LED, OUTPUT); } //Функция pause int pause(int y) { static bool fl_pause = 0; bool x = 0; if (fl_pause == 0)currentTime = millis(), fl_pause = 1; if (millis() - currentTime >= y) x = 1, fl_pause = 0; return x; } void loop() { if (spusk < 100) { switch (var) { case 0: spusk ++; digitalWrite(SK_PLUS, HIGH); if (spusk % 10 == 0)digitalWrite(LED, HIGH); var = 1; break; case 1: if (pause(100)) { digitalWrite(SK_PLUS, LOW); if (spusk % 10 == 0)digitalWrite(LED, LOW); var = 2; } break; case 2: if (pause(100)) { var = 0; } break; } } }Во первых, спасибо за правильный вектор
//имитатор датчика глубины #define SK_PLUS 11 //импульсы по одному проводу (датчик вращается по часовой) #define SK_MINUS 12 //импульсы по другому проводу (датчик вращается против часовой) #define LED 13 //светодиод индикатор 10 оборотов unsigned long currentTime; //Переменная для pause int spusk = 0; //переменная спуск int podem = 0; //переменная подъем int var = 0; //общая переменная void setup() { pinMode(SK_MINUS, OUTPUT); //вывод ШК+ pinMode(SK_PLUS, OUTPUT); //вывод ШК- pinMode(LED, OUTPUT); //метки глубины } //Функция pause int pause(int y) { static bool fl_pause = 0; bool x = 0; if (fl_pause == 0)currentTime = millis(), fl_pause = 1; if (millis() - currentTime >= y) x = 1, fl_pause = 0; return x; } void loop() { if (spusk < 100) //если циклов спуск меньше 100 { switch (var) { //то начинаем сравнивать переменную вар case 0: //выполняем когда var = 0 spusk ++; //добавляем к переменной(циклу) спуск +1 digitalWrite(SK_PLUS, HIGH); //уровень +5 на выходе ШК+ if (spusk % 10 == 0)digitalWrite(LED, HIGH); //метки глубины var = 1; //переменной var присваивается значение 1 break; //выход из цикла case 1: //выполняется когда var = 1 if (pause(100)) //если пауза 100 { digitalWrite(SK_PLUS, LOW); //уровень 0 на выходе ШК+ if (spusk % 10 == 0)digitalWrite(LED, LOW); //метки глубины var = 2; //переменной var при сваевается значение 2 } break; //выход из цикла case 2: if (pause(100)) { var = 0; } break; } } if (spusk == 100) //если циклов "спуск" ровно 100 { switch (var) { //то мы делаем case 0: //выполняется когда var = 0 podem ++; //добавляем к циклу спуск +1 digitalWrite(SK_MINUS, HIGH); //уровень +5 на выходе ШК+ if (podem % 10 == 0)digitalWrite(LED, HIGH); //метки глубины var = 1; //переменной var присваивается значение 1 break; //выход из цикла case 1: //выполняется когда var = 1 if (pause(100)) { digitalWrite(SK_MINUS, LOW); //уровень 0 на выходе ШК+ if (podem % 10 == 0)digitalWrite(LED, LOW); //метки глубины var = 2; //переменной var при сваевается значение 2 } break; //выход из цикла case 2: if (pause(100)) { var = 0; } break; } if (podem == 100) { //если циклов подъем равняется 100 spusk = 0; //то приравниваем переменную спуск со 100 на 0 podem = 0; //и приравниваем переменную подьём со 100 на 0 } } }объясните пожалуйста, если вас не затруднит что происходит в 39 и 47 строке
if(pause(100))Sharlatan. попробую я объяснить.Хотя vosara код другой, но подход тот же.
Вoт код Blink
void setup() { // initialize digital pin 13 as an output. pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }На что уходит мощь процессора ? На паузы delay. А вот этот код
const int out_pin=13;// нога LED uint8_t stat = 0; void setup() { pinMode(out_pin, OUTPUT); digitalWrite(out_pin, stat); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; static uint32_t future1 = 0 ; if (MILLIS>=future1) { future1 = MILLIS + 1000 ; // вычислит. поток 1 действует раз в 1000 миллисекунд. // код потока 1 stat =!stat; digitalWrite(out_pin, stat); } }На постояную проверку millis.
берем аналогию. У вас есть часы и вы пытаетесь организовать работу по разгрузке машин. Машины приходят по 1 в час. Можно постоянно торчать на месте разгрузки машин . А можно разгрузить машину и свалить с места разгрузки , но поглядывать на часы. Вот это и есть millis(). Но есть маленькая заморочка. Если вы подрядились на почасовую разгрузку машин, вы не можете пойти на весь день на рыбалку. Точнее можете. Но вам придется бегать как Фигаро тут, Фигаро там. Так это я к чему. Программы с millis любят циклы с for. Особенно если они долгие. Вот и приходится размыкать такие циклы. Откладывать следующий проход цикла for, на следующий проход цикла loop.
С 18й по 25ю строчки написана функция паизы "
intpause(inty)"построеная не на "делай" - которая останавлюет систему а на милис, вот к ней мы и обращаемся не тормозя систему, задав паузу в 100 мс " " номожно задать любое число. После 100 мс возвращается 1 разрешая нам выполнить код в блокеif(pause(100)) {}