Объясните по функциям
- Войдите на сайт для отправки комментариев
Сб, 23/06/2018 - 12:14
Не могу найти информацию.
Есть отличия в том где объявляется функция ?
А то где то до основного цикла пишут, где то после него.
Разница вообще есть ?
Функция должна объявлятся до её вызова.
Однако в обоих случаях работает.
Компилятор исправляет ?
Однако в обоих случаях работает.
Компилятор исправляет ?
Некоторые компиляторы, которые поумнее, находят функцию в любом месте текста. Другие не находят.
Однако в обоих случаях работает.
Компилятор исправляет ?
правильно обьявлять до первого вызова. Тот факт, что в Ардуино "сойдет и так" - это поблажки для чайников.
Это не столько поблажки, сколько потенциальный косяк, особенно если функция принимает параметром объект класса описанный в скетче... по крайней мере раньше такая "поблажка" приводила к очень неожиданным ошибкам. Не знаю, может уже поправились, но думаю "вряд ли".
Это не столько поблажки, сколько потенциальный косяк, особенно если функция принимает параметром объект класса описанный в скетче...
вероятнее всего авторы не предполагали, что "чайники" будут передавать обьекты в функции :)
ИДЕ пользуются разные люди, не обязательно "чайники". Кофейники и самовары - тоже вполне могут .. а последние и не такое выделывают.. ;)
Есть разные ругательные слова типа "препроцессор", "прекомпилятор" и т.п.
Имхо, пробежаться по всему тексту и составить (для себя) таблицу функций для последующей компиляции - вполне пристойное занятие для уважающей себя и пользователя среды программирования.
Некоторые компиляторы, которые поумнее, находят функцию в любом месте текста. Другие не находят.
Нет, Вы ошиблись. Никакие не находят. Это жёстко прописано в стандарте языка.
Компилятор исправляет ?
Не компилятор, а ардуино IDE, но не любая. В некоторых версиях такие вольности не проходят.
Однако в обоих случаях работает.
Компилятор исправляет ?
Нет, это разработчики Arduino IDE сделали "медвежью услугу" новичкам. Они добавили в IDE костыль, и перед компиляцией препроцессор переносит объявление всех функций наверх. И компилятору скармливает уже правильный код. Поначалу этого костыля в IDE не было, потом его добавили, а потом снова убрали в новых версиях...
Привикайте делать сразу правильно.
Некоторые компиляторы, которые поумнее, находят функцию в любом месте текста. Другие не находят.
Нет, Вы ошиблись. Никакие не находят. Это жёстко прописано в стандарте языка.
Ещё вопрос: в стандарте какого именно языка?
"Язык программирования устройств Ардуино основан на C/C++" - т.е. утвержденный стандарт для этого языка скорее отсутствует?
Однако в обоих случаях работает.
Компилятор исправляет ?
Нет, это разработчики Arduino IDE сделали "медвежью услугу" новичкам. Они добавили в IDE костыль, который перед компиляцией (вроде препроцессор?) переносит объявление всех функций наверх. И компилятору скармливает уже правильный код. Поначалу этого костыля в IDE не было, потом его добавили, а потом снова убрали в новых версиях...
Ну и плохо. Чем тут гордиться?
ну, плохо или хорошо - вопрос спорный, а насчёт "гордиться", а кто тут чем-то гордится? Это язык - он такой и всё тут. Например, в языке JavaScript наряду с операцией "==", есть ещё и "===", а в С++ такого нет. Это, по-Вашему, повод кому-то чем-то гордиться? Это примерно как мальчики гордятся тем, что у них, в отличие от девочек, писька есть.
"Язык программирования устройств Ардуино основан на C/C++" - т.е. утвержденный стандарт для этого языка скорее отсутствует?
Такого языка не существует в природе. Ардуино программируется на С или на С++ (в штатном IDE). А стандаты С и С++ в природе существуют. Причём объективно - т.е. независимо от того знаем мы об этом или нет.
Имхо, пробежаться по всему тексту и составить (для себя) таблицу функций для последующей компиляции - вполне пристойное занятие для уважающей себя и пользователя среды программирования.
Если бы она ещё при этом не косячила и делала синтаксически верный код ошибочным. А она, к сожалению, это делает.
Имхо, пробежаться по всему тексту и составить (для себя) таблицу функций для последующей компиляции - вполне пристойное занятие для уважающей себя и пользователя среды программирования.
Если бы она ещё при этом не косячила и делала синтаксически верный код ошибочным. А она, к сожалению, это делает.
Ну так это конкретные косяки конкретной программы, а не неприемлемая концепция.
Языков программирования и средств разработки едва ли не больше, чем конфессий. Одна из сект считает упоминанию функций в тексте программы до их описания в том же тексте смертным грехом, вписала это в свою священную книгу, адепты грозят страшными карами (см. выше). А многие другие конфессии совершенно спокойно относятся к такому стилю написания - и их программы от этого не разваливаются.
Я имхую, что текст должен быть удобен для писателя/читателя, а препроцессор на первых проходах должен его транслировать в вид, пригодный собственно компилятору.
Ну так это конкретные косяки конкретной программы, а не неприемлемая концепция.
Не совсем так. Не то чтобы некосячную версию сделать нельзя, можно, конечно. Но, малой кровью - невозможно. Некосячная версия получится размером с компилятор и даже больше. Время компиляции удвоится (если не больше).
Языков программирования и средств разработки едва ли не больше, чем конфессий.
Значительно больше. Намного.
Одна из сект считает упоминанию функций в тексте программы до их описания в том же тексте смертным грехом, вписала это в свою священную книгу, адепты грозят страшными карами (см. выше). А многие другие конфессии
А вот это совсем не так. Языки (вернее, группы языков) - это не объект веры, это научные направления и там всё определяется концепциями, заложенными в основу языка, а не субъективным желанием
Я имхую, что текст должен быть удобен для писателя/читателя, а препроцессор на первых проходах должен его транслировать в вид, пригодный собственно компилятору.
Это пожалуйста. Ради Бога. Пишите прекомпилятор. Это будет сложнее, чем написать компилятор, но это возможно. Если Вы считаете это правильным - делайте. Можете, также, создать свой язык и написать компилятор с него. Всё в Ваших руках.
Исходник должен быть изначалено удобен для компилирования, а потом уже для чтения.
Это Ваше мнение и Вы имеете право его иметь.
У меня вот - другое. Я скорее согласен с SLKH, программа должна быть в первую очередь понятна человеку.
Да, нет, обычно процедура такая:
1. сначала появляется концепция языка и рождается один-два эзотерических языка - чистая концепция. В большинстве своём такие языки остаются известными только специалистам, но крайне редко всё же вылазят на "публику" (например, Лисп, Хаскел, Питон, Рефал - это как раз языки-концепции). В какой-то мере туда же Паскаль, хотя он много потерял на этапе "выхода в свет" (см. следующий шаг).
2. иногда (весьма нечасто) таким новым языком начинает интересоваться крупная корпорация, желающая оснастить крутой новинкой свой новый суперкомпьютер или ещё чего. Вот здесь у языка появляется реальный шанс стать "общеизвестным", но тут начинает период жестоких торгов и компромиссов. Вот как раз на этом этапе (а не на первом) всплывает требование к быстрой и эффективной компиляции. Обычно маркетологи требуют выбросить из языка то, что невозможно (или трудно) эффективно скомпилировать, а заодно добавить "привычные для разработчиков средства" даже, если последние идут вразрез с концепцией языка и убивают его идею. Примеры таких уродливых компромиссов - появление goto в Паскале и исчезновение прототипного наследования в Java.
3. Бывают, конечно, и исключения. Например, очень повезло Брендону Эйху, его группе поставили задачу сделать простой язык для описания коротких сценариев и в его (его группы) работу не лезли. Не лезли, отчасти потому, что в компании не было специалистов-язычников, способных полезть. И ребята развернулись. Они сделали язык, на котором просто пишутся простые сценарии (чего и хотел заказчик), но если копнуть глубже - в языке столько всего, о чём заказчик и не подозревал, не зная таких слов :) В нём даже не одна концепция, как в эзотерических языках, а несколько. Парни впихнули в него всё, что знали и всё, что им нравилось! Именно поэтому язык называют "мультипарадигменным". То, что они тогда сделали, сегодня известно под именами: JavaScript, ECMA-Script, Action-Script и т.д. - это, на сегодняшний день, самый продвинутый ООП язык из всех имеющих хоть сколько-нибудь широкое распространение. В нём есть всё, что есть во всех этих явах и сиплюсплюсах, и многое другое, что этим языкам и не снилось. Разумеется, такой язык не мог бы появиться, если бы над разработчиками стояли маркетологи с их вечными требованиями эффективности и привычности.
Сначало все же пытаются разработать концепцию языка удобную к компиляции,
0x55 0x89 0xe5 0xe8 0xfc 0xff 0xff 0xff
0x83 0xf8 0x41 0x75 0x0d 0x68 0x00 0x00
0x55 0x89 0xe5 0xe8 0xfc 0xff 0xff 0xff
Вы не поверите, на заре моей карьеры я писал именно так (только коды были восьмиричными, а не шестнадцатеричными) для машины М-220 :))))
Я вот заявлю на "правах" ТС :-),
Намного удобнее когда функции идут после основного цикла.
Ибо они всегда проверяются отдельно и в 95% случаях не требуют отладки.
Но при этом иногда растягиваются на 100500 строк кода и тогда крайне неудобно скакать между сетапом и лупом.
Куда приятнее и проще , когда они рядом.
До сих пор не понял, почему в arduino ide нет навигатора.
В мобильной версии есть, очень удобная штука.
Ох, рано Вам такие вещи заявлять. Но я сегодня усталый, ленивый и добрый, так что нет проблем, давайте поболтаем.
Удобство вопрос привычки. А вот то, что это противоречит концепции языка С - это да. Пишите на другом языке - на том JavaScript - Вам будет удобно.
Ой! Я конечно сегодня добрый и усталый, но другим Вы такого не говорите. А то, чего доброго, все куры со смеху передохнут, из чего тогда будете омлет на завтрак делать?
Открою Вам страшный секрет, который знают только посвящённые высших степеней, только никому не говорите, что я проболтался: скетч может состоять из нескольких файлов - хоть каждую функцию в свой отдельный файл пихайте. Все файлы будут коротенькими и в каждый момент, Вы будете видеть только тот кусочек кода с котором работаете. Например, любой мой проектик для авр-ки никогда не состоит из менее, чем десятка файлов. В одном живут все опредения пинов (он у меня всегда называется Pinout.h), в другом просто пачка include'ов, которые нужны везде, так чтобы не таскать их, ну и так далее. Меньше десятка файлов никогда не получается.
Потому что, это простая бесплатная среда. Возьмите Visual Studio (даже бесплатную версию) там есть всё, что можно придумать.
Вот так и здесь. Любой человек может программировать на любом языке какой он хочет,и программы будут легко читаться, если этот человек выучит хорошо именно этот язык программирования. Понятно если человеку захочется посмотреть работу этой программы, то этот язык должен обязательно должен хорошо компилироваться.
Да? Ну-ну. А если вот так, будут программы легко читаться?
И не надо показывать тот дряной язык. После языка программирования Программирумых калькуляторов (https://forum.worldofwarships.ru/topic/54036-%D0%BF%D1%80%D0%BE%D0%B3%D1... )приведеный вами язык ясен как толковый словарь.
Или это http://mnc.ru/?path=./cpu/&file=p22.src
0x55 0x89 0xe5 0xe8 0xfc 0xff 0xff 0xff
Вы не поверите, на заре моей карьеры я писал именно так (только коды были восьмиричными, а не шестнадцатеричными) для машины М-220 :))))
почему не поверю? у меня было увлекательное программирование 4004 для болгарской счетно-фактурной машины. со стиранием ультрафиолетовой лампой.
а потом прошивка ПЗУ на 556РТ для супер-эвм на 8080 (многоплатное чудо по мотивам Радио-86, но круче), тумблерами, по одному на бит.
Прощения, что вклиниваюсь, но по теме возник злободневный вопрос: писал скетч, в нём фунукция, "теперь весь скетч" хочется в функцию - допустима ли такая "матрёшка по ним"?
Прощения, что вклиниваюсь, но по теме возник злободневный вопрос: писал скетч, в нём фунукция, "теперь весь скетч" хочется в функцию - допустима ли такая "матрёшка по ним"?
Ну и шифровка. Мне нужна деталька, которая делает ,то что мне надо. Допустимо ли эта деталька в виде одной детальки или надо куча деталек собраные в один узел.
Если вопрос ко мне, то я его не понял.
void f_1 (int k) { void f_2 (int k1) { } }Вот такая желалка.
void f_1 (int k) { void f_2 (int k1) { } }Вот такая желалка.
И?
Ему самому лень проверить :-)
Вы хотите использовать вложенные функции? Вообще-то, в языке такого нет, но GNU-расширение это поддерживает. Хотите - пользуйте. Я даже не спрашиваю, нафига Вам это надо (не моё дело), я только поинтересуюсь, а что засунуть эти две строчки в IDE, запустить и посмотреть, вместо того, чтобы вопросы задавать религия не позволила?
"И" в том смысле пробовать так или не надо потому что нельзя.
///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №3 две цифры по установке потенциометром ////////////////////////////// #include <Servo.h> // подключение библиотеки Servo Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО) Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО) Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ) int a01=70;//начальный угол int a02=75; int a03=125; int da1=15;int da2=50;//переменные задающие изменение углов int a1;//переменные хранения текущих углов поворота int a2; int a3; int r=1;//счётчик прохода программы в loop() int n=20;// единица временного интервала int j;// переменная для выбранной цифры int tablB[70]={1,1,1,1,1,1,0, 0,0,0,1,1,0,0, 1,0,1,1,0,1,1, 0,0,1,1,1,1,1, 0,1,0,1,1,0,1, 0,1,1,0,1,1,1, 1,1,1,0,1,1,1, 0,0,1,1,1,0,0, 1,1,1,1,1,1,1, 0,1,1,1,1,1,1,};//коды цифр от 0 до 9 void setup() { servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино servo2.attach(6); servo3.attach(7); servo1.write(a01);//начальная установка положения servo2.write(a02); servo3.write(a03); delay(2000); } void loop() { if (r<3)// условие числа рисуемых цифр {int tablA[12]={a01,a02, a01+da2/4,a02+da2/2, a01+da2/2,a02+da2, a01+da2/2-da1,a02+da2, a01+da2/4-da1,a02+da2/2, a01-da1,a02};//данные угловых координат точек сегментов a3=a03; j=analogRead(A0)/108;// выбор-считывание установленной на потенциометре цифры //////////////////////////////// 1 //////////////////////////////// a2=a02;a1=a01;servo2.write(a2);servo1.write(a1);delay(50*n); if (tablB[(7*j)+0]==1){f_(1);} while(a2<tablA[3]) {servo2.write(a2);a2=a2+2;a1=a1+1;servo1.write(a1);delay(n);} a1=tablA[2];a2=tablA[3]; f_(0);delay(50*n); /////////////////////////////// 2 ///////////////////////////////// if (tablB[(7*j)+1]==1){f_(1);} while(a2<tablA[5]) {servo2.write(a2);a2=a2+2;a1=a1+1;servo1.write(a1);delay(n);} a1=tablA[4];a2=tablA[5]; f_(0);delay(50*n); /////////////////////////////// 3 ///////////////////////////////// if (tablB[(7*j)+2]==1){f_(1);} while(a1>tablA[6]) {a1=a1-1;servo1.write(a1);delay(n);} a1=tablA[6]; f_(0);delay(50*n); /////////////////////////////// 4 ///////////////////////////////// if (tablB[(7*j)+3]==1){f_(1);} while(a2>tablA[9]) {servo2.write(a2);a2=a2-2;a1=a1-1;servo1.write(a1);delay(n);} a1=tablA[8];a2=tablA[9]; f_(0);delay(50*n); /////////////////////////////// 5 ///////////////////////////////// if (tablB[(7*j)+4]==1){f_(1);} while(a2>tablA[11]) {servo2.write(a2);a2=a2-2;a1=a1-1;servo1.write(a1);delay(n);} a1=tablA[10];a2=tablA[11]; f_(0);delay(50*n); /////////////////////////////// 6 ///////////////////////////////// if (tablB[(7*j)+5]==1){f_(1);} while(a1<tablA[0]) {a1=a1+1;servo1.write(a1);delay(n);} a1=tablA[0]; f_(0);delay(50*n); /////////////////////////////// (1)повтор-проход ///////////////////////////////// while(a2<tablA[3]) {servo2.write(a2);a2=a2+2;a1=a1+1;servo1.write(a1);delay(n);} a1=tablA[2];a2=tablA[3]; f_(0);delay(50*n); /////////////////////////////// 7 ///////////////////////////////// if (tablB[(7*j)+6]==1){f_(1);} while(a1>tablA[8]) {a1=a1-1;servo1.write(a1);delay(n);} a1=tablA[8]; f_(0);delay(50*n); r=r+1;a01=a01-da1-5; } } //////функция поднимания-опускания маркера (значения аргумента 0 и 1 соответственно)///// void f_(int k) { while (a3>85&&k==1) {servo3.write(a3);a3=a3-1;delay(n);}if(k==1){a3=85;} while (a3<125&&k==0) {servo3.write(a3);a3=a3+1;delay(n);}if (k==0){a3=125;} }Нет, просто балуюсь рисовалкой цифр в конической координатной сетке, "букав-переменных" много новых надо при переделке в функцию, вот и спросил на всякий случай.
Нелья - не заработает, но не взорвётся же! Попробовать - секунд десять, а Вы тут уже час ответов ждёте. Вот я и не могу понять, зачем?
Понял - нельзя... Будем искать с перламутровыми пуговицами...
Понял - нельзя...
Ну, вообще-то, в посте #36, я Вам писал, что можно, только надо GNU расширения включить (если они не включены).
Может лучше классы разучить? Квон сейчас подтянется и объяснит...
Ой,.. не знаю... не хрена я не знаю. Проще функции строки навставлять вместо f_(0) и f_(1), а потом "огород этот в забор пихать".
или классом заморочится?
Ой,.. не знаю... не хрена я не знаю. Проще функции строки навставлять вместо f_(0) и f_(1), а потом "огород этот в забор пихать".
или классом заморочится?
Это всего лишь инструменты, как пила и молоток. Но для изготовления хотя бы стола надо уметь представить какой стол вы хотите, а не просто пилить и стучать. А там далее куда кривая выведет.
ПС: Да и вашу задачу можно реализовать с помощью .... цифрового автомата. Ведь как просто было бы написать . Printer.print("0123456789"); И все заработало.
Добрался до букав со своей писалкой, гнетёт такой вопрос (в отличии от цифр) - как их задавать переменной, неужели под номерами?
///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №5 буквы алфавита ////////////////////////////// #include <Servo.h> // подключение библиотеки Servo Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО) Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО) Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ) int a=60;//начальный угол int b=75; int a03=125; int da=16;int db=50;//переменные задающие величину изменения углов int A; int B; //переменные для текущих значений углов поворота сервоприводов int a3=a03; int i;//счётчик int r=1;//счётчик числа рисуемых букв int n=15;// единица временного интервала int j=0;// переменная для выбранной буквы int tablA[18]={a, b, a+db/4, b+db/2, a+db/2, b+db, a+db/2-da, b+db, a+db/4-da, b+db/2, a-da, b, a+db/2-da/2,b+db, a+db/4-da/2,b+db/2, a-da/2, b }; // координаты узловых точек сегментов int tablB[528]={0,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0, //А// 1,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0, //Б// 1,0,0,1,0,0,1,1,0,0,1,1,1,0,0,1, //В// 1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0, //Г// 0,0,1,0,0,1,1,1,0,0,0,0,1,1,0,0, //Д// 1,0,0,1,0,0,1,1,1,0,1,1,0,0,0,0, //Е// 0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1, //Ж// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//коды сегментов-букв int K=0; void setup() { //Serial.begin(9600); servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино servo2.attach(6); servo3.attach(7); servo1.write(a);//начальная установка положения servo2.write(b); servo3.write(a03); delay(1000); } ////////////////////////////////////////////////////////////////////////////////////////////// void loop() { if (K!=1) { f_(0); //////////////////////////////// 1 //////////////////////////////// A=tablA[0];B=tablA[1]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+0]);fv_();f_(0); //////////////////////////////// 2 //////////////////////////////// A=tablA[16];B=tablA[17]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+1]);fv_();f_(0); //////////////////////////////// 3 //////////////////////////////// A=tablA[10];B=tablA[11]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+2]);fv_();f_(0); //////////////////////////////// 4 //////////////////////////////// A=tablA[2];B=tablA[3]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+3]);fv_();f_(0); //////////////////////////////// 5 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+4]);fv_();f_(0); //////////////////////////////// 6 //////////////////////////////// A=tablA[8];B=tablA[9]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+5]);fv_();f_(0); //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 7 //////////////////////////////// A=tablA[0];B=tablA[1]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+6]);fg_();f_(0); //////////////////////////////// 8 //////////////////////////////// A=tablA[16];B=tablA[17]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+7]);fg_();f_(0); //////////////////////////////// 9 //////////////////////////////// A=tablA[2];B=tablA[3]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+8]);fg_();f_(0); //////////////////////////////// 10 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+9]);fg_();f_(0); //////////////////////////////// 11 //////////////////////////////// A=tablA[4];B=tablA[5]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+10]);fg_();f_(0); //////////////////////////////// 12 //////////////////////////////// A=tablA[12];B=tablA[13]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+11]);fg_();f_(0); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 13 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+12]);fdp_();f_(0); //////////////////////////////// 14 //////////////////////////////// A=tablA[0];B=tablA[1]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+13]);fdp_();f_(0); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 15 //////////////////////////////// A=tablA[14];B=tablA[15]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+14]);fdl_();f_(0); //////////////////////////////// 16 //////////////////////////////// A=tablA[10];B=tablA[11]; servo1.write(A);servo2.write(B);delay(n); f_(tablB[16*j+15]);fdl_();f_(0); //////////////////////////////////////////////////////////////////////// K=1; } } //////функция поднимания-опускания фломастера (значения аргумента 0 и 1 соответственно)///// void f_(int k) { while (a3>85&&k==1) {servo3.write(a3);a3=a3-1;delay(n);}if(k==1){a3=85;} while (a3<125&&k==0) {servo3.write(a3);a3=a3+1;delay(n);}if (k==0){a3=125;} } //////функция рисования отрезка вертикально вверх ///// void fv_() { int K1=0; while (K1<=db/2) {servo1.write(A);servo2.write(B);B=B+2;A=A+1;K1=K1+2;delay(n);} } //////функция рисования отрезка горизонтально вправо ///// void fg_() { int K1=0; while (K1<=da/2) {servo1.write(A);A=A-1;K1=K1+1;delay(n/2);} } //////функция рисования отрезка по диагонали вправо-вверх ///// void fdp_() { int K1=0; while (K1<db/4) {K1=K1+1;B=B+1;servo2.write(B);delay(n);} servo1.write(A+db/4-da/2);delay(n); K1=0; while (K1<db/4) {K1=K1+1;B=B+1;servo2.write(B);delay(n);} } //////функция рисования отрезка по диагонали влево-вверх ///// void fdl_() { int K1=0; while (K1<3*db/16) {K1=K1+2;B=B+3;A=A+2;servo2.write(B);servo1.write(A);delay(n);} servo2.write(B);servo1.write(A);delay(n); K1=0; while (K1<3*db/16) {K1=K1+1;B=B+1;A=A+1;servo2.write(B);servo1.write(A);delay(n);} }leks, вы что хотите телеграф Шаппа сделать. http://litresp.ru/chitat/ru/%D0%A1/souchek-lyudvik/tam-gde-ne-slishno-golosa/5
Так его надо через цифровой автомат делать.
leks, вы что хотите телеграф Шаппа сделать. http://litresp.ru/chitat/ru/%D0%A1/souchek-lyudvik/tam-gde-ne-slishno-golosa/5
Так его надо через цифровой автомат делать.
Нет, программа буквы рисует по аналогии с 16-сегментным индикатором, переменной-счётчику j задаём 0, рисуем А и т.д. - это не автомат? Просто хотелось задавать русское А (наше родное) :)
Знаете, что такое таблица ASCII? Вот делайте массив размерностью в количество символов ASCII, загоняйте туда свои инструкции для механических рук и потом все просто: rukaRisui(tablB['A']). Но учитывайте то, что оперативная память у вас сразу испарится (если вы продолжите бит кодировать байтом). А так же то, что ваши родные русские буквы могут приходить в скетч как минимум в трех кодовых страницах.
Пока так получилось писать, под номерами буквы задавая в массиве третьем.
tablA[]; пришлось опустить в loop(), а иначе нет перехода на новую букву - ресурс динамической памяти резко упал, не вижу как проще сделать (как проще сделать?).
https://youtu.be/wylZenmxq4k