ARDUINO Попеременный вывод значений куда либо.

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
А секунды надо вводит не селектором, а input number.
тогда надо под каждый режим свой input number, тут уж надо скрипты применять)

Это же не готовое устройство
делается под готовое, чтобы залил и мог настроить под себя, не копаясь в тексте) и на будущее, если захочется что-то изменить)
сейчас все намного удобнее: температуру, яркость можно прямо с телефона корректировать)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
@ASM,
Ты не понял. Есть условно строка которая сама по себе не реадктируется. Она просто текст.
Есть список с эффектами (0,1,2,3,4,5), есть поле ввода числа (0..10), есть 2 кнопки, добавить и стереть.
При нажатии "стереть" удаляется последний эффект. При нажатии "добавить" к строке в конец дописывается выбранный эффект из списка и его время из поля ввоода.

делается под готовое
Т.е. распространяться будет не код, а бинарник ?


Обновление. Вот посмотри (скопируй и назови файл как то с расширением html)
HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Тест</title>
</head>
<body>
<div id="stroka"></div>
<select  id="effect" name="wifiname">
  <option>0</option>
  <option>2</option>
  <option>3</option>
  <option>4</option>
  <option>5</option>
  <option selected>255</option>
    
</select>
<input type="number" min="0" max="10" id="period" value="0">
<input type=button value="add" onclick="append()">
</body>
<script>
function append() {
    document.getElementById("stroka").innerHTML=document.getElementById("stroka").innerHTML+"{"+document.getElementById("effect").value+","+document.getElementById("period").value+"}"
    }
</script>
</html>
 
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
При нажатии "стереть" удаляется последний эффект. При нажатии "добавить" к строке в конец дописывается выбранный эффект из списка и его время из поля ввоода.
это понятно, делается с подключением java, пример найти не сложно)
только опять же, все значения надо будет записать в одну переменную и снова нужно будет конвертировать, замкнутый круг))
Сначала сделаю тогда чтобы через input text работало, потом буду решать с красивым оформлением.
Сейчас пока есть время и желание, что-нибудь поделаю...
Т.е. распространяться будет не код, а бинарник ?
конечно код, чтобы было меньше вопросов в теме и лс) делается максимально удобно)
если бы делал под себя, мне бы этого не требовалось) у меня все работает сейчас как мне нужно)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
нда... при щелчке добавить появляется селект с выбором режима, спинер с временем и корзинка для удадения из списка, всё просто
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Я выше на правую скорую руку накидал html - я в этом вообще не секу, так что может как то проще можно сделать, но вот так я вижу сапмое простое добавление данных. Удалять чуть сложнее. При получении данных с платы сразу передается готовая строка в нужном виде. А вот при получении в мк с формы надо сделать парсер конечно. Чуть изменив формат можно получить строку в формате json и работать с готовой библиотекой
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@Старик Похабыч, твой код сложновато будет впилить в страничку движка на портале, однако принцип тот же... Селект, спинер (это поле нумбер с двумя кнопками +-), ну и я думаю что в каждой строке надо просто сделать ещё одну кнопку для удаление строки.
@ASM, я бы вверху сделал кнопку добавить, ниже селекты и спинеры, смал буттон для удаления, а в самом низу - Кнопку сохранить
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
вот это пробуй
C++:
//Вызывать надо было так:
StrToArray(prd, c.periodDisplay,6);
что-то тут не вяжется.
Как я понимаю, prd это с формы
C++:
GP.TEXT("periodDisplay", "", arrayToStr(c.periodDisplay));
считываем переменную и записываем в переменную prd
C++:
String (prd);
portal.copyString("periodDisplay", prd);
далее идет конвертация, как пишешь
C++:
StrToArray(prd, c.periodDisplay, 6);
откуда берется c.periodDisplay для аргумента, если в нее надо записать сам результат
C++:
c.periodDisplay = StrToArray();
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
и вот набросал быстрый пример
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@ASM, я промолчу, я всё описал, ты отдаёшь указатель на c.periodDisplay, функция обращается к c.periodDisplay через указатель и всё, ВСЁ ОЧЕНЬ ПРОСТО.prd - это строка, которую ты в action достаешь из поля текст

всё, я сматываюсь из этой темы.... толку тут от меня ноль.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@DAK, как ты описал, после сохранения в форме появляются нули, а не то, что сохранили)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Код можно, вот прямо как именно ты это вызываешь и как функция написана. Потому что String (prd) меня выбило из кольи. Я уже ничему не верю.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@DAK, все так, как написал выше
C++:
StrToArray(prd, c.periodDisplay, 6);
mem2.updateNow();
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
вот так вот сделай
C++:
String prd;
prd=portal.getString("periodDisplay");
Serial.println(prd); //для отладки
Это для того, чтобы понимать что в функцию уходит не пустая строка
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
C++:
void StrToArray(const String& str,uint8_t* outArr,int length){
    String s;
    s += str;
    s += ", ";
    for (int i=0;i<length-1;i++){
        if (s.length()>2){
            outArr[i]=(s.substring(0,s.indexOf(",")-1).toInt();
Serial.print(i);
Serial.print(" - ");
Serial.println(outArr[i]);
            s=s.substring(s.indexOf(",")+1);
        } else {
            outArr[i]=255;
Serial.print(i);
Serial.print(" - ");
Serial.println(outArr[i]);
        }
    }
    outArr[length-1]=255;
Serial.print(length-1);
Serial.print(" - ");
Serial.println(outArr[i]);
}
Даже интересно
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@DAK,
C++:
Serial.println(outArr[i]); // :22 error: 'i' was not declared in this scope
заодно добавь скобку в конце 7 строки
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Поправил, скобка там не нужна
C++:
void StrToArray(const String& str,uint8_t* outArr,int length){
    String s;
    s += str;
    s += ", ";
    for (int i=0;i<length-1;i++){
        if (s.length()>2){
            outArr[i]=s.substring(0,s.indexOf(",")-1).toInt();
Serial.print(i);
Serial.print(" - ");
Serial.println(outArr[i]);
            s=s.substring(s.indexOf(",")+1);
        } else {
            outArr=255;
Serial.print(i);
Serial.print(" - ");
Serial.println(outArr[i]);
        }
    }
    outArr[length-1]=255;
Serial.print(length-1);
Serial.print(" - ");
Serial.println(outArr[length-1]);
}
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@DAK,
вот так скомпилировалось, результат будет ниже
C++:
void StrToArray(const String& str, uint8_t* outArr, int length) {
  String s;
  s += str;
  s += ", ";
  for (int i = 0; i < length - 1; i++) {
    if (s.length() > 2) {
      outArr[i] = s.substring(0, s.indexOf(",") - 1).toInt();
      Serial.print(i);
      Serial.print(" - ");
      Serial.println(outArr[i]);
      s = s.substring(s.indexOf(",") + 1);
    } else {
      outArr[i] = 255;
      Serial.print(i);
      Serial.print(" - ");
      Serial.println(outArr[i]);
    }
  }
  outArr[length - 1] = 255;
  Serial.print(length - 1);
  Serial.print(" - ");
  Serial.println(outArr[length - 1]);
}
Код:
0 - 0
1 - 0
2 - 0
3 - 0
4 - 0
5 - 255
6,2,2,2,2
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Седьмая строка,
outArr = s.substring(0, s.indexOf(",") ).toInt();
Попробуй убрать -1, чтобы получилось как выше

Мне реально уже самому интересно, должно же заработать
 
  • Лойс +1
Реакции: ASM

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@DAK,
C++:
void StrToArray(const String& str, uint8_t* outArr, int length) {
  String s;
  s += str;
  s += ", ";
  for (int i = 0; i < length - 1; i++) {
    if (s.length() > 2) {
      outArr[i] = s.substring(0, s.indexOf(",")).toInt();
      Serial.print(i);
      Serial.print(" - ");
      Serial.println(outArr[i]);
      s = s.substring(s.indexOf(",") + 1);
    } else {
      outArr[i] = 255;
      Serial.print(i);
      Serial.print(" - ");
      Serial.println(outArr[i]);
    }
  }
  outArr[length - 1] = 255;
  Serial.print(length - 1);
  Serial.print(" - ");
  Serial.println(outArr[length - 1]);
}
Код:
0 - 6
1 - 2
2 - 2
3 - 2
4 - 2
5 - 255
6,2,2,2,2
0 - 6
1 - 2
2 - 2
3 - 2
4 - 2
5 - 255
6,2,2,2,2
 
Изменено:
  • Лойс +1
Реакции: DAK

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@ASM, спасибо. надо запомнить этот substring, до - значит до невключительно...
 
  • Лойс +1
Реакции: ASM

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@DAK, благодарю за помощь и терпение)
с другой переменной тоже работает, сохраняется. как на практике работает не проверял еще)
C++:
      String prd, ord;
      portal.copyString("periodDisplay", prd);
      portal.copyString("orderDisplay", ord);
      StrToArray(prd, c.periodDisplay, 6);
      StrToArray(ord, c.orderDisplay, 6);
      mem2.updateNow();
авторство кода оставлю за тобой)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
Т.к. в массиве теперь присутствует 255, похоже надо будет добавлять в код новый режим, при переходе на 255, просто завершить...
Как наблюдаю сейчас, последний режим задерживается намного дольше. Может к выходным проверю)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
Так и получается, последний режим с влажностью длится не 2 а 6 секунд,
если удалить режим и секунды, до последний режим с давлением работает 8 секунд
попробовал добавить строки 31-32
default:
break;
не помогло)
также попробовал вывести другой режим и с 1 секундой, показывает 6 секунд
почему-то последний режим в любом случает дольше обычного.

если поставить последний режим, например часы и время 0, то этот режим также работает 8 секунд, точнее 6 секунд, далее подвисает на 2 секунды, заметно по мигающим точкам

если поставить 4 секунды с часами, то последний длится 6 + 2 секунд...
C++:
/*
   (с) Старик Похабыч, апрель, 2021 год.
*/
bool hasChange = false;
//uint8_t periodDisplay[] = {6,2,2,2,2,};      //сколько по времени выводить каждый режим, сек
//uint8_t orderDisplay[]  = {0,1,2,3,4};      //порядок вывода режимов
uint8_t mode = 0;
bool showDot = false;

void body() {
  static uint32_t ch_tmr = millis();  //статическую переменную для хранения времени выполнения текущего режима,
  //а так же выбор того, что надо выводить
  if ((millis() - ch_tmr) < (c.periodDisplay[c.orderDisplay[mode]] * 1000)) {
    switch (c.orderDisplay[mode]) {  //вывод режимов
      case 0:
        timeToStringDots();
        timeToString();
        break;
      case 1:
        TemperToString();
        break;
      case 2:
        TemperOutToString();
        break;
      case 3:
        PressToString();
        break;
      case 4:
        HumToString();
        break;
      default:
        break;
    }
  } else {
    ch_tmr = millis();
    mode++;
    if (sizeof(c.orderDisplay) == mode) mode = 0;
  }
  static uint32_t Ftiming;
  if (millis() - Ftiming > 100) {
    Ftiming = millis();
    FastLED.show();
  }
}

void TemperToString() {
  static uint32_t tmr1 = millis() - c.periodDisplay[1] * 1000;
  if (millis() - tmr1 < (c.periodDisplay[1] * 1100)) return;
  tmr1 = millis();
  hasChange = true;
  if (!hasChange) return;
  hasChange = false;
  TempToArray();
}

void TemperOutToString() {
  static uint32_t tmr1 = millis() - c.periodDisplay[2] * 1000;
  if (millis() - tmr1 < (c.periodDisplay[2] * 1100)) return;
  tmr1 = millis();
  hasChange = true;
  if (!hasChange) return;
  hasChange = false;
  TempStreetToArray();
}

void PressToString() {
  static uint32_t tmr1 = millis() - c.periodDisplay[3] * 1000;
  if (millis() - tmr1 < (c.periodDisplay[3] * 1100)) return;
  tmr1 = millis();
  hasChange = true;
  if (!hasChange) return;
  hasChange = false;
  PressToArray();
}

void HumToString() {
  static uint32_t tmr1 = millis() - c.periodDisplay[4] * 1000;
  if (millis() - tmr1 < (c.periodDisplay[4] * 1100)) return;
  tmr1 = millis();
  hasChange = true;
  if (!hasChange) return;
  hasChange = false;
  HumToArray();
}

void timeToString() {
  static uint32_t tmr1 = millis();
  if (millis() - tmr1 < 500) return;
  tmr1 = millis();
  uint32_t nt = millis() / 1000;  //получили секунды
  static int8_t old_s = 255;
  int8_t s = nt % 60;
  if (s != old_s) {
    old_s = s;
    hasChange = true;
  } else return;
  if (!hasChange) return;
  hasChange = false;
  TimeToArray();
}
static unsigned int t_sec;
void timeToStringDots() {
  static uint32_t tmr1 = millis();
  switch (c.type_sec) {
    case 1:
      t_sec = 500;
      break;
    default:
      t_sec = 1000;
      break;
  }
  if ((millis() - tmr1) < t_sec) return;
  tmr1 = millis();
  //char temp[10];
  //uint32_t nt = millis() / 1000; //получили секунды
  //static int8_t old_s = 255;
  //int8_t s = nt % 60;
  showDot = !showDot;
  hasChange = true;
  //int8_t m = nt / 60 % 60;
  //int8_t h = nt / 3600 % 24;
  if (showDot)
    Dots(Dot);
  else
    Dots(!Dot);
}