Как выполнить 5 функций по очереди через 1 секунду с помощью millis()

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

Как выполнить 5 функций по очереди через 1 секунду с помощью millis()?

unsigned long timer;

void setup() {
  
  Serial.begin(9600);
  
}

void loop() {

 if (millis() - timer >= 1000) {
    Serial.println("Функция 1");
 }

 if (millis() - timer >= 2000) {
    Serial.println("Функция 2");
  }

 if (millis() - timer >= 3000) {
    Serial.println("Функция 3");
  timer = millis();
  }
}

Пробовал такой способ, не получается. 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
unsigned long timer;
uint8_t funk = 1;

void setup() {

  Serial.begin(9600);

}

void loop() {

  if (millis() - timer >= 1000) {
    timer = millis();
    switch (funk)
    {
      case 1:
        Serial.println("Функция 1");
        funk++;
        break;
      case 2:
        Serial.println("Функция 2");
        funk++;
        break;
      case 3:
        Serial.println("Функция 3");
        funk = 1;
        break;
    }
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

опять ленивые студенты поперли...

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

b707 пишет:

опять ленивые студенты поперли...

Да не студент уже. :)
Вроде пишешь код как можешь, программирование тяжело дается. Вот обращаюсь к Вам знающим за небольшой помощью, редко даже, пытаюсь самостоятельно, учусь как силы и время есть.

P.S. Может даже этот ответ поможет многим новичкам и не будут вопросить ;)

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

vosara, Спасибо за помощь! Уважение и здоровья тебе!

Гриша
Offline
Зарегистрирован: 27.04.2014

Nayn пишет:

Да не студент уже. :)
Вроде пишешь код как можешь, программирование тяжело дается.

так вы не на код, а на логику работы смотрите.

попробуйте переписать код, в котором будет счетчик на миллис и флаг исполнения... после каждого нового миллис меняем счетчик и ставим флаг, а после исполнения роняем флаг - таким образом событие будет выполняться только один раз. строк будет больше, за-то они будут ваши.  

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

Гриша пишет:

Nayn пишет:

Да не студент уже. :)
Вроде пишешь код как можешь, программирование тяжело дается.

так вы не на код, а на логику работы смотрите.

попробуйте переписать код, в котором будет счетчик на миллис и флаг исполнения... после каждого нового миллис меняем счетчик и ставим флаг, а после исполнения роняем флаг - таким образом событие будет выполняться только один раз. строк будет больше, за-то они будут ваши.  

Если использовать флаг, то будет выполнятся 2 действия, т.е. 2 функции вкл и выкл. Я так делал с помощью флага.
А вот чтобы выполнять цепочку функций последовательно, подсказали использовать оператор CASE.

Или можно как то использовать флаг не применяя оператор CASE.

Гриша
Offline
Зарегистрирован: 27.04.2014

Nayn пишет:

Или можно как то использовать флаг не применяя оператор CASE.

 

if (flag==1 && funk == 222)
 {
  Serial.println("Функция 222");
 flag=0;
}
Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

Гриша пишет:

Nayn пишет:

Или можно как то использовать флаг не применяя оператор CASE.

 

if (flag==1 && funk == 222)
 {
  Serial.println("Функция 222");
 flag=0;
}

Хм. Очень интересно, надо попробовать. Спасибо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Nayn пишет:

Если использовать флаг, то будет выполнятся 2 действия, т.е. 2 функции вкл и выкл. Я так делал с помощью флага.

А вот чтобы выполнять цепочку функций последовательно, подсказали использовать оператор CASE.

Или можно как то использовать флаг не применяя оператор CASE.

Сравнивать флаг и case - все равно, что сравнивать паровоз и мягкое.

По сути дела, есть такое понятие, как конечный автомат. У конечного автомата есть переменная состояния. Вот флаг - это частный случай переменной состояния, когнда имеется всего два варианта действия. Ясли действий больше, то и переменная состояния может принимать бОльшее количество значений. Например, если функций - 3, то 3 значения. А если 3 функции и "останов" - то 4 значения и т.п.

В общем, книжки надо читать. Хотя конечный автомат - достаточно простая конструкция, до которой можно додуматься самостоятельно. Ну а если не получается, - остается только читать книжки.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Nayn пишет:

Гриша пишет:

Nayn пишет:

Или можно как то использовать флаг не применяя оператор CASE.

 

if (flag==1 && funk == 222)
 {
  Serial.println("Функция 222");
 flag=0;
}

Хм. Очень интересно, надо попробовать. Спасибо.

 

я бы чуток не так написал

void setup() {
 old_millis = millis();
flag = 0;
flag_go = 0;
}

void loop() {
  if(millis() - old_millis >=1000){  flag = flag++; flag_go = 1;}

if (flag==1 && flag_go) {
  Serial.println("Функция 1");
old_millis = millis();
flag_go = 0;
}

if (flag==2  && flag_go) {
  Serial.println("Функция 2");
old_millis = millis();
flag_go = 0;
}
.
.
.
}

 

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

Немного покумекал, вот так получилось, может быть так себе код, но работает.



int flag = 1;
int flag_go = 0;
unsigned long old_millis;

void setup() {
  
Serial.begin(9600);

}

void loop() {
  if(millis() - old_millis >=1000){  flag = flag++; flag_go = 1;}

if (flag==1 && flag_go) {
  Serial.println("Функция 1");
  Serial.print("Флаг ");
  Serial.println(flag);
old_millis = millis();
flag_go = 0;
flag++;
}

if (flag==2  && flag_go) {
  Serial.println("Функция 2");
  Serial.print("Флаг ");
  Serial.println(flag);
old_millis = millis();
flag_go = 0;
flag++;
}

if (flag==3  && flag_go) {
  Serial.println("Функция 3");
  Serial.print("Флаг ");  
  Serial.println(flag);
old_millis = millis();
flag_go = 0;
flag = 1;
}
}

Если нужно остановить цикл, в конце Функции 3 flag = 0;

ua6em, Спасибо, немного дописал код, изначально не работал. :)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Если интервел везде 1 сек, то можно и так:

uint32_t timer;
int counter;
boolean flag;
void setup(){
				
}

void loop(){
				if(millis()-timer>=1000){
								timer=millis();
								counter++;
								flag=1;
				}
			if	(flag){
				switch(counter){
								case 1:
								func_1();
								break;
												case 2:
												func_2();
												break;
								//и тд					
				}
								flag=0;
								if(counter>=MAX){counter=0;}//если нужно повторить
				}
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:

Если интервел везде 1 сек, то можно и так:

uint32_t timer;
int counter;
boolean flag;
void setup(){
				
}

void loop(){
				if(millis()-timer>=1000){
								timer=millis();
								counter++;
								flag=1;
				}
			if	(flag){
				switch(counter){
								case 1:
								func_1();
								break;
												case 2:
												func_2();
												break;
								//и тд					
				}
								flag=0;
								if(counter>=MAX){counter=0;}//если нужно повторить
				}
}

 

так не пойдёт, мы не знаем время выполнения фунций, присваивать значение миллис надо после выполнения функции

Гриша
Offline
Зарегистрирован: 27.04.2014

пост 11 строка 18, 27, 36 - зачем? чтобы строк было больше? эти строки прикрасно ложатся в таймер т.к. он равномерный, в посте 10 просто пример, а вы даже не обдумали его. подумайте, что нужно дописать в строку 12 (пост11)? 

на кой строки 20 и 29? что они делают? и как работает таймер который в строке 12 ? блин - элементарные вещи на уровне логики... включайте ее уже. Там от программирования ничего нет... Вы по английски читать умеете? так прочитайте и вникните - там почти сочинение, а не код

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ua6em пишет:

Kakmyc пишет:

Если интервел везде 1 сек, то можно и так:

uint32_t timer;
int counter;
boolean flag;
void setup(){
				
}

void loop(){
				if(millis()-timer>=1000){
								timer=millis();
								counter++;
								flag=1;
				}
			if	(flag){
				switch(counter){
								case 1:
								func_1();
								break;
												case 2:
												func_2();
												break;
								//и тд					
				}
								flag=0;
								if(counter>=MAX){counter=0;}//если нужно повторить
				}
}

 

так не пойдёт, мы не знаем время выполнения фунций, присваивать значение миллис надо после выполнения функции

Мой код вообще не про это.
Таймер можно где угодно сбрасывать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
ua6em пишет:

Kakmyc пишет:

Если интервел везде 1 сек, то можно и так:

uint32_t timer;
int counter;
boolean flag;
void setup(){
				
}

void loop(){
				if(millis()-timer>=1000){
								timer=millis();
								counter++;
								flag=1;
				}
			if	(flag){
				switch(counter){
								case 1:
								func_1();
								break;
												case 2:
												func_2();
												break;
								//и тд					
				}
								flag=0;
								if(counter>=MAX){counter=0;}//если нужно повторить
				}
}

 

так не пойдёт, мы не знаем время выполнения фунций, присваивать значение миллис надо после выполнения функции

Мой код вообще не про это. Таймер можно где угодно сбрасывать.

твой код вообще лаконичней, перечитал 1-й пост ( через 1 секунду...) и дальше без уточнений, в твоём примере, тактирование по переднему фронту, функций, если сбрасывать таймер в теле функции, после её окончания, то по заднему фронту, а как надо??? ТС, тебе как надо-то?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

У нас С++ или что? Классы надо использовать! Классы!

 



class PeriodicRun
{
  public:
    PeriodicRun(uint32_t startDelay, uint32_t period, void (*func)(void )):
      mDelay(startDelay), mPeriod(period), mFunc(func)
    {
      mLastMillis = millis();
      if (startDelay == 0) mDelay = 0xFFFFFFFF;
    };
    void doPeriodic()
    {
      uint32_t currentT = millis();
      if (mDelay) {
        if ((mDelay != 0xFFFFFFFF) && (currentT - mLastMillis) < mDelay) return;
        mDelay = 0;
      }
      else if ((currentT - mLastMillis) < mPeriod) return;
      mLastMillis = currentT;
      mFunc();
    }
  private:
    uint32_t  mDelay;
    uint32_t  mPeriod;
    uint32_t  mLastMillis;
    void (*mFunc)(void);
};

void Func1()
{
  Serial.println("F_1");
}
void Func2()
{
  Serial.println("F_2");
}
void Func3()
{
  Serial.println("F_3");
}

PeriodicRun p1(0, 3000, *Func1);
PeriodicRun p2(1000, 3000, *Func2);
PeriodicRun p3(2000, 3000, *Func3);

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
}

void loop() {
  p1.doPeriodic();
  p2.doPeriodic();
  p3.doPeriodic();


}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Поосторожнее, господа. На классах Квон гешефт делает, а он - страшный человек.

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

До супер кода конечно не дорос, как написал asam в 17 посте. Вот простенький долепил для новичков самое то, с возможностью отключения выполнения всех функций, количество функций и функция зацикливания.

//Включить или выключить выполнение функций
int flag = 1;
//Флаг счетчик
int flag_go = 0;
//Количество функций
int func = 3;
//Зациклить или выполнить 1 раз
int cicle = 1;

unsigned long old_millis;

void setup() {
  Serial.begin(9600);
}

void shag() {
  flag++;
  flag_go = 0;
  }

void loop() {

  if(millis() - old_millis >=1000) {  
    old_millis = millis();
    
  if(flag > func) { flag = cicle; }  
    flag_go = 1;
    flag = flag++; 
  }

  if (flag==1 && flag_go) {
    Serial.println("Функция 1");
    shag();
  }

  if (flag==2  && flag_go) {
    Serial.println("Функция 2");
    shag();
  }

  if (flag==3  && flag_go) {
    Serial.println("Функция 3");
    shag();
  }
    
}

 

b707
Offline
Зарегистрирован: 26.05.2017

ну размахались. Чем короче тем лучше.

Предлагаю сократить код Кактуса - нафига у него две переменные, flag и counter, хватит и одной

uint32_t timer;
int counter=0;
void setup(){}

void loop(){
if(millis()-timer>=1000){
	timer=millis();
	counter++;
	switch(counter){
		case 1:
		func_1();
		break;

		case 2:
		func_2();
		break;

               case 3:
		func_3();
		break;
								
	}
}
}

УПС, сорри... получился код Восары из первого ответа :)

и чего вам всем не хватает в нем?

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

b707 пишет:

ну размахались. Чем короче тем лучше.

Предлагаю сократить код Кактуса - нафига у него две переменные, flag и counter, хватит и одной

uint32_t timer;
int counter=0;
void setup(){}

void loop(){
if(millis()-timer>=1000){
	timer=millis();
	counter++;
	switch(counter){
		case 1:
		func_1();
		break;

		case 2:
		func_2();
		break;

               case 3:
		func_3();
		break;
								
	}
}
}

УПС, сорри... получился код Восары из первого ответа :)

и чего вам всем не хватает в нем?

В том что этот не цикличный :)

b707
Offline
Зарегистрирован: 26.05.2017

Nayn пишет:

В том что он не цикличный :)

какая же вам нужна цикличность? После выполнения третьей функции снова первую и так по кругу?? добавьте одну строчку - будет "цикличный"

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

b707 пишет:

Nayn пишет:

В том что он не цикличный :)

какая же вам нужна цикличность? После выполнения третьей функции снова первую и так по кругу?? добавьте одну строчку - будет "цикличный"

Типа того, все правильно. Просто убрал этот код у Kakmyc дабы сократить. :) Ладно, все пучком и так много вариантов, думаю тут уже все настолько изжевано, что можно выбрать 3 варианта выполнений функций.

Гриша
Offline
Зарегистрирован: 27.04.2014

Nayn пишет:

 Ладно, все пучком и так много вариантов, думаю тут уже все настолько изжевано, что можно выбрать 3 варианта выполнений функций.

не все изжевано, delay забыли запретить использовать :))))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Поосторожнее, господа. На классах Квон гешефт делает, а он - страшный человек.

делает, то он делает, но я тут с его кнопкой день просидел как дурак, оказалось переменную текущей миллис Квон вынес за пределы класса, перетаскивал из рабочей программы и, потерял эту часть кода, ужо думал, что пины палёные, стал смотреть библиотеку Гайвера для работы с кнопками, да это же просто эталон!!!  )))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ua6em пишет:

sadman41 пишет:
Поосторожнее, господа. На классах Квон гешефт делает, а он - страшный человек.

делает, то он делает, но я тут с его кнопкой день просидел как дурак, оказалось переменную текущей миллис Квон вынес за пределы класса, перетаскивал из рабочей программы и, потерял эту часть кода, ужо думал, что пины палёные, стал смотреть библиотеку Гайвера для работы с кнопками, да это же просто эталон!!!  )))

У вас все проекты на мега2560 ?
Откуда столько место под эти комбайны кнопочные ?
Мне трёх месяцев хватило, для разработки именно того функционала, чтоо мне требуется.
750 байт флеша на конструктор и функции, плюс по 8 байт ОЗУ на каждый экземпляр.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Да, я просто в афуе, от таких баранойдов.
Решил проверить на жадность обработчик водопроводчика, ппц там даже примеры не компилируются.

Это вообще как ?
Открываешь из IDE примеры библиотек, в итоге компилятор не видит файл *.h

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Kakmyc][quote=ua6em пишет:

Мне трёх месяцев хватило, для разработки именно того функционала, чтоо мне требуется. 750 байт флеша на конструктор и функции, плюс по 8 байт ОЗУ на каждый экземпляр.

8 Байт на кнопку? За 3 месяца можно было бы и оптимизировать.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

asam] </p> <p>[quote=Kakmyc пишет:
ua6em пишет:

Мне трёх месяцев хватило, для разработки именно того функционала, чтоо мне требуется. 750 байт флеша на конструктор и функции, плюс по 8 байт ОЗУ на каждый экземпляр.

8 Байт на кнопку? За 3 месяца можно было бы и оптимизировать.

Попробуй.
Отслеживание длинного/короткого нажатий с любым количеством мультикликов. Хоть дабл, хоть трипл, хоть двадцатипятирипл.
Даже наверное наврал, не 8, а 13-15 байт на экземпляр, точно не помню.

Green
Offline
Зарегистрирован: 01.10.2015

Kakmyc пишет:
Отслеживание длинного/короткого нажатий с любым количеством мультикликов. Хоть дабл, хоть трипл, хоть двадцатипятирипл. Даже наверное наврал, не 8, а 13-15 байт на экземпляр, точно не помню.

А морзе нету?

MaksVV
Offline
Зарегистрирован: 06.08.2015

А че титановые велосипеды уже не в тренде?

Green
Offline
Зарегистрирован: 01.10.2015

Нет, в тренде давным-давно карбоновые.

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

А мне вот Atmega328P не хватает памяти для кучи тоновых мелодий (tone), типа плеера, много они жрут памяти. Либо переходить на Atmega2560 или искать альтернативу с отдельной памятью, только не знаю можно ли читать (tone) из внешней памяти и какой.

b707
Offline
Зарегистрирован: 26.05.2017

Nayn пишет:

А мне вот Atmega328P не хватает памяти для кучи тоновых мелодий (tone), типа плеера, много они жрут памяти.

А вы их в какой памяти храните - в той что 2К или в той что 32К байта?

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

b707 пишет:

Nayn пишет:

А мне вот Atmega328P не хватает памяти для кучи тоновых мелодий (tone), типа плеера, много они жрут памяти.

А вы их в какой памяти храните - в той что 2К или в той что 32К байта?

Я пробовал в обоих памяти, в памяти для переменных - не хватает и в памяти флэшь, тоже забивается под завязку, слишком много строк уходит под тоновые мелодии, все мелодии как полноценная музыка, вот поэтому не хватает памяти на устройстве. Либо использовать мид файл на внешней памяти и проигрывать с нее как вариант, но хотелось бы чтобы играло по строкам tone, можно чтобы читал из текстового файла строки (tone).

b707
Offline
Зарегистрирован: 26.05.2017

Nayn пишет:

все мелодии как полноценная музыка

Это на tone() у вас полноценная музыка? интересно было бы код посмотреть... заодно и посмотрим, как вы строки храните

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

b707 пишет:

Nayn пишет:

все мелодии как полноценная музыка

Это на tone() у вас полноценная музыка? интересно было бы код посмотреть... заодно и посмотрим, как вы строки храните

Такой вариант пишет в память для переменных

#include "pitches.h"

int notes[] = {
NOTE_G4, NOTE_R, NOTE_E4, NOTE_R, NOTE_G4, NOTE_R, NOTE_E4, NOTE_B4, NOTE_R }

int times[] = {
137, 137, 137, 137, 137, 137, 137, 137, 137 }

void loop() {

тут цикл проигрывания нот
}

либо такой вариант, пишет в флэшь память

void mario() {
    tone(tonePin, 146, 112.5);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    delay(125.0);
    tone(tonePin, 391, 112.5);
    delay(125.0);
    delay(375.0);
    tone(tonePin, 195, 112.5);
    delay(125.0);
 noTone(tonePin);
}

void setup() {
mario() ;

}

В каждом варианте более 1500 тоновых строк для полноценной 1й мелодий, а этих к примеру мелодий 5 штук точно не влезет на Atmega328 :)

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

а с PROGMEM то же не влезает ?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Nayn пишет:

В каждом варианте более 1500 тоновых строк для полноценной 1й мелодий, а этих к примеру мелодий 5 штук точно не влезет на Atmega328 :)

Легко влезет.
Достаточно хранить передаваемые параметры из массива, а массив спрятать в PROGMEM

b707
Offline
Зарегистрирован: 26.05.2017

Nayn пишет:

либо такой вариант, пишет в флэшь память

void mario() {
    tone(tonePin, 146, 112.5);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    delay(125.0);
    tone(tonePin, 391, 112.5);
    delay(125.0);
    delay(375.0);
    tone(tonePin, 195, 112.5);
    delay(125.0);
 noTone(tonePin);
}

void setup() {
mario() ;

}

этот вариант ничего общего с записью во флеш не имеет.

Кроме того, параметры функций delay() и tone()  - целые числа, поэтому запись типа delay(125.0); - это бредятина

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

b707 пишет:

Nayn пишет:

либо такой вариант, пишет в флэшь память

void mario() {
    tone(tonePin, 146, 112.5);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    tone(tonePin, 146, 112.5);
    delay(125.0);
    delay(125.0);
    tone(tonePin, 391, 112.5);
    delay(125.0);
    delay(375.0);
    tone(tonePin, 195, 112.5);
    delay(125.0);
 noTone(tonePin);
}

void setup() {
mario() ;

}

этот вариант ничего общего с записью во флеш не имеет.

Кроме того, параметры функций delay() и tone()  - целые числа, поэтому запись типа delay(125.0); - это бредятина

delay(125.0); Это пауза между нотами, почему бредятина? Не я же разработал такую работу tone :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Nayn пишет:

В каждом варианте более 1500 тоновых строк для полноценной 1й мелодий, а этих к примеру мелодий 5 штук точно не влезет на Atmega328 :)

Считаем:

на ноту - 1 байт,

на длительность - 1 байт,

итого - 2 байта.

1500 тоновых сток - 3000 байтов.

5 мелодий - 15000 байтов ака 14.65 кБайт, что явно меньше 32 кБайт.

Что-то у Вас не в порядке с арифметикой.

 

PS. Разбор MIDI файла на Ардуино - то еще удовольствие. Если типа 0, то еще можно, а если типа 1 (а таких большинство), то без внешней памяти - проблематично.

b707
Offline
Зарегистрирован: 26.05.2017

Nayn пишет:

delay(125.0); Это пауза между нотами, почему бредятина? Не я же разработал такую работу tone :)

с точки зрения программирования - бред, потому что делеи могут быть только целыми.

Но главное - изучите все-таки. что такое PROGMEM и как на самом деле эффективно хранить данные во флеш. Думаю, у вас все в памяти поместится со свистом...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Nayn пишет:

delay(125.0); Это пауза между нотами, почему бредятина? Не я же разработал такую работу tone :)

Потому что - бредятина.

Внимательно перечитайте описание tone.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Nayn пишет:

delay(125.0); Это пауза между нотами, почему бредятина? Не я же разработал такую работу tone :)

Потому, что эти значения должны иметь другой тип данных.

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

andriano пишет:

Nayn пишет:

В каждом варианте более 1500 тоновых строк для полноценной 1й мелодий, а этих к примеру мелодий 5 штук точно не влезет на Atmega328 :)

Считаем:

на ноту - 1 байт,

на длительность - 1 байт,

итого - 2 байта.

1500 тоновых сток - 3000 байтов.

5 мелодий - 15000 байтов ака 14.65 кБайт, что явно меньше 32 кБайт.

Что-то у Вас не в порядке с арифметикой.

 

PS. Разбор MIDI файла на Ардуино - то еще удовольствие. Если типа 0, то еще можно, а если типа 1 (а таких большинство), то без внешней памяти - проблематично.

andriano, вот вот и я думаю как же может влезть. Все верно, при компиляции объем памяти показывает сколько занимают ноты и ардуино иде об этом пищит :)

b707
Offline
Зарегистрирован: 26.05.2017

Nayn пишет:

andriano пишет:

5 мелодий - 15000 байтов ака 14.65 кБайт, что явно меньше 32 кБайт.

andriano, вот вот и я думаю как же может влезть.

выше все подсчитано вроде? Или не можете сравнить 15К и 32 ?

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

b707 пишет:

Nayn пишет:

andriano пишет:

5 мелодий - 15000 байтов ака 14.65 кБайт, что явно меньше 32 кБайт.

andriano, вот вот и я думаю как же может влезть.

выше все подсчитано вроде? Или не можете сравнить 15К и 32 ?

Забыл еще сказать, про дополнительный код типа плеера и управления устройством и переключения мелодий, он тоже весит примерно 20к. 20к +15к =35к :) Вот и от сюда не хватает места. Да мало этого места, мало!

b707
Offline
Зарегистрирован: 26.05.2017

Nayn, не торопитесь отвечать на каждое сообщение , вы так пишете откровенную ерунду, лишь бы написать. Думайте немного, прежде чем ответить.

 

b707
Offline
Зарегистрирован: 26.05.2017

Nayn пишет:

Забыл еще сказать, про дополнительный код типа плеера и управления устройством и переключения мелодий, он тоже весит примерно 20к. 20к +15к =35к :) Вот и от сюда не хватает места. Да мало этого места, мало!

а это уже откровенное вранье пошло....