Форум РадиоКот https://radiokot.ru/forum/ |
|
Нужна помощь в адаптации кода https://radiokot.ru/forum/viewtopic.php?f=62&t=152514 |
Страница 1 из 1 |
Автор: | Batters_ghw [ Пн фев 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; } Заранее извиняюсь перед автором кода, не помню где взял ваш код, ногами прошу не бить ![]() |
Автор: | abc [ Пн фев 12, 2018 05:46:00 ] |
Заголовок сообщения: | Re: Нужна помощь в адаптации кода |
Я, конечно, извиняюсь, но с каких это пор использовать ардуину для разных (подобных) свистоперделок стало "глупо" ? |
Автор: | ARV [ Пн фев 12, 2018 06:48:17 ] |
Заголовок сообщения: | Re: Нужна помощь в адаптации кода |
abc писал(а): с каких это пор использовать ардуину для разных (подобных) свистоперделок стало "глупо" ? с момента появления STM32?
|
Автор: | Morroc [ Пн фев 12, 2018 08:09:56 ] |
Заголовок сообщения: | Re: Нужна помощь в адаптации кода |
Но вот незадача, код нужный был найден, но он написан для arduino nano, но для таких целей ее использовать просто глупо. Копейки стоит, почему бы и нет. В планах для каждой стрелки сделать тоже самое только на attiny13a, но вот как подогнать код для нее. Не хватает у меня знаний пока что для адаптации кода. Можно попробовать её тоже "заардуинить" приблизительно таким путем https://geektimes.ru/post/254970/ |
Автор: | Flasher [ Пн фев 12, 2018 10:48:22 ] |
Заголовок сообщения: | Re: Нужна помощь в адаптации кода |
При цене 2,5$ за разведенную плату с цепями тактирования, стабилизатором и мостом USB-com для отладки и заливки кода - весьма бюджетное решение. Да и скетч достаточно большой, в тини 13 не влезет. Получается, при стоимости тини 13 в 0,5$ Вы всю эту тему создали ради 2 $ ? |
Автор: | uk8amk [ Пн фев 12, 2018 12:27:42 ] |
Заголовок сообщения: | Re: Нужна помощь в адаптации кода |
Этот код бесполезно адаптировать под Tiny13. Надо просто писать с нуля с учётом возможностей микросхемы. Тогда что-то влезет. |
Автор: | oleg110592 [ Пн фев 12, 2018 12:51:00 ] |
Заголовок сообщения: | Re: Нужна помощь в адаптации кода |
отсюда? https://geektimes.ru/post/269786/ вариант выкинуть лишнее, непонятно, например накой это: Код: Serial.println(String(impulse)+" "+String(silence)); //выводим в СОМ сконвертировать в ассемблер: https://www.youtube.com/watch?v=3ZgXSqfEZiw найти согласного шамана и подшаманить получившееся под тини13 скорее всего действительно шаману проще с нуля |
Автор: | BOB51 [ Вт фев 13, 2018 14:48:00 ] |
Заголовок сообщения: | Re: Нужна помощь в адаптации кода |
Поставить аттини45/85 и светик серии ws2812. Тинька 85я вроде в какой-то миниатюрной ардуинке применяется... ![]() |
Автор: | Batters_ghw [ Чт фев 15, 2018 03:03:22 ] |
Заголовок сообщения: | Re: Нужна помощь в адаптации кода |
Поставить аттини45/85 и светик серии ws2812. Тинька 85я вроде в какой-то миниатюрной ардуинке применяется... ![]() 13 тинька тоже умеет ws2812 светиками управлять, в интернете полно схем и прошивок. Добавлено after 4 minutes 18 seconds: Всем спасибо за советы, буду использовать туже nano в связке с ws2812, только подсветка приборки будет плавно разжигаться, а стрелки менять цвет от оборотов и скорости. Позже выложу скетч, если не вылетит из усатой головы P.S. Большущий спасибмяу! |
Автор: | BOB51 [ Чт фев 15, 2018 09:12:39 ] |
Заголовок сообщения: | Re: Нужна помощь в адаптации кода |
Лучше не нану , а про-мини (там USB-COM удален - платка поменьше и более функциональна в данной задаче). ![]() |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |