Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Нужна помощь в адаптации кода

Пн фев 12, 2018 02:13:23

Решил задаться целью и сделать так, чтобы от оборотов и скорости соответствующие стрелки приборной панели, меняли цвет. Но вот незадача, код нужный был найден, но он написан для arduino nano, но для таких целей ее использовать просто глупо. В планах для каждой стрелки сделать тоже самое только на attiny13a, но вот как подогнать код для нее. Не хватает у меня знаний пока что для адаптации кода. Помогите пожалуйста необразованному в этих делах коту :))

Скетч ардуинки прикладываю
Спойлер/*
* Abramov Konstantin
* 2016
*/


int pin = 8;
long micro_prev=0; //счетчики времени
long micro_now=0;
long razn;

long impulse; //длительность +
long silence; //длительность 0

const int RED_PIN = 9; //пины ног светодиода
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;
int k;

int r; //значения для яркости диодов которые нужно устарновить
int g;
int b;
int r_current=0; //значения для яркости диодов которые установлены в настоящий момент
int g_current=0;
int b_current=0;

long obr_v_min; // оборотов в минуту
long obr_v_min_prev; // Предыдущее значение оборотов в минуту для проверки на ошибки

int error=0; //счетчик ошибок



String string;
int a=0;
volatile int state = LOW;
int first_loop=1;

void setup()
{
Serial.begin(115200);
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE );



pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);




}

void loop()
{
if(first_loop==1){ //плавно зажигаем подстветку при первом включении
int i;
for(i=0;i<255;i++){
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, i);
delay(5);
}
b_current=255;
r_current=0;
g_current=0;
delay(500);

first_loop=0;

}

}



void blink()
{

micro_now=micros(); //текущее время от запуска
razn=micro_now-micro_prev; //разница с прошлым значением
a++;

if(digitalRead(2)==LOW){ //если на пине 0, значит пишет разницу в длинну +, если нет, значит мы измерили время когда на пине ничего нет.
impulse=razn;
} else {
silence=razn;
}

if(a==2){ //если мы измерили уже два раза, то может чтонибудь делать с этими данными
Serial.println(String(impulse)+" "+String(silence)); //выводим в СОМ
obr_v_min=30000000/(impulse+silence); //считаем обороты в минуту.
a=0; //скидыаем счетчик

if((impulse>3000) && (silence>3000) && (abs(obr_v_min_prev-obr_v_min)<1000) && first_loop==0){

if(obr_v_min<800){
r=0;
g=150 ;
b=255 ;

k = go_to_color(r,g,b);
Serial.println("blue"+String(obr_v_min));
}

if(obr_v_min>=800 and obr_v_min<1300){
g=0.21*obr_v_min-18;
b=-0.51*obr_v_min+663 ;
r=0;
Serial.println("green_blue"+String(obr_v_min));
k = go_to_color(r,g,b);
}

if(obr_v_min>=1300 and obr_v_min<2500){
g=255;
b=0;
r=0;

Serial.println("green"+String(obr_v_min));
k = go_to_color(r,g,b);

}


if(obr_v_min>=2500 and obr_v_min<3000){
g=255;
b=0;
r=(-637500+255*obr_v_min)/500;

Serial.println("green_yellow"+String(obr_v_min));
k = go_to_color(r,g,b);

}



if(obr_v_min>=3000 and obr_v_min<3500){
g=(862500-245*obr_v_min)/500;
b=0;
r=255;

Serial.println("yellow"+String(obr_v_min));
k = go_to_color(r,g,b);

}



if(obr_v_min>=3500){
g=10;
b=0;
r=255;
Serial.println("red"+String(obr_v_min));
k = go_to_color(r,g,b);
}
error=0;
} else {
//если нет сигнала
if(first_loop==0){
error++;
if(error>=100){ //если больше 100 подряд идущих ошибок, то уходим в статичный цвет. При появлени данных возвращаемся в работу
k = go_to_color(0,255,255);
}
}
}

obr_v_min_prev=obr_v_min;
micro_prev=micro_now;




}
}

int go_to_color(int r, int g, int b){
a=-2;
while(r_current!=r || g_current!=g || b_current!=b) //если текущие значения не совпадают с теми котоыре нужно установить то начинаем работу
{
//Serial.println(String(r_current)+" "+String(b_current)+" "+String(g_current)+"___ "+String(r)+" "+String(b)+" "+String(g));


if(r_current>r){
r_current=r_current-1;
}
if(r_current<r){
r_current=r_current+1;
}

if(g_current>g){
g_current=g_current-1;
}
if(g_current<g){
g_current=g_current+1;
}

if(b_current>b){
b_current=b_current-1;
}
if(b_current<b){
b_current=b_current+1;
}
delay(100);

analogWrite(RED_PIN, r_current);
analogWrite(GREEN_PIN, g_current);
analogWrite(BLUE_PIN, b_current);
}




int result;

return result;
}


Заранее извиняюсь перед автором кода, не помню где взял ваш код, ногами прошу не бить 8)

Re: Нужна помощь в адаптации кода

Пн фев 12, 2018 05:46:00

Я, конечно, извиняюсь, но с каких это пор использовать ардуину для разных (подобных) свистоперделок стало "глупо" ?

Re: Нужна помощь в адаптации кода

Пн фев 12, 2018 06:48:17

abc писал(а):с каких это пор использовать ардуину для разных (подобных) свистоперделок стало "глупо" ?
с момента появления STM32?

Re: Нужна помощь в адаптации кода

Пн фев 12, 2018 08:09:56

Но вот незадача, код нужный был найден, но он написан для arduino nano, но для таких целей ее использовать просто глупо.

Копейки стоит, почему бы и нет.

В планах для каждой стрелки сделать тоже самое только на attiny13a, но вот как подогнать код для нее. Не хватает у меня знаний пока что для адаптации кода.

Можно попробовать её тоже "заардуинить" приблизительно таким путем https://geektimes.ru/post/254970/

Re: Нужна помощь в адаптации кода

Пн фев 12, 2018 10:48:22

При цене 2,5$ за разведенную плату с цепями тактирования, стабилизатором и мостом USB-com для отладки и заливки кода - весьма бюджетное решение. Да и скетч достаточно большой, в тини 13 не влезет.
Получается, при стоимости тини 13 в 0,5$ Вы всю эту тему создали ради 2 $ ?

Re: Нужна помощь в адаптации кода

Пн фев 12, 2018 12:27:42

Этот код бесполезно адаптировать под Tiny13. Надо просто писать с нуля с учётом возможностей микросхемы. Тогда что-то влезет.

Re: Нужна помощь в адаптации кода

Пн фев 12, 2018 12:51:00

отсюда?
https://geektimes.ru/post/269786/
вариант
выкинуть лишнее, непонятно, например накой это:
Код:
Serial.println(String(impulse)+" "+String(silence)); //выводим в СОМ

сконвертировать в ассемблер:
https://www.youtube.com/watch?v=3ZgXSqfEZiw
найти согласного шамана и подшаманить получившееся под тини13
скорее всего действительно шаману проще с нуля

Re: Нужна помощь в адаптации кода

Вт фев 13, 2018 14:48:00

Поставить аттини45/85 и светик серии ws2812.
Тинька 85я вроде в какой-то миниатюрной ардуинке применяется...
:roll:

Re: Нужна помощь в адаптации кода

Чт фев 15, 2018 03:03:22

Поставить аттини45/85 и светик серии ws2812.
Тинька 85я вроде в какой-то миниатюрной ардуинке применяется...
:roll:

13 тинька тоже умеет ws2812 светиками управлять, в интернете полно схем и прошивок.

Добавлено after 4 minutes 18 seconds:
Всем спасибо за советы, буду использовать туже nano в связке с ws2812, только подсветка приборки будет плавно разжигаться, а стрелки менять цвет от оборотов и скорости. Позже выложу скетч, если не вылетит из усатой головы
P.S. Большущий спасибмяу!

Re: Нужна помощь в адаптации кода

Чт фев 15, 2018 09:12:39

Лучше не нану , а про-мини (там USB-COM удален - платка поменьше и более функциональна в данной задаче).
8)
Ответить