• Какой микроконтроллер выдержит напряжение 24v и будет исправно ШИМить?

    @mordo445
    С теми знаниями электроники, что вы продемонстрировали лучше поменять подход. Попробуйте, например, запрос на алиэкспресс "Led strip pwm rgb". В результате вы получите готовые модули, которые могут содержать контроллер, а могут принимать 3.3 или 5 В ШИМ, питание 24 В, и подключить три канала ленты на несколько ампер. Еще там есть готовые контроллеры на ESPxxxx, с wi-fi и управлением уровнями. Например ключи в сборе, в корпусе, диммер с крутилкой, готовый контроллер
    Ответ написан
    Комментировать
  • Какой микроконтроллер выдержит напряжение 24v и будет исправно ШИМить?

    @atereffigies
    НИКАКОЙ.
    То, что Вы хотите сделать -- делать нужно не так.
    Вам надо:
    1. Блок питания на 24 В и достаточной мощности;
    2. Понижающий преобразователь из 24 в 5 (или 24 в 3,3, если будите брайть не ###дуину, а, например, STM32);
    3. Микроконтроллер (на ваш вкус и цвет);
    4. Его величество -- ПОЛЕВОЙ ТРАНЗИСТОР. Брать надо те полевики, которые способны открываться от логических уровней. Ну и, естественно, брать надо на подходящий ток с запасом.

    Частота ШИМа у вас должна быть небольшая, но лучше делать чуть больше верхней границы слышимости (>22 кГц), вполне хватит 30 кГц.

    В итоге должно быть как-то так:
    62886375587a0302942838.png
    https://tinyurl.com/y53l34su
    Ответ написан
    6 комментариев
  • По какому порту идет почта в ms exchange?

    @NortheR73
    системный инженер
    Разве не SMTP 25 и/или SMTPS 587 порт?
    О чем вообще речь? Входящая/исходящая почта или соединение клиента и сервера Exchange?
    Во втором случае - кто клиент, откуда идёт?
    Ну и до кучи - что у Вас настроено в коннекторах в самом Exchange? Что настроено в DNS?
    Remote Connectivity Analyzer или MXToolbox запускали для проверки?

    P.S. Если правильно помню, X.400 выпилили из Exchange ещё много лет назад...
    Ответ написан
    Комментировать
  • Как прочитать файл по частям и записать в const char **?

    Adamos
    @Adamos
    Ну, создаешь char** размером (dataLen + 1023) / 1024 и повторяешь этот код для чтения по частям, присваивая очередному элементу этого массива созданный char* размером 1024, в который считываешь такой кусок данных.
    Ответ написан
    4 комментария
  • Как использовать код С++ совместно с С?

    veydlin
    @veydlin
    Мне никогда не жалко средств на свое любопытство
    Ну, во первых static функции станут приватными и их не будет видно вне файла
    Во вторых extern "C" {} надо использовать на хедерах

    #ifndef HSLOCAL_INCLUDED
    #define HSLOCAL_INCLUDED
    
    #include <stdio.h>
    #include <string.h>
    #include <limits.h>
    #include <hs/hs.h>
    #include <errno.h>
    extern "C" {
     char *readInputData(const char *inputdata, unsigned int *length);
    }
    #endif //HSLOCAL_INCLUDED


    #include "hslocallib.h"
    
    char *readInputData(const char *inputdata, unsigned int *length) {
        FILE *file = fopen(inputdata, "rb");
        if (!file) {
            fprintf(stderr, "Невозможно прочитать файл \"%s\": %s\n", inputdata,
                    strerror(errno));
            return NULL;
        }
    
        if (fseek(file, 0, SEEK_END) != 0) {
            fprintf(stderr, "Невозможно определить конец файла \"%s\": %s\n", inputdata,
                    strerror(errno));
            fclose(file);
            return NULL;
        }
        long dataLen = ftell(file);
        if (dataLen < 0) {
            fprintf(stderr, "Невозможно вернуть положение указателя в файле  %s\n", strerror(errno));
            fclose(file);
            return NULL;
        }
        if (fseek(file, 0, SEEK_SET) != 0) {
            fprintf(stderr, "Невозможно найти начало файла \"%s\": %s\n", inputdata,
                    strerror(errno));
            fclose(file);
            return NULL;
        }
    
        char *inputData = malloc(dataLen);
        if (!inputData) {
            fprintf(stderr, "Невозможно выделить память для входных данных\n");
            fclose(file);
            return NULL;
        }
    
        char *ptrInputData = inputData;
        size_t bytesLeft = dataLen;
        while (bytesLeft) {
            size_t bytesRead = fread(ptrInputData, 1, bytesLeft, file);
            bytesLeft -= bytesRead;
            ptrInputData += bytesRead;
            if (ferror(file) != 0) {
                fprintf(stderr, "Ошибка чтения файла\n");
                free(inputData);
                fclose(file);
                return NULL;
            }
        }
        fclose(file);
    
        *length = (unsigned int)dataLen;
        return inputData;
    }
    Ответ написан
    1 комментарий
  • Как возвращать ошибку в std::filesystem?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Например, есть вот такая дописка на https://en.cppreference.com/w/cpp/filesystem/files...
    In order to ensure that copy functions of filesystem_error are noexcept, typical implementations store an object holding the return value of what() and two std::filesystem::path objects referenced by path1() and path2() respectively in a separately-allocated reference-counted storage.

    Currently the MS STL implementation is non-conforming: objects mentioned above are stored directly in the filesystem object, which makes the copy functions not noexcept.


    из которой следует, что объект исключения не стоит столь вольно копировать
    Ответ написан
    3 комментария
  • Как кидать исключения при работе с try catch?

    @res2001
    Developer, ex-admin
    Сишные функции не вызывают исключений. В Си их просто нет. Поэтому помещать их в try/catch нет смысла - проверяйте возвращаемые значения по старинке. Если хотите, можете написать обертки для стандартных функций, генерирующие исключения в случае ошибки. А еще лучше использовать std::fstream - вы же пишите на С++, так и пользуйтесь плюсовой стандартной библиотекой, а не Сишной.
    void foo() {
        int *smth;
        try {
            smth = new int[100];
            if (5 < 4) {
                std::runtime_error("Беда");
            }
        } catch (std::runtime_error &e) {
            e.what();
        }
        delete[] smth;
    }

    new генерирует std::bad_alloc, если произойдет исключение - память не выделилась и ничего удалять не надо.
    Ответ написан
    2 комментария
  • Как запустить исполняемый файл, тк выдает ошибку msvcp140.dll?

    15432
    @15432
    Системный программист ^_^
    Ставьте Microsoft Visual C++ Redistributable Packages for Visual Studio 2015

    или собирайте .exe статически
    Ответ написан
    Комментировать
  • Как сортировать вектор строк?

    Найди позицию самой правой точки в имени файла. Преобразуй всё, что после неё и до конца имени, в число. (Если не преобразовалось, считаем номер равным нулю.) Создаём вектор пар "имя до точки" - номер. (Для файлов без номера берём имя файла целиком, а не только до точки.) Сортируем вектор пар с кастомным компаратором, который сравнивает сначала имя, потом номер. Можно мне не писать код? :)
    Ответ написан
    3 комментария
  • Расскажите в каких ситуациях используют класс quiloader в QT?

    @Mercury13
    Программист на «си с крестами» и не только
    В крайне-крайне редких случаях, когда вы пишете редактируемый пользовательский интерфейс. Например, в ERP.
    Разумеется, QUiLiader под капотом есть всегда, но среднему программисту он ни к чему.
    Ответ написан
    Комментировать
  • Как подключиться к UART смартфона?

    Punk_Joker
    @Punk_Joker
    Software Engineer в ВО Овен
    Использовать конвертер логических уровней, есть уже готовые платки.
    Ответ написан
    2 комментария
  • Как передать вектор в функцию?

    @Mercury13
    Программист на «си с крестами» и не только
    Раз мы изменяем наш вектор — то по неконстантной сцылке.

    void add (int n, std::vector<int>& vec){
        vec.push_back(n);
    }
    
    std::vector <int> myVec;
    add(5, myVec);
    Ответ написан
    Комментировать
  • Не правильно считает пример?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас 1/4 и 1/3 - целочисленное деление, соответственно равны 0. Используйте 1/4. и 1/3.
    И ещё лишние sqrt.
    rez = pow(2, -x) * sqrt(x + pow(abs(y), 1/4.)) * pow(exp(x - 1 / sin(z)), 1/3.);
    Ответ написан
    Комментировать
  • При работе с 12 вольтами делается 2 питания?

    @Fixid
    Конечно, что то типа КРЕН5 (жутко устаревшая, но продается везде). Или LD1117
    Просто ставится стабилизатор питания нужной мощности.
    Ответ написан
    7 комментариев
  • Что не так со входами arduino due?

    @vanyamba-electronics
    Скорее всего электромагнитная наводка. Например, какой-нибудь мощный трансформатор поблизости расположен.
    Ответ написан
    Комментировать
  • Взломан ubuntu сервер. Какие действия стоит предпринимать?

    Обнуляйте все. Ставьте ОС на голые разделы. Восстанавливайте код их репозитория, а базу из бекапов.
    Ответ написан
    3 комментария
  • Что не так со входами arduino due?

    @n12eq3
    входы АЦП без подключённого источника сигнала будут показывать ноль только в теории. на практике этого получить нельзя и всегда будут наводки, чаще всего простые 50гц от сети 220.
    Ответ написан
    Комментировать
  • Как найти маркер конца текста?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Придумал. Пусть Σ' — это наш алфавит, из которого можно делать маркеры.
    1. Определяем макс. длину маркера — mlen = ceil( log{|Σ'|}(length + 1) ).
    2. Заводим битовую маску длины |Σ'| + |Σ'|² + … + |Σ'|^{mlen−1} + length + 1.
    Каждый возможный маркер обозначим числом:
    A = 0, B = 1, …, Z = 25, AA = 26, AZ = 51, BA = 52…
    3. Очередь пуста.
    4. Если очередной символ из Σ' — смотрим, сколько символов сзади из Σ', и ставим единицы в соотв. позициях маски.
    5. Находим в маске ноль — это и есть нужный нам маркер.
    Ответ написан
    Комментировать
  • Почему меняется выходное значение после нескольких запусков программы?

    @Mercury13
    Программист на «си с крестами» и не только
    Компилятор какой используете? У меня на MinGW всё постоянно — и постоянно не дробная часть. Есть две возможные причины нестабильного поведения.
    1. Флаги сопроцессора — какая-то библиотека Си их не выставляет в постоянное значение.
    2. Неопределённое поведение (uint32_t)var в предпоследней строке. Число-то >1016, а uint32 — это 4·109.

    Тут вы множите число на 10, пока оно не станет целым. Если оно не точный double (а оно не точный), получается ситуёвина, когда младшие биты зависят от флагов сопроцессора, и неизвестно, сколько итераций проработает программа. В любом случае крайне мала вероятность, что будет нечто умещающееся в uint32_t. Таким образом, есть такие варианты обойти проблему.
    1) Умножить сразу на 1e8, а затем обрезать нули.
    2) Сконвертировать в uint64_t.

    Преобразование в uint64_t даёт постоянные 28800000000000024.
    Умножение на 1e8 (число подобрано такое, чтобы в uint32_t вмещалось)
    var *= 1e8;
        number = (uint64_t)var;
    
        while (number % 10 == 0)
            number /= 10;

    даёт 288.

    UPD. Сам я для преобразования дробного в строку в коммерческой проге использую собственную функцию, основанную на GRISU. Там есть много функций наподобие: точность 7 знаков, но если число <1010 — выводим его как целое, с 9-ю знаками.
    Ответ написан
    Комментировать
  • Можно ли на python написать полноценный браузер?

    GavriKos
    @GavriKos
    Теоретически - можно на любом языке.
    Практически - зачем оно вам надо? В одиночку это уже непосильный труд. Все равно что самому собирать реактивный самолет из говна и палок (говно в данном случае не имеет отношения к питону)
    Ответ написан