Я понял как работает while.
Вопрос как без него вынуть данные в классический loop() и поиграться с ними. Оно же работает в библиотеке и выдаёт данные по кислороду и пульсу.
Аппаратная платформа Arduino для автоматизации наших процессов
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
![](https://cdn.homedistil.ru/th/1304/21/12313.161239.png)
![](https://forum.homedistiller.ru/Themes/default/images/post/wireless.gif)
Volume
Доктор наук
Уфа
580 310
Отв.1301 15 Окт. 24, 15:03, через 44 мин
без while как-то так:
sensor.update(); //считает данные чипа в буфер/массив библиотеки
bool ret=sensor.getRawValues(&ir, &red);//зачитает данные из буфера в переменные ir, red, если буфер пуст - вернет false
// переменные ir, red содержат 1ю порцию данных
if (ret) ret=sensor.getRawValues(&ir, &red);//зачитает из буфера в переменные ir, red следующую порцию данных, если буфер пуст - вернет false
// переменные ir, red содержат 2ю порцию данных
if (ret) ret=sensor.getRawValues(&ir, &red);//зачитает из буфера в переменные ir, red следующую порцию данных, если буфер пуст - вернет false
// переменные ir, red содержат 3ю порцию данных
и т.д. - пока ret не станет false, тогда повторяем все с начала
sensor.update(); //считает данные чипа в буфер/массив библиотеки
bool ret=sensor.getRawValues(&ir, &red);//зачитает данные из буфера в переменные ir, red, если буфер пуст - вернет false
// переменные ir, red содержат 1ю порцию данных
if (ret) ret=sensor.getRawValues(&ir, &red);//зачитает из буфера в переменные ir, red следующую порцию данных, если буфер пуст - вернет false
// переменные ir, red содержат 2ю порцию данных
if (ret) ret=sensor.getRawValues(&ir, &red);//зачитает из буфера в переменные ir, red следующую порцию данных, если буфер пуст - вернет false
// переменные ir, red содержат 3ю порцию данных
и т.д. - пока ret не станет false, тогда повторяем все с начала
dee
Научный сотрудник
Минск
8.2K 2.2K
![](https://cdn.homedistil.ru/th/2105/20/4794.346645.jpg)
Отв.1302 15 Окт. 24, 15:32, через 30 мин
ну блин даёте ..
void loop() {
sensor.update();
delay(100);
sensor.getRawValues(&ir, &red);
Serial.print("IR=");
Serial.print(ir);
Serial.print(" RED=");
Serial.println(red);
}
void loop() {
sensor.update();
delay(100);
sensor.getRawValues(&ir, &red);
Serial.print("IR=");
Serial.print(ir);
Serial.print(" RED=");
Serial.println(red);
}
Volume
Доктор наук
Уфа
580 310
Отв.1303 15 Окт. 24, 15:41, через 9 мин
dee, твой вариант считает из буфера один, первый, отсчет, остальные игнорятся. Я хз что подразумевается под
вынуть данные в классический loop() и поиграться с нимиВиктрыч, 15 Окт. 24, 14:20но терять данные - так себе идея
dee
Научный сотрудник
Минск
8.2K 2.2K
![](https://cdn.homedistil.ru/th/2105/20/4794.346645.jpg)
Отв.1304 15 Окт. 24, 15:48, через 7 мин
Volume, почему игнорятся ? бесконечный цикл запускает обновление в датчике, ждет что он там намутит 0,1сек, читает и выводит их в порт
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
![](https://cdn.homedistil.ru/th/1304/21/12313.161239.png)
![](https://forum.homedistiller.ru/Themes/default/images/post/wireless.gif)
dee,
Я так конечно пробовал . Чуток то соображаю. Данные считываются один раз и далее просто дублируются. При чем какая то фуйня. Допустим 27654. Хотя в
цикле while идёт чётко 0 при работе светодиодов в пустоту и до 8 тыс в, зависимости от отражения и проницания от предмета. Конкретно пальца. Но не обязательно. Вот это меня и зацепило.
Добавлено через 7мин.:
Volume,
Вот я и хочу выцепить данные датчика. В выложенном примере я их только вижу. А взять не получается. Могу только уже обработаные библиотекой. То есть допустим кислород от 0 до 100% . И с ними могу поколдовать. Но это производное обоих датчиков. А хотелось бы непосредственно потрогпть каждый.
Я так конечно пробовал . Чуток то соображаю. Данные считываются один раз и далее просто дублируются. При чем какая то фуйня. Допустим 27654. Хотя в
цикле while идёт чётко 0 при работе светодиодов в пустоту и до 8 тыс в, зависимости от отражения и проницания от предмета. Конкретно пальца. Но не обязательно. Вот это меня и зацепило.
Добавлено через 7мин.:
Volume,
Вот я и хочу выцепить данные датчика. В выложенном примере я их только вижу. А взять не получается. Могу только уже обработаные библиотекой. То есть допустим кислород от 0 до 100% . И с ними могу поколдовать. Но это производное обоих датчиков. А хотелось бы непосредственно потрогпть каждый.
Volume
Доктор наук
Уфа
580 310
Отв.1306 15 Окт. 24, 17:53
почему игнорятся ?dee, 15 Окт. 24, 15:48потому что update() читает в буфер массив данных, а getRawValues(&ir, &red) достает только один семпл из буфера.
Если достать один семпл и вызвать update (как у тебя), то все несчитанные данные в буфере просто затрутся
А взять не получаетсяВиктрыч, 15 Окт. 24, 16:38данные в переменных ir и red, в примере они выводятся на UART (Serial.print). Бери и пользуйся, в чем проблема то?
Другое дело - что ты с ними делать собрался? Там же по сути семплы АЦП, которые в библиотеке сохраняются в кольцевой буфер, данные в буфере обрабатываются при вызовах верхнеуровневых функций
dee
Научный сотрудник
Минск
8.2K 2.2K
![](https://cdn.homedistil.ru/th/2105/20/4794.346645.jpg)
Отв.1307 15 Окт. 24, 19:26
Volume, тогда следующий вызов sensor.getRawValues(&ir, &red); должен давать следующее значение из буфера пока буфер не закончится ? тогда не вижу проблемм с while, можно натолкать в переменную побольше типа float или unsigned long весь буфер и разделить на счетчик
uint16_t ir, red, counter;
float ir_float, red_float;
void loop()
{
sensor.update();
ir_float = 0;
red_float = 0;
counter = 0;
while (sensor.getRawValues(&ir, &red)) {
ir_float += ir;
red_float += red;
counter++;
}
ir_float /= counter;
red_float /= counter;
Serial.print("IR=");
Serial.print(ir_float);
Serial.print(" RED=");
Serial.println(red_float);
}
uint16_t ir, red, counter;
float ir_float, red_float;
void loop()
{
sensor.update();
ir_float = 0;
red_float = 0;
counter = 0;
while (sensor.getRawValues(&ir, &red)) {
ir_float += ir;
red_float += red;
counter++;
}
ir_float /= counter;
red_float /= counter;
Serial.print("IR=");
Serial.print(ir_float);
Serial.print(" RED=");
Serial.println(red_float);
}
Volume
Доктор наук
Уфа
580 310
Отв.1308 15 Окт. 24, 20:55
тогда не вижу проблемм с whiledee, 15 Окт. 24, 19:26не-не! Виктрыч требовал "без него[while] вынуть данные". Так что извольте без while )))
dee
Научный сотрудник
Минск
8.2K 2.2K
![](https://cdn.homedistil.ru/th/2105/20/4794.346645.jpg)
Отв.1309 15 Окт. 24, 21:05, через 10 мин
я так понимаю что его беспокоило другое
Добавлено через 2мин.:
Виктрыч, а если delay(100) во внутрь while() перенести, как реагирует ?
void loop()
{
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
Serial.print("IR=");
Serial.print(ir);
Serial.print(" RED=");
Serial.println(red);
delay(100);
}
}
льёт в сериал как ошпаренный и почти мгновенно переполняет его буфер.Виктрыч, 14 Окт. 24, 14:36а в while() он увидел причину проблемы, вот еще скорость serial можно было бы поднять до 115200 бод
Добавлено через 2мин.:
Виктрыч, а если delay(100) во внутрь while() перенести, как реагирует ?
void loop()
{
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
Serial.print("IR=");
Serial.print(ir);
Serial.print(" RED=");
Serial.println(red);
delay(100);
}
}
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
![](https://cdn.homedistil.ru/th/1304/21/12313.161239.png)
![](https://forum.homedistiller.ru/Themes/default/images/post/wireless.gif)
При delay() внутри while данные не идут.
Volume
Доктор наук
Уфа
580 310
Отв.1311 17 Окт. 24, 08:22
Виктрыч, можешь рассказать в чем связь чипа пульсомера с темой ветки, "автоматизация наших процессов"? Или это секретный секрет?
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
![](https://cdn.homedistil.ru/th/1304/21/12313.161239.png)
![](https://forum.homedistiller.ru/Themes/default/images/post/wireless.gif)
Да не секрет. Где то озвучивал задумку. По семейным обстоятельствам приобрёл сам оксиметр и датчик поиграться. Дист в основном отгабриэливаю. Многократная на прямотоке с постоянным подрезанием голов и хвостов. Каждый финиш по кальку Руди в массах и само собой весам. Ну и контролька попугаем. Вот на него и хочу пристроить фотофиниш. Ну раз датчик уже есть и не нужно попадать ареометру в створ как у классического фотосенсора.
Маюсь от безделья.
Финиш по температуре куба или ещё чего уже проходил. Очень большая ошибка от влияния даже как датчик всунуть. Весы на порядок точнее. Вот только ещё бы калькулятор в автоматику бы зашить.
Пока гоню так: замеряю массу либо объём в кубе. Замеряю спиртуозность первой струи. И по кальку выставляю вес в банке для стопа по Руди. По свистку подхожу оточняю. Если проспал, через 50 грамм полный капут.
По ним же определяю скорость отбора. Очень прижились в моём хозяйстве.
Добавлено через 9мин.:
Пока на даче. Печку топлю ардуиной.
Длительного горения. Минимальная наверное киловатт по сравнению с калорифером.
Вот пялюсь в картинку подкручиваю ПИД. Дымовые заданы 66.Это почти на грани фола. Синее. Переключение с 80 с растопки. Бирюза заслонка. Оранж интеграл. Последнее чёрное расчётное КПД.
Добавлено через 2мин.:
В перспективе возможен рект на дровах.
Добавлено через 12дн. 5ч. 49мин.:
Следующий вопрос. Нужно организовать типа jтригера или мультивибратора. То есть включилась лампочка. По её фронту включения сработал код. Однократно. Выключилась лампочка. Тишина. Включилась лампочка - код.
Что то типа однократного действия на нажатие кнопки.
На 3 пин сигнал с лампочки.
Будет работать:?
bool flag false;
void loop() {
bool btnState = digitalRead(3);
if (btnState && !flag) {
flag = true;
Serial.println("тра-та-та и код");
}
if (!btnState && flag) {
flag = false;
//Serial.println("тишина");
}
}
Маюсь от безделья.
Финиш по температуре куба или ещё чего уже проходил. Очень большая ошибка от влияния даже как датчик всунуть. Весы на порядок точнее. Вот только ещё бы калькулятор в автоматику бы зашить.
Пока гоню так: замеряю массу либо объём в кубе. Замеряю спиртуозность первой струи. И по кальку выставляю вес в банке для стопа по Руди. По свистку подхожу оточняю. Если проспал, через 50 грамм полный капут.
По ним же определяю скорость отбора. Очень прижились в моём хозяйстве.
Добавлено через 9мин.:
Пока на даче. Печку топлю ардуиной.
Длительного горения. Минимальная наверное киловатт по сравнению с калорифером.
Вот пялюсь в картинку подкручиваю ПИД. Дымовые заданы 66.Это почти на грани фола. Синее. Переключение с 80 с растопки. Бирюза заслонка. Оранж интеграл. Последнее чёрное расчётное КПД.
Добавлено через 2мин.:
В перспективе возможен рект на дровах.
Добавлено через 12дн. 5ч. 49мин.:
Следующий вопрос. Нужно организовать типа jтригера или мультивибратора. То есть включилась лампочка. По её фронту включения сработал код. Однократно. Выключилась лампочка. Тишина. Включилась лампочка - код.
Что то типа однократного действия на нажатие кнопки.
На 3 пин сигнал с лампочки.
Будет работать:?
bool flag false;
void loop() {
bool btnState = digitalRead(3);
if (btnState && !flag) {
flag = true;
Serial.println("тра-та-та и код");
}
if (!btnState && flag) {
flag = false;
//Serial.println("тишина");
}
}