Помогите создать блок для штангенциркуля из скетча

Создаем свой блок. Вопросы, помощь знатоков.
Ответить
AlexandrP
Рядовой
Сообщения: 13
Зарегистрирован: 08.12.2020{, 07:02}
Репутация: 0
Откуда: Байкалово(Свердл. обл.)
Имя: Александр

Помогите создать блок для штангенциркуля из скетча

#1

Сообщение AlexandrP » 10.05.2022{, 13:24}

Посмотрел на ютубе несколько уроков по созданию блоков и всё равно ни чего не получается. Нужен блок для штангенциркуля из скетча, и чтобы в порт выводил только циферки.
СпойлерПоказать
//CyberKot (он же... я же! Shadow)
//Скетч Arduino, выводящий данные с циркуля в COM-порт
//Версия для хабра
int dataIn = 11; //шина данных, можно менять
int clockIn = 2; //шина clock, не трогать, так надо (читайте про attachInterrupt)

int isin = 0; //д=1 мм=0
int isfs = 0; //минус
int index; //счётчик битов

unsigned long xData, oData; //новые показания и старые (потом будет понятно зачем)

int ledPin = 13; //мигалка на 13й вход (встроенная, чтоб понятно было, что ничего не повисло)
int ledState = LOW; //статус мигалки
long previousMillis = 0; //когда последний раз мигали
long interval = 500; // интервал мигания

long previousGetMillis = 0;
long Timeout = 8; //таймаут чтения битов в мс

float stringOne; //временные переменные для вывода
char charBuf[5];
char charBuf2[8];

void setup(){
digitalWrite (dataIn, 1);
digitalWrite (clockIn, 1);
pinMode (dataIn, INPUT); //привязываем шину данных на dataIn
pinMode (clockIn, INPUT); //и clock на 2й вход
attachInterrupt(0,getBit,RISING); //и аттачим clock также на 2й вход

Serial.begin(9600);
delay(500);

index = 0;
xData = 0;
oData = 999;
}

void loop(){
if ((index !=0) && (millis() - previousGetMillis > Timeout) ) { //обнуление по превышению таймаута
index = 0;
xData = 0;
};

if (index >23) { //если слово считано полностью
if (oData !=xData) {
/* Этот вариант более изящен, по моему мнению, но съедает лишний килобайт
if (isin==1){ //дюймы
Serial.print("inch: ");
stringOne =xData*5/10000.00000;
stringOne *=pow(-1,isfs);
Serial.println(floatToString(charBuf2,stringOne,5,5));
}else { //мм
Serial.print("mm: ");
stringOne =xData/100.00;
stringOne *=pow(-1,isfs);
Serial.println(floatToString(charBuf,stringOne,2,5));
}; */
if (isin==1){ //дюймы
if (isfs==1){ //минус
Serial.print("inch: -");
}else {
Serial.print("inch: ");
}
stringOne =xData*5/10000.00000;
Serial.println(floatToString(charBuf2,stringOne,5,5));
}else { //мм
if (isfs==1){ //минус
Serial.print("mm: -");
}else {
Serial.print("mm: ");
}
stringOne =xData/100.00;
Serial.println(floatToString(charBuf,stringOne,2,5));
};
};
oData =xData;
index=0;
xData=0;
};

if (millis() - previousMillis > interval) { //мигалка
previousMillis = millis();
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
}
}

void getBit(){ //чтение битов и флаги
previousGetMillis=millis();
if(index < 20){
if(digitalRead(dataIn)==1){
xData|= 1<<index;
}
} else {
if (index==20) //минус
isfs=digitalRead(dataIn);

if (index==23) //дюймы
isin=digitalRead(dataIn);
};

index++;
}

//функция для безгеморойного конверта переменной типа float в строку
char * floatToString(char * outstr, double val, byte precision, byte widthp){ //буфер под результат, число, точность (после запятой), минимальная длина
char temp[16];
byte i;

//обсчёт округления
double roundingFactor = 0.5;
unsigned long mult = 1;
for (i = 0; i < precision; i++)
{
roundingFactor /= 10.0;
mult *= 10;
}

temp[0]='\0';
outstr[0]='\0';

if(val < 0.0){
strcpy(outstr,"-\0");
val = -val;
}

val += roundingFactor;

strcat(outstr, itoa(int(val),temp,10)); // целая часть
if( precision > 0) {
strcat(outstr, ".\0"); // дробная
unsigned long frac;
unsigned long mult = 1;
byte padding = precision -1;
while(precision--)
mult *=10;

if(val >= 0)
frac = (val - int(val)) * mult;
else
frac = (int(val)- val ) * mult;
unsigned long frac1 = frac;

while(frac1 /= 10)
padding--;

while(padding--)
strcat(outstr,"0\0");

strcat(outstr,itoa(frac,temp,10));
}

// пробелы (для форматирования)
if ((widthp != 0)&&(widthp >= strlen(outstr))){
byte J=0;
J = widthp - strlen(outstr);

for (i=0; i< J; i++) {
temp = ' ';
}

temp[i++] = '\0';
strcat(temp,outstr);
strcpy(outstr,temp);
}

return outstr;
}

Anydy

Помогите создать блок для штангенциркуля из скетча

#2

Сообщение Anydy » 10.05.2022{, 18:07}

Проверить не на чем....блок компилируется нормально (с мизерным изменением) ...проверяйте
Cirkle_(Code_-_Basic).ubi
(38.99 КБ) 56 скачиваний

AlexandrP
Рядовой
Сообщения: 13
Зарегистрирован: 08.12.2020{, 07:02}
Репутация: 0
Откуда: Байкалово(Свердл. обл.)
Имя: Александр

Помогите создать блок для штангенциркуля из скетча

#3

Сообщение AlexandrP » 11.05.2022{, 17:53}

Смотрю люди скачивают. У кого нибудь заработало? У меня в порт выводит "mm" и дальше тишина.

Аватара пользователя
ViktorPetrov
Лейтенант
Сообщения: 677
Зарегистрирован: 09.04.2018{, 23:56}
Репутация: 49
Имя: Виктор

Помогите создать блок для штангенциркуля из скетча

#4

Сообщение ViktorPetrov » 11.05.2022{, 18:26}

AlexandrP писал(а):
11.05.2022{, 17:53}
Смотрю люди скачивают. У кого нибудь заработало? У меня в порт выводит "mm" и дальше тишина.
Попробуйте согласовать уровни :Здесь подробней
И еще статья : Цифровой штангенциркуль 150мм ; обратите внимание :При копировании — обязательно проверьте кавычки в Serial.print — они уплыли из-за переформатирования движком сайта . На примере ( без блока) проверяли ?

AlexandrP
Рядовой
Сообщения: 13
Зарегистрирован: 08.12.2020{, 07:02}
Репутация: 0
Откуда: Байкалово(Свердл. обл.)
Имя: Александр

Помогите создать блок для штангенциркуля из скетча

#5

Сообщение AlexandrP » 11.05.2022{, 18:46}

ViktorPetrov писал(а):
11.05.2022{, 18:26}
т
Без блока всё отлично. В порт приходит и единица измерения и данные.

Аватара пользователя
ViktorPetrov
Лейтенант
Сообщения: 677
Зарегистрирован: 09.04.2018{, 23:56}
Репутация: 49
Имя: Виктор

Помогите создать блок для штангенциркуля из скетча

#6

Сообщение ViktorPetrov » 11.05.2022{, 20:11}

AlexandrP писал(а):
11.05.2022{, 18:46}
Без блока всё отлично. В порт приходит и единица измерения и данные.
Пример рабочий ,хорошо,позже можно будит присоединится (есть такой штангенциркуль ) к тестированию и редактированию блока ,а завтра надо с начало шабашки сделать.

Anydy

Помогите создать блок для штангенциркуля из скетча

#7

Сообщение Anydy » 11.05.2022{, 22:51}

AlexandrP писал(а):
11.05.2022{, 18:46}
Без блока всё отлично. В порт приходит и единица измерения и данные.
Тот код который вы привели в первом сообщении у меня не компилируется (проверял на разных IDE)
Ошибка - incompatible types in assignment of 'char' to 'char [16]' в строке 164
После изменения в строке 112 - char temp[16]; на char * temp; -- компиляция проходит успешно ...
Возможно здесь проблема....не люблю писать блоки когда не на чем отладить....
ViktorPetrov писал(а):
11.05.2022{, 18:26}
И еще статья : Цифровой штангенциркуль 150мм ; обратите внимание :При копировании — обязательно проверьте кавычки в Serial.print — они уплыли из-за переформатирования движком сайта
По вашей ссылке там в коде действительно чушь с кавычками....более 10 лет коду..хоть он примерно одинаков как у ТС ...здесь в коде вроде все в норме с кавычками

AlexandrP
Рядовой
Сообщения: 13
Зарегистрирован: 08.12.2020{, 07:02}
Репутация: 0
Откуда: Байкалово(Свердл. обл.)
Имя: Александр

Помогите создать блок для штангенциркуля из скетча

#8

Сообщение AlexandrP » 12.05.2022{, 08:12}

https://habr.com/ru/post/133088/
Отсюда код если что.

promiks111
Рядовой
Сообщения: 19
Зарегистрирован: 14.04.2018{, 18:50}
Репутация: 4
Имя: Артур

Помогите создать блок для штангенциркуля из скетча

#9

Сообщение promiks111 » 12.05.2022{, 17:54}

Делал проект для чтения показаний линейки DRO SHACHE.Они похожи. Если есть вопросы- отвечу .
Вложения
SDS00001.jpg
осцилограма сигнала линейки
SDS00001.jpg (67.58 КБ) 971 просмотр
11111.jpg
Фото DRO
DRO_S1_(Code_-_Basic).ubi
блок пользователя
(68.12 КБ) 40 скачиваний
2022-05-13_00-37-05.png
схема

AlexandrP
Рядовой
Сообщения: 13
Зарегистрирован: 08.12.2020{, 07:02}
Репутация: 0
Откуда: Байкалово(Свердл. обл.)
Имя: Александр

Помогите создать блок для штангенциркуля из скетча

#10

Сообщение AlexandrP » 14.05.2022{, 18:18}

Вот накидал блок. Компилируется, выводит данные в компорт, а выход с блока с этими данными не могу сделать. Помогите кто понимает)
Вложения
circle.flp
(53.66 КБ) 44 скачивания

AlexandrP
Рядовой
Сообщения: 13
Зарегистрирован: 08.12.2020{, 07:02}
Репутация: 0
Откуда: Байкалово(Свердл. обл.)
Имя: Александр

Помогите создать блок для штангенциркуля из скетча

#11

Сообщение AlexandrP » 15.05.2022{, 08:01}

Решил, что хотел. Огромная благодарность всем откликнувшимся. Сам маленько ступил. В скетче в порт посылается строка, а я пытался на выход сделать число.

Ответить

Вернуться в «Разработка пользовательских блоков»