Что бы начинать писать меню надо знать где оно будет отображаться это моменты принципиальные.
Само меню и схемы адресации я сначало просто рисую на бумажке, так очень удобно.
Аппаратная платформа Arduino для автоматизации наших процессов
svarnoy
Профессор
Жуковский.
9.1K 4.6K
Отв.1280 28 Авг. 24, 16:55
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
Отв.1281 28 Авг. 24, 19:12
Отображаться на телефоне по блютузу. Аналогично монитору IDE. Во многих моих поделках нет своего дисплея и кнопок. С телефона мне удобнее послать прямое указание, чем искать пункт меню. И вывести в монитор бесконечное колличество данных. Или группу избраных. Опять же на графиках удобнее видеть динамику. И что было допустим час назад. Пользуюсь готовыми приложениями с маркета.
К примеру теплица. Отчёт раз в секунду. Переставил раз в 5 минут. Переустановил термостат с 30 на 57. Сбросил датчик углерода. Вернул отчёт раз в секунду
Из другого приложения. Сунул один из датчиков температуры подмышку(зелёное)
То есть уже сложившийся и удобный способ общения с ардуиной. Дисплеи кое где припаиваю. Но в основном без них. Если он за стенкой или в подвале как на него смотреть?
Кроме того можно вывести напоминалку команд или вызвать инструкцию. Не всё можно удержать в голове.
Добавлено через 6мин.:
А по меню. Пока путаюсь в флагах и свойствах буфера сериала. Память уже подводит. Не моё это, да и поздно. Но интересно. Затянуло.
К примеру теплица. Отчёт раз в секунду. Переставил раз в 5 минут. Переустановил термостат с 30 на 57. Сбросил датчик углерода. Вернул отчёт раз в секунду
Из другого приложения. Сунул один из датчиков температуры подмышку(зелёное)
То есть уже сложившийся и удобный способ общения с ардуиной. Дисплеи кое где припаиваю. Но в основном без них. Если он за стенкой или в подвале как на него смотреть?
Кроме того можно вывести напоминалку команд или вызвать инструкцию. Не всё можно удержать в голове.
Добавлено через 6мин.:
А по меню. Пока путаюсь в флагах и свойствах буфера сериала. Память уже подводит. Не моё это, да и поздно. Но интересно. Затянуло.
DIMA1965
Профессор
новый иерусалим
2.7K 628
Отв.1282 28 Авг. 24, 20:32
или использовать кофемашину с вайфаемdee, 28 Авг. 24, 14:42
Хорошая идея. Не жалко ее на плитку ставить?? 🤣🤣
dee
Научный сотрудник
Минск
8.2K 2.2K
Отв.1283 28 Авг. 24, 21:44
DIMA1965, на мраморную можно и поставить, а так на шкафчик удобнее )))
svarnoy
Профессор
Жуковский.
9.1K 4.6K
Отв.1284 29 Авг. 24, 07:39
Для приготовления еды надо не плитку ардуинить, а электрокастрюльку, мультиварку.
У меня лет 10 назад была редмонд, у них на то время был самый живой форум, чего там народ не готовил, в пределах штатных программ.
И пельмени сразу с корочкой, торты, и тд.
Я делал завтраки, с вечера продуктов накидаешь, утром к будильнику все горяченькое.
Надоело правда быстро.
И вот теперь хочу заардуинить аэрогриль, чтоб приходишь в гараж, а там уже крылышки хрустящие готовы.
Пиво в холодильнике холодное и без ардуины.
У меня лет 10 назад была редмонд, у них на то время был самый живой форум, чего там народ не готовил, в пределах штатных программ.
И пельмени сразу с корочкой, торты, и тд.
Я делал завтраки, с вечера продуктов накидаешь, утром к будильнику все горяченькое.
Надоело правда быстро.
И вот теперь хочу заардуинить аэрогриль, чтоб приходишь в гараж, а там уже крылышки хрустящие готовы.
Пиво в холодильнике холодное и без ардуины.
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
Отв.1285 29 Авг. 24, 08:54
Мультиварка есть. Продуманный девайс. Но только на свою кастрюлю. На квас в ней солод осахариваю в режиме подогрева. Иван чай в режиме йогурта. И потом сразу в выпечку. Очень нравиться автоматический уход в подогрев. К ней как бы вопросов нет. Тё же каши нормально варит. Были бы ещё часы, а не таймер утро расчитывать.
А с индукцией пока пауза. В этой блин динамическая клавиатура. Релюшки или оптроны нужны. Или отлавливать эту динамику. На даче только вилы. Шлифую скетч виртуально.
А с индукцией пока пауза. В этой блин динамическая клавиатура. Релюшки или оптроны нужны. Или отлавливать эту динамику. На даче только вилы. Шлифую скетч виртуально.
DIMA1965
Профессор
новый иерусалим
2.7K 628
Отв.1286 29 Авг. 24, 09:20, через 27 мин
с вечера продуктов накидаешь, утромsvarnoy, 29 Авг. 24, 07:39
И всю всю ночь они там с дикими дрожжами мокнут и киснут.
Кодите хорошо, а бизнес аналитика ( ответ на вопрос - КАК работает? И ЗАЧЕМ это нужно? ) хромает.
Добавлено через 2мин.:
а так на шкафчик удобнееdee, 28 Авг. 24, 21:44
Так скушно и уныло - куда ж ардуину то привинтить то 😜😜
svarnoy
Профессор
Жуковский.
9.1K 4.6K
Отв.1287 29 Авг. 24, 09:32, через 12 мин
И всю всю ночь они там с дикими дрожжами мокнут и киснут.DIMA1965, 29 Авг. 24, 09:20Я не про теорию говорил, про практику, в мультях прекрасно делаются завтраки к утреннему будильнику.
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
Отв.1288 29 Авг. 24, 10:47
DIMA1965, а ты зачем здесь, если всё в магазине есть? С анализируй потраченные средства и время на выхлоп.
dee
Научный сотрудник
Минск
8.2K 2.2K
Отв.1289 29 Авг. 24, 13:49
Так скушно и уныло - куда ж ардуину то привинтить то 😜😜DIMA1965, 29 Авг. 24, 09:20ардуино к шкафчику ? Мсье знает толк в автоматизации ))) вам с виктрычем по пути )))
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
Отв.1290 14 Окт. 24, 14:36
По ходу появился вопрос. Вот из примера
void loop()
{
uint16_t ir, red;
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
Serial.print("IR=");
Serial.print(ir);
Serial.print(" RED=");
Serial.println(red);
}
}
Всё работает и льёт в сериал как ошпаренный и почти мгновенно переполняет его буфер.
& , как я понял из интернета, обращение по адресу переменной допустим ir.
Как этот абзац заставить работать без while? Что бы вставить в свой код? Вывести ir и red и поработать с ними?
void loop()
{
uint16_t ir, red;
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
Serial.print("IR=");
Serial.print(ir);
Serial.print(" RED=");
Serial.println(red);
}
}
Всё работает и льёт в сериал как ошпаренный и почти мгновенно переполняет его буфер.
& , как я понял из интернета, обращение по адресу переменной допустим ir.
Как этот абзац заставить работать без while? Что бы вставить в свой код? Вывести ir и red и поработать с ними?
dee
Научный сотрудник
Минск
8.2K 2.2K
Отв.1291 14 Окт. 24, 15:41
Виктрыч, просто пропиши строку
sensor.getRawValues(&ir, &red);
она тебе обновит значение переменных "ir" и "red"
а что б не переполняло добавь
delay(100);
что не очень хорошо, я делаю вызов по программному таймеру, все остальное свободное время МК занят опросом клавиатуры
void loop() {
//Serial.println(analogRead(A1));
//обрабатывать нажатие клавиши
proces_Button(kbs, kbl, kbr, kbu, kbd); //SEL LF RT UP DW
time_now_1sec = millis() / 1000; //переменная времени для текущего хранения секунд
time_now_01sec = millis() / 200; //переменная времени для текущего хранения 1/5 секунды
if (time_01s != time_now_01sec) { // срабатывание 5 раз в секунду
process_STATE(); //обработка состояния контроллера
process_RGB(); //обработка цвета с датчика
time_01s = time_now_01sec; // запомнить текущую 1/10 секунду и не обрабатывать содержимое до изменения
}
if (time_1s != time_now_1sec) { // срабатывание 1 раз в секунду
if (cooling != 3 || cooling != 4) {
process_TEMP(); // если не форcировано охлаждение пробирки то идет обработка датчика температуры, преобразование температуры занимает около 850мс
}
process_COOLING();
process_DISPLAY();
time_1s = time_now_1sec; // запомнить текущую секунду и не обрабатывать содержимое до изменения
}
}
если очень интересно то это кусок кода для определения на самодельном ФЭК пробы Ланга с охлаждением и термостабилизированием пробирки, каждое действие вынесено в отдельную функцию, типа процесс
sensor.getRawValues(&ir, &red);
она тебе обновит значение переменных "ir" и "red"
а что б не переполняло добавь
delay(100);
что не очень хорошо, я делаю вызов по программному таймеру, все остальное свободное время МК занят опросом клавиатуры
void loop() {
//Serial.println(analogRead(A1));
//обрабатывать нажатие клавиши
proces_Button(kbs, kbl, kbr, kbu, kbd); //SEL LF RT UP DW
time_now_1sec = millis() / 1000; //переменная времени для текущего хранения секунд
time_now_01sec = millis() / 200; //переменная времени для текущего хранения 1/5 секунды
if (time_01s != time_now_01sec) { // срабатывание 5 раз в секунду
process_STATE(); //обработка состояния контроллера
process_RGB(); //обработка цвета с датчика
time_01s = time_now_01sec; // запомнить текущую 1/10 секунду и не обрабатывать содержимое до изменения
}
if (time_1s != time_now_1sec) { // срабатывание 1 раз в секунду
if (cooling != 3 || cooling != 4) {
process_TEMP(); // если не форcировано охлаждение пробирки то идет обработка датчика температуры, преобразование температуры занимает около 850мс
}
process_COOLING();
process_DISPLAY();
time_1s = time_now_1sec; // запомнить текущую секунду и не обрабатывать содержимое до изменения
}
}
если очень интересно то это кусок кода для определения на самодельном ФЭК пробы Ланга с охлаждением и термостабилизированием пробирки, каждое действие вынесено в отдельную функцию, типа процесс
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
Отв.1292 14 Окт. 24, 15:53, через 12 мин
Вроде этот вариант самый первый напрашивался. По нолям. В смысле монитор ваще ни чего не показывает. Нет обмена. Может чего и пропустил. Попробую ещё раз. Температуру из сетапа перенёс а цикл, показывает.
float temperature = sensor.retrieveTemperature();
Serial.print("temp=");
Serial.print(temperature);
Serial.println("C");
А эта фигня из while не откликается.
Буду копать дальше.
float temperature = sensor.retrieveTemperature();
Serial.print("temp=");
Serial.print(temperature);
Serial.println("C");
А эта фигня из while не откликается.
Буду копать дальше.
dee
Научный сотрудник
Минск
8.2K 2.2K
Отв.1293 14 Окт. 24, 15:54, через 1 мин
Виктрыч, пропустил
sensor.update();
что-то у тебя много начинается на sensor. моих знаний не хватает но это вроде название класса, оно должно быть уникальным а у тебя одно и для цвета и для температуры, как я понимаю по названию переменных, или у тебя и температура тоже из датчика цвета ?
sensor.update();
что-то у тебя много начинается на sensor. моих знаний не хватает но это вроде название класса, оно должно быть уникальным а у тебя одно и для цвета и для температуры, как я понимаю по названию переменных, или у тебя и температура тоже из датчика цвета ?
Volume
Доктор наук
Уфа
580 310
Отв.1294 14 Окт. 24, 18:31
стандартный вариант неблокирующего периодического вызова чего-то в ардуине обычно делают так:
#define PERIOD_MS 100
unsigned long timing; // глобальная переменная для хранения последнего времени выполнения цикла
void loop(){
if (millis() - timing > PERIOD_MS){ //код выполняется с периодом PERIOD_MS
timing = millis();
....<какой-то код>
}
}
не спора ради, просто интересно - почему используешь иной вариант, через деление?
#define PERIOD_MS 100
unsigned long timing; // глобальная переменная для хранения последнего времени выполнения цикла
void loop(){
if (millis() - timing > PERIOD_MS){ //код выполняется с периодом PERIOD_MS
timing = millis();
....<какой-то код>
}
}
не спора ради, просто интересно - почему используешь иной вариант, через деление?
...
time_now_01sec = millis() / 200; //переменная времени для текущего хранения 1/5 секунды
...
if (time_01s != time_now_01sec) { // срабатывание 5 раз в секунду
dee, 14 Окт. 24, 15:41
Виктрыч
Профессор
Екатеринбург
8.7K 2.2K
Отв.1295 14 Окт. 24, 18:45, через 15 мин
много начинается на sensor.dee, 14 Окт. 24, 15:54Это тот же сенсор. Оксиметр, про который неделю назад говорили. max30100. Так то работает в классическом режиме. Но всегда же хочется заглянуть за горизонт.
Пс. В классическом режиме с переменными пульса,кислорода и температуры проблем нет. Это всё можно кроить. А вот непосредственно с данными от цветоприемников засада. Только как показометры через монитор.
Пробовал копнуть библиотеки. Пока для меня это китайская грамота.
Добавлено через 16мин.:
Сам скетч для демонстрации работы светодиодов.
#include <Wire.h>
#include "MAX30100.h"
MAX30100 sensor;
void setup()
{
Serial.begin(115200);
Serial.print("Initializing MAX30100..");
if (!sensor.begin()) {
Serial.print("FAILED: ");
uint8_t partId = sensor.getPartId();
if (partId == 0xff) {
Serial.println("I2C error");
} else {
Serial.print("wrong part ID 0x");
Serial.print(partId, HEX);
Serial.print(" (expected: 0x");
Serial.println(EXPECTED_PART_ID, HEX);
}
// Stop here
for(;;);//ВОТ ЭТО НЕПОНЯТНО ЧТО ЗА ФИГНЯ
} else {
Serial.println("Success");
}
Serial.print("Enabling HR/SPO2 mode..");
sensor.setMode(MAX30100_MODE_SPO2_HR);
Serial.println("done.");
Serial.print("Configuring LEDs biases to 50mA..");
sensor.setLedsCurrent(MAX30100_LED_CURR_50MA, MAX30100_LED_CURR_50MA);
Serial.println("done.");
delay(1000);
Serial.print("Lowering the current to 7.6mA..");
sensor.setLedsCurrent(MAX30100_LED_CURR_7_6MA, MAX30100_LED_CURR_7_6MA);
Serial.println("done.");
delay(1000);
Serial.print("Shutting down..");
sensor.shutdown();
Serial.println("done.");
delay(1000);
Serial.print("Resuming normal operation..");
sensor.resume();
delay(500);
Serial.println("done.");
uint32_t tsTempSampStart = millis();
Serial.print("Sampling die temperature..");
sensor.startTemperatureSampling();
while(!sensor.isTemperatureReady()) {
if (millis() - tsTempSampStart > 1000) {
Serial.println("ERROR: timeout");
// Stop here
for(;;);// ОПЯТЬ ОНО
}
}
float temperature = sensor.retrieveTemperature();
Serial.print("done, temp=");
Serial.print(temperature);
Serial.println("C");
if (temperature < 5) {
Serial.println("WARNING: Temperature probe reported an odd value");
} else {
Serial.println("All test pass.");
}
Serial.println();
Serial.println("Press any key to go into sampling loop mode");
while (!Serial.available());
sensor.resetFifo();
}
void loop()
{
uint16_t ir, red;
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
Serial.print("IR=");
Serial.print(ir);
Serial.print(" RED=");
Serial.println(red);
}
}
И бесконечное while внутри фигурных скобок. Не позволяющее там поковыряться. Строчит данные с фотоприемников как из пулемёта.
dee
Научный сотрудник
Минск
8.2K 2.2K
Отв.1296 14 Окт. 24, 19:23, через 38 мин
не спора ради, просто интересно - почему используешь иной вариант, через деление?Volume, 14 Окт. 24, 18:31миллис() переполняется вроде через 4ро суток и в этот момент будет глюк а если поставить условие millis() > timer то выполнение вообще остановится, понятно что столько устройство работать не будет но как-то с предыдущих проектов осталось. Ну и четко видно сколько раз в секунду выполняется подпрограмма, время усреднения данных цветного сенсора как раз выставлено на 199мс.
Volume
Доктор наук
Уфа
580 310
Отв.1297 15 Окт. 24, 08:06
если поставить условие millis() > timer то выполнение вообще остановитсяdee, 14 Окт. 24, 19:23да, при переполнении. Грешен, попадался. Лекарство: вычислять разность текущего времени с предыдущим, при использовании unsigned она всегда корректна. Или как у тебя, делить.
dee
Научный сотрудник
Минск
8.2K 2.2K
Отв.1298 15 Окт. 24, 09:34
Volume, вычитание побыстрее будет чем деление но что-то с ним тоже было не сложилось, не помню почему, проект часов и метеостанции был лет десять назад, глюков слишком долго было ждать что бы отладить )))
Volume
Доктор наук
Уфа
580 310
Отв.1299 15 Окт. 24, 12:08
Как этот абзац заставить работать без while? ... Строчит данные с фотоприемников как из пулемёта.Виктрыч, 14 Окт. 24, 14:36так "сырые" данные и должны "сыпаться", в описании чипа "Sampling frequency set to 100Hz"
И без while работать корректно не будет - здесь проверка буфера, пока там данные есть они вычитываются в переменные ir, red. Как буфер опустел, sensor.getRawValues(&ir, &red) вернет false, выход из цикла и loop, потом loop опять вызовется, строка sensor.update(); заполнит буфер - и опять цикл будет его вычитывать