Дубликаты не найдены

+21
https://yadi.sk/d/k15rVZnDg7vxM
раскрыть ветку 5
+18
помогу коллеге програмисту
https://yadi.sk/d/k15rVZnDg7vxM
раскрыть ветку 2
+10
ллгс
0
Ссылку пришлось заменить.

#comment_45310611
+4
Допили побольше шаблонов плз. :)
З.Ы.
И лови плюсик
0
Вот, как и обещал картинки из программы теперь успешно выкладываются на Пикабу.
Ссылку пришлось заменить.

https://yadi.sk/d/lo6G3I0Gg8pC9
+13
кто-то забыл из дебага в релиз перевести
раскрыть ветку 9
-3
по-моему так лучше.
кто захочет, может доработать на свой вкус))
раскрыть ветку 2
+3
лолшто?
раскрыть ветку 1
-4
кто-то еще пишет на Делфяночке...
раскрыть ветку 5
+1
С добавлением кроссплатформенности появилось n-ное кол-во годных приложений, например системы видеонаблюдения, работа с картами, с базами данных все хорошо, работают быстро, однако беда с созданием компонентов, теперь нужно учитывать платформозависимость. Еще бы слоям добавить аналог свойства weight и развить и упростить FireDAC для работы с удаленными базами данных и будет все шикарно, имхо.
раскрыть ветку 4
+8
ллгс
+6
Для тех у кого мак.
Иллюстрация к комментарию
+4
Еще надо картинку которая покадровая, там мужик с бородой справа и пацан в ковбойской шляпе
и пацан на что то жалуется
а мужик говорит что раньше было хуже и жили или чето типо того
раскрыть ветку 2
+1
)
0
Это из сериала. Про деда Валентины.
+3
Уже давно существуют онлайн сервисы.
раскрыть ветку 5
+1
Да, уже знаю, но это делалось в большей степени для себя.
раскрыть ветку 4
0
а просто оставить на рабочем столе папку с проектами фш нельзя? открыл - текст - сохранил - выложил...
раскрыть ветку 3
+2
risovach точка ru/generator/kto-skazal_1074743
раскрыть ветку 1
+2
ого, тут есть знатоки мертвых языков! O_O
+1
добавь возможность выбора шрифтов) Желательно Compact, Impact и a_MachinaOrto. Они очень часто используются в мемах. Прост, другие сервисы оставляют на картинке свои ватермарки и получается не очень)
раскрыть ветку 1
+1
Спасибо, обязательно добавлю)
+1
Made же,не?
раскрыть ветку 9
+5
В оригинале просто "maked"
Иллюстрация к комментарию
раскрыть ветку 8
-2
это органы? что вообще на этом комиксе за персонажи? для понимания ситуации
раскрыть ветку 4
-5
что означает лишь неправильность оригинала, не более
раскрыть ветку 2
ещё комментарии
+1
Приложение пользует Winapi WinSock2 т.е. потенциально может работать с сетью... так что поаккуратнее.
0
@c..
0
Могу показаться мудаком, но я думаю, что не стоит выкладывать в общий доступ приложение, которое ляпается за такое время в рад студии.
Думаю все с этого начинали... но я думаю, пока нет достаточных успехов хотя бы в разметке... стоит придержать пока это у себя. И продолжать совершенствоваться.

А так – удачи в освоении дельфинов :)
раскрыть ветку 4
+4
Спасибо.
Я согласен, просто хотелось поделится результатом.
раскрыть ветку 3
+1
Ничего страшного :)
Я своей первой программой на дельфях пользуюсь по сей день (клиент для собственного файлообменника с поддержкой скриншотов)
Иллюстрация к комментарию
раскрыть ветку 1
0
было б круто если мой любимый добавил
#comment_42882499
только нужно чтобы можно было менять цветовую гамму и отражать картинку зеркально
это уже посложнее тех двух
0
Решил протестировать - картинка не выкладывается на пикабу
раскрыть ветку 4
0
А вот это странно, вроде же обычный jpeg..
раскрыть ветку 3
0
Миниатюрку видно, а когда заливается - ошибка.
Может лучше png?
раскрыть ветку 2
0
что за версия делфи?, последний раз запускал delphi NET )))
раскрыть ветку 5
+1
Судя по иконке приложения — это Rad Studio XE и выше. Файл удалён с файлообменника, так что невозможно определить размеры дебаг-версии и назвать версию более точно.
раскрыть ветку 4
+1
Спасибо
+1
#comment_45310611

И да, это XE6.
раскрыть ветку 2
0
Есть намного круче идея, пишется плагин под chrome для пикабу, который даёт возможность прямо в комментарии генерировать мем с нужным текстом
0
я очень извиняюсь что не к месту тут пишу, но.
есть ли те, кто могут помочь в написании поисковой системы в Delphi?
-1
Есть океан онлайн сервисов на мемы всех сортов.
-1
скачал, запустил - потерял все данные с компа
-1
Простите, что на Пикабу не выкладываются картинки, завтра обещаю исправить.
-1
почему сохраняет в jpg, когда это bmp <_<
Иллюстрация к комментарию
-1
плюс данной проги будет в том, что на онлайн генераторах мемов куча мусора в виде не нужных картинок, а сюда автор зальет только интересующие его, еще бы добавить в программу добавление шаблонов
-2
Отчет вирустотал приложил бы...
раскрыть ветку 1
0
Яндекс же проверяет Dr.Web'ом
-2
Т.е. 100500 сайтов, с готовыми шаблонами и возможностью редактирования текста, который выравнивается автоматически, вас не устраивает?
-3
мэме генератор не в счет нынче Я?
раскрыть ветку 1
+5
Какие генераторы?)
Иллюстрация к комментарию
-4
мэйк - мэйд - мэйд, мазафака!
раскрыть ветку 3
+2
-2
мейк-мейкед-мейден.
раскрыть ветку 1
+1
айрон мейден!
-4
made, блять!
раскрыть ветку 1
+1
Похожие посты
953

Delphi - 25 лет

Надо же, уже 25 лет прошло с тех пор, как появился Delphi.

Уже никто и не помнит, что тогда ни одна СУБД не содержала толкового языка программирования. И еще не существовало средств быстрой разработки пользовательского интерфейса. Т.е. те окошки, которые сейчас программист может нарисовать за 5 минут, требовали нескольких часов (а то и дней) программирования.

А еще - все ждали появления толкового средства разработки для Windows.

И вот - появился Delphi. Для Windows. C обновленным Паскалем. C фантастическими на тот момент возможностями по разработке интерфейса. С фантастически удобной средой.

И с возможностью работать с базами данных. Практически любыми! Что тогда тоже было почти фантастикой.

Само название - Delphi - намекало на то, что даже для самой мощной на тот момент СУБД - Oracle - это средство позволит построить всю нужную инфраструктуру. Как Дельфы вокруг Дельфийского оракула.

И сколько программистов перешло тогда с С и С++ на Delphi, вы бы видели!

Хочется сказать за это спасибо Филиппу Кану, основавшему Borland и выпустившему этот продукт.

Delphi - 25 лет Программирование, Delphi, Net
112

Вторая жизнь старому стрелочному мультиметру

Бывает, что у радиолюбителей есть старый стрелочный мультиметр советских времен, лежит где-то далеко на полке. По прямому назначению его уже использовать не хочется, а выкинуть жалко. Так и лежит. В этой статье мы сделаем его модернизацию, а именно – добавим USB, для возможности анализа данных и построения графиков.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Из курса школьной физики вспоминаем принцип работы такого измерительного прибора – ток течет по обмотке, находящейся в магнитном поле, пытается покрутиться и отклоняет стрелку. Первым делом вскрываем мультиметр и смотрим на подключение стрелки.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

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

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Выбираем провод с более резким наклоном прямой. В моем случае получилось что при максимальном отклонении стрелки напряжение равно 96,4 мВ. Для оцифровки микроконтроллером мало, но ничего страшного, это напряжение можно усилить операционным усилителем. Подойдет любой ОУ, я взял LM2904, просто потому что у меня такой был. Смотрим документ на микросхему – два ОУ в одном корпусе, максимальное выходное напряжение Vcc-1.5v. Запитывать будем от 3.3 вольт, значит надо подобрать коэффициенты усиления так, чтобы при зашкаливающей стрелке ОУ выдавал максимально возможное напряжение.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Готово. Первый каскад усиливает напряжение со стрелки мультиметра в 10 раз, второй каскад усиливает выход первого в зависимости от настройки потенциометра. Для тестов я собрал все на старом кусочке текстолита.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Проверяем напряжение на выходе усилителя при разных положениях стрелки. Нужно настроить так, чтобы когда стрелка зашкаливает, напряжение продолжало увеличиваться пока она не упрется в ограничитель хода. Теперь это напряжение надо оцифровать. Я взял китайскую платку с STM, купленную на Али.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

На борту у нее микроконтроллер STM32F103C8T6. Есть АЦП и USB. Подходит. Для первоначальной настройки предлагаю воспользоваться STM32CubeMX. Включаем тактирование, настраиваем кварцевые резонаторы.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Включаем и настраиваем АЦП, не забываем про прерывание по готовности.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

АЦП будет запускаться по событию таймера, настраиваем таймер.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Таймер тактируется частотой 48 МГц, с предделителем 24 и периодом 2000 получится, что он будет запускать АЦП каждую 1 мс. В принципе так часто нет смысла, но мы будем использовать усреднение значений, поэтому пусть будет. Включаем USB, выбираем Custom HID.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Генерируем проект и переходим к написанию кода. Я использовал System Workbench for STM32. Добавляем в «main.c» запуск таймера и АЦП, и несколько глобальных переменных.


/* USER CODE BEGIN PV */

//uint16_t adc_arr[ADC_MAX_CONVERSATIONS];

uint16_t adc_to_send;

uint32_t adc_sum;

uint8_t adc_counter;

uint8_t send_flag;

volatile uint16_t x;

/* USER CODE END PV */

/* USER CODE BEGIN 2 */

HAL_ADC_Start(&hadc1);

HAL_ADC_Start_IT(&hadc1);

HAL_TIM_Base_Start(&htim3);

/* USER CODE END 2 */


В прерывании прибавляем к переменной значение с АЦП и увеличиваем счетчик. Когда счетчик достигнет 200, усредняем значение и перекладываем в буфер для отправки по USB. Поднимем флаг, что пора отправлять.


/* USER CODE BEGIN 4 */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){

adc_sum+=HAL_ADC_GetValue(hadc);

adc_counter++;

if(adc_counter==ADC_MAX_CONVERSATIONS){

HAL_GPIO_TogglePin(LD_1_GPIO_Port,LD_1_Pin);

adc_to_send=adc_sum/ADC_MAX_CONVERSATIONS;

adc_counter=0;

adc_sum=0;

send_flag=1;

}

}

/* USER CODE END 4 */


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


/* USER CODE BEGIN WHILE */

while (1)

{

// HAL_GPIO_TogglePin(LD_1_GPIO_Port,LD_1_Pin);

if(send_flag){

send_flag=0;

..USB_Send_report(adc_to_send);

}

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}


Дескриптор USB устройства уже создался стм кубом, его трогать не будем, только проверим интервал опроса, должно быть не больше наших 200 мс.


/* 34 */

0x07, /* bLength: Endpoint Descriptor size */

USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */

CUSTOM_HID_EPOUT_ADDR, /*bEndpointAddress: Endpoint Address (OUT)*/

0x03, /* bmAttributes: Interrupt endpoint */

CUSTOM_HID_EPOUT_SIZE, /* wMaxPacketSize: 2 Bytes max */

0x00,

0x20, /* bInterval: Polling Interval (20 ms) */

/* 41 */


Далее составим «HID Report» дескриптор в программке HID Descriptor Tool.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Тут мы говорим, что наше устройство сообщает температуру в комнате (Usage). Report Size=8 и Report Count=4 означают, что 32 бита посылается от устройства к компьютеру (Input) и столько же от компьютера к устройству (Output). Нам из этого всего понадобится только 2 байта, остальное на будущее. Сохраняем как заголовочный файл, и копируем в наш код (куб там оставил место в файле usbd_custom_hid_if.c). Так же надо проверить соответствие размеров репорт дескриптора 35 байт и размер буфера под отправку (тут должно быть 5 байт, потому что мы еще указали Report ID – это еще 1 байт в самом начале). Прошьем и проверим, что устройство правильно определилось в системе.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Раскомментируем функцию отправки в файле «usbd_custom_hid_if.c» и заполняем, указав первым байтом Report ID, дальше наше значение АЦП.


/* USER CODE BEGIN 7 */

/**

* @brief Send the report to the Host

* @Param report: The report to be sent

* @Param len: The report length

* @retval USBD_OK if all operations are OK else USBD_FAIL

*/

static uint8_t USBD_CUSTOM_HID_SendReport_FS(uint8_t *report, uint16_t len)

{

return USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, report, len);

}

uint8_t USB_Send_report(uint16_t data){

Rep_buffer[0]=0x01;//report id

Rep_buffer[1]=data>>8;

Rep_buffer[2]=data;

Rep_buffer[3]=0xFF;

Rep_buffer[4]=0xFF;

return USBD_CUSTOM_HID_SendReport_FS(Rep_buffer,5);

}

/* USER CODE END 7 */


Проверяем в какой-нибудь утилитке что пакеты действительно идут.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Осталось написать программку под Windows, которая бы все это обрабатывала. Берем любимую среду программирования и библиотеку для работы с HID устройствами. Я взял старенькую Delphi 7 и библиотеку компонентов JEDI VCL. Из нее нужны «TJvHidDeviceController» и «TJvHidDevice». Добавляем обработчик «OnEnumerate» у девайс контроллера, в него по очереди прилетают все HID устройства при вызове энумерации. Остается отфильтровать наше устройство по VID и PID, затем связать с компонентом «TJvHidDevice».


function TUSBMeter.HidControllerEnumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;

begin

if (IntToHex(HidDev.Attributes.VendorID,4)=VID)and

(IntToHex(HidDev.Attributes.ProductID,4)=PID) then

begin

if (HidDev.Caps.OutputReportByteLength=OUT_REPORT_COUNT_AMPERAGE) then

HidController.CheckOutByIndex(HidAmperage,Idx);

usb_ready:=true;

end;

Result := True;

end;


Данные будут приходить в обработчик «OnDeviceData». В нем вычисляем из посылки значение АЦП и выводим куда-нибудь для проверки.


procedure TUSBMeter.HidControllerDeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word);


var

buf:^byte;

begin

if (IntToHex(HidDev.Attributes.VendorID,4)<>VID)or((IntToHex(HidDev.Attributes.ProductID,4)<>PID)) then exit;

buf:=Data; // rep

adc_abs:=buf^;

adc_abs:= adc_abs shl 8;

inc(buf);

adc_abs:=adc_abs+(buf^);

inc(buf);

callback;

end;


Теперь надо сделать пересчет, добавим на форму RadioGroup и настроим как на переключателе мультиметра. Я не стал добавлять шкалу сопротивлений, не нужна.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Заведем так же масштабирующий массив для пересчета и массив с единицами измерений.


const

scale_arr: array[1..18] of real = (600,300,150,60,30,15,6,3,0.75,1500,300,60,15,3,0.6,0.12,0.000012,1);

scale_arr_symb: array[1..18] of string[2] = ('V','V','V','V','V','V','V','V','V','mA','mA','mA','mA','mA','mA','mA','uA','');


Для пересчета еще понадобятся два граничных значения acd_min и adc_max. Подключаем потенциометр к мультиметру, выставляем стрелку на 0 и смотрим, что присылается в программу. Если тоже 0 – хорошо, если нет – не беда, подкорректируем. Потом выставляем стрелку на максимум и так же смотрим. Важно чтобы когда стрелка «зашкаливала» значение продолжало увеличиваться, так будет запас. Если этого нет, надо подкрутить потенциометр ОУ. У меня получилось 0 и 2365. Пересчитываем и выводим уже на основное табло.


procedure TMainForm.HID_Callback;

var

s:string;

buf:string;

rec_s:string;

begin

s:=floattostr(((meter.ADC-adc_min)/(adc_max-adc_min))*scale_arr[RadioGroup1.ItemIndex+1]);

buf:=copy(s,1,5);

buf[pos(',',buf)]:='.';

Label2.Caption:=buf;

end;

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Большая часть готова, теперь надо прикрутить запись в файл, страницу настроек с сохранением и красивый GUI. Формат файла я взял CSV, так как из него будет легко строить графики в Экселе.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Все, готово. Осталось собрать все в корпус мультиметра, свободного места там полно. Прорезать отверстие под USB шнурок и убрать обратно на самую дальнюю полку до тех пор, пока не понадобится снять долгий график разряда аккумулятора или график потребления тока каким-нибудь устройством.


Надеюсь, кому-нибудь будет полезно.

Показать полностью 21 1
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: