Как сделать прерывания для считывания показаний датчика при динамической индикации

Тема в разделе "Arduino & Shields", создана пользователем blackflash2009, 8 авг 2023.

  1. Asper Daffy

    Asper Daffy Иксперд

  2. b707

    b707 Гуру

    Потому что в коде вы используете математику в типе флоат. Поддержка типа флоат для тини13 - это нечто неподьемное для этого маленького камня.

    Вам уже три человека сказали - чтобы писать код для тини13, надо пользоваться не ардуино иде, а чистым Си
     
  3. Я вроде указал что переменная grad должна быть int8_t
    Код (C++):
    int8_t grad; // освобождаем память для переменной "grad"
     
  4. b707

    b707 Гуру

    Эта формула вычисляется в типе флоат
     
  5. parovoZZ

    parovoZZ Гуру

    в 8-ми битках без аппаратного умножителя забудь про умножение, деление, real и float. Это всё неподъёмные вещи для такого класса микроконтроллеров. Только целочисленная арифметика с целыми числами.
     
  6. ( temp/1023.0)*5.0*1000/10 в тип Int не получится ? или как то это обойти мне по сути нужны только целые числа. temp вроде целое число Максимум на uint16_t
     
  7. b707

    b707 Гуру

    не получится. "1023.0" и "5.0" это уже флоат. Если в выражении есть хоть один флоат - вся формула считается как флоат.

    Нужно переводить все операнды в инт. Только аккуратно. Учитывайте, что резульат в целых может быть СОВСЕМ ДРУГИМ.
    Например, если тупо перевести вашу формулу в целое :

    ( temp/1023)*5*1000/10

    то результат будет ВСЕГДА НОЛЬ, независимо от температуры.
     
    DetSimen нравится это.
  8. parovoZZ

    parovoZZ Гуру

    не понимаю, зачем такая запись? Тысячу делить на десять равно сто. Сто помножить на пять равно пятьсот. Пятьсот делить на тысячу двадцать три равно грубо пяти десятым. А пять десятых это деление на два. А деление на два это сдвиг вправо на один бит. А сдвиг - это всего один такт. Грубо, не точно, но таков выбор ТС.
     
    DetSimen нравится это.
  9. Мне бы в коде
     
  10. parovoZZ

    parovoZZ Гуру

    ??????
    Код (C++):
    grad = temp >> 1;
     
    DetSimen нравится это.
  11. DetSimen

    DetSimen Гуру

    Ты случайна, не у нас на физтехе учился? Больно подход знакомый...
     
    microsystems нравится это.
  12. Ну как бы да если temp =30 по формуле которую вы предложили
    можно формулу записать как grad = temp/2 если округлить то получаем то что нужно
    Если еще довести то
    Код (C++):
    int temp = temp* 1000;
    int grad = temp/2046  ;
    проблема при таком записи вранье датчика скажем на 0.5 градуса + int получаем + - 1 градус в принципе не критично
    Спасибо
    работает в железе проверю вечером
     
  13. b707

    b707 Гуру

    а это работать не будет.
    Вы опять ничего не поняли.
     
  14. Ну да не работает. Работает только на калькуляторе.
    Код (C++):
    grad = temp >> 1;
    работает только вылез очередной косяк наводки на аналоговый пин последний сегмент мечется как угорелый то 8 градусов то 9 и тп
     
  15. parovoZZ

    parovoZZ Гуру

    это не наводка. Последние два бита из значения АЦП можно смело выкинуть - в них ничего, кроме шума, нет. Об этом в явной форме сказано в даташите. Итого: 10 бит превращаются в 8. Почему в дурине с таким упорством считывают все 10 бит - непонятно.
     
  16. Я так понял ацп будет иметь не 1023 значений а 255
    Код (C++):
    temp = analogRead(A3); // переменная находится в интервале 0 - 1023
    map(temp, 0,1023,0,255);
    constrain (temp,0,255);
    так или это не то
     
  17. Asper Daffy

    Asper Daffy Иксперд

    Нет, не будет.
    А результаты куда? В помойку?
     
  18. Код (C++):
    void loop() {
    temp = analogRead(A3); // переменная находится в интервале 0 - 1023
    map(temp, 0,1023,0,255);
    constrain (temp,0,255);
    grad = temp >> 1;  
    int8_t var2 = (grad/10%10); //
    int8_t var3 = (grad%10%10); //
    температуру показывает но врет сильно или инерция большая в комнате 18 градусов между пальцев заживаешь 24 показывает хотя может и не прогревается
     
  19. parovoZZ

    parovoZZ Гуру

    плюс/минус градус
    сам же писал. Тем паче, что с таким подходом к проектированию ожидать чего-то грандиозного не приходиться.

    можно и 512, но надо калибровать АЦП, что без приборов сделать невозможно.
    Также существует метод повышения разрядности, но нужен источник истинного белого шума.

    Ещё в атмелах очень сильно плавает внутренний опорник. Причём его значение зависит от экземпляра, что можно убрать калибровкой, но что ещё хуже - он плывет от температуры.
     
  20. b707

    b707 Гуру

    Слушайте, вы вообще что-ли С не знаете?
    Что за тупость?
    Вам же выше уже написали. что вот так использовать эти функции бессмысленно:
    Они у вас вообще ничего не делают!
    Можете просто выкинуть их из кода - и проверить - результат не изменится.

    Код (C++):
    temp = analogRead(A3);
    //map(temp, 0,1023,0,255);
    //constrain (temp,0,255);
    grad = temp >> 1;
    int8_t var2 = (grad/10%10); //
    int8_t var3 = (grad%10%10);
     
    DetSimen нравится это.