#1 Re: Програмування Arduino » Термометр на 2 датчика ds18b20 дисплей 0,96" SSD1306 » 2025-11-26 09:31:44

Датчики ніяк ініціалізувати не потрібно. А ви все точно скопіювали зі старої: і схему, і прошивку, і EEPROM? (раптом ідентифікатори датчиків в EEPROM зберігались)

#2 Re: Програмування Arduino » Регістрова змінна » 2025-08-20 20:45:33

В avr-gcc можна об'явити глобальну змінну:
register uint8_t myregvar asm("r16");
вона гарантовано буде в r16, але код на C не буде з нею працювати оптимально.
На asm (або вставками на asm) з нею можна працювати як завгодно оптимально і одночасно мати доступ з C, це зручно, коли частина проекту на asm, а частина на C.

upd:
якщо потрібна двобайтова змінна, то:
register uint16_t myregvar asm("r16");
в коді на asm r16 буде молодшим, r17 - старшим

#4 Re: Програмування Arduino » Arduino vs LCD Trium Mars трабл » 2025-08-14 22:45:56

dimich пише:

Доречі, вам не вдавалось піднімати w1-uart на x86? У мене з наскоку не вийшло, схоже, потрібно патчити таблицю ACPI. Поки що не розібрався, як це правильно зробити.

В мене колись також з наскоку не вийшло розібратися як приєднати serdev до пристрою без використання DT, так щоб з командного рядка за бажанням, тому забив на нього і написав драйвер через ldisc. Через ldisc у драйвера нажаль відсутня можливість керувати baudrate, так би я до пари написав би і w1-uart )) , бо добре розібрався з нутрощами W1.

dimich пише:

Драйвер для CH341A я тільки підтримую, щоб компілювався для сучасних ядер.

А що там не так з ch341, що він працює максимум на 250000 BAUD, а далі таке враження, що в нього там буфер на читання лише 32 байти? Пробував ось цей, 500000 BAUD тягне.

#5 Re: Програмування Arduino » Arduino vs LCD Trium Mars трабл » 2025-08-14 20:07:55

dimich пише:

Тільки для SPI-дисплеїв все одно доведеться задіяти GPIO, бо як мінімум ще DATA/COMM треба смикати.

dimich пише:

Якщо хочеться ще GPIO, наприклад, для RST, то треба поправити таблицю в коді та перезібрати драйвер. Все руки не дійдуть реалізувати цю конфігурацію у вигляді параметра.

Подивіться ось тут ідею, як використовуючи другий CS керувати DATA/COMM та отримати додаткові бонуси від двох SPI.
Може і необхідність правити відпаде)

#7 Re: Апаратні питання » DigiSpark Attiny85 проблема з логічною 1 на виході. » 2025-06-13 22:27:58

dimich пише:
Honey пише:

А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам

Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.

Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;

#8 Re: Апаратні питання » DigiSpark Attiny85 проблема з логічною 1 на виході. » 2025-06-13 21:43:57

А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам:

if (millis() - TimeStart > RoadTime * 1024) {
        digitalWrite(outMotorOil, HIGH);
...
if (millis() - TimeStart > RainTime * 1024) {
        digitalWrite(outMotorOil, HIGH);
...

та

if (TriMin < 7000) {
...
    } else {
      digitalWrite(outMotorOil, LOW);
...

#9 Re: Апаратні питання » DigiSpark Attiny85 проблема з логічною 1 на виході. » 2025-06-13 20:49:38

Якщо ще розбираєтесь, звідки вилазить ШИМ, то це результат конкуренції кількох незалежних "мигалок":

        // Мигаем с частотой 2 и более Гц
        if ((timeAfterStartVeryLong % 500) < 250)
          digitalWrite(LEDMode, HIGH);
        else
          digitalWrite(LEDMode, LOW);
      // Мигаем с частотой 1 Гц пока не отпустят кнопку
      if ((timeAfterStartVeryLong % 1000) < 500)
        digitalWrite(LEDMode, HIGH);
      else
        digitalWrite(LEDMode, LOW);
      // мигаем светодиодом с частотой 3 Гц
      if ((TriMin % 500) < 250)
        digitalWrite(LEDMode, HIGH);
      else
        digitalWrite(LEDMode, LOW);

і є ще одна в DisplayOilMode()

#10 Re: Програмування Arduino » парсинг NMEA **проблема » 2025-04-05 11:22:47

Спробуйте без sscanf, якось так:

#include <stdio.h>
#define TOKEN_COUNT 11
#define TOKEN_SIZE  88
char token[TOKEN_COUNT][TOKEN_SIZE];
void process() {
 int i;
 for (i = 0; i < TOKEN_COUNT; i++)
  printf("token[%i]='%s'\n", i, token[i]);
}
int main() {
 int i = 0, j = 0;
 for (;;) {
  char c = getchar();
  if (c == EOF) {
   break;
  } else if (c == '\n') {
   while (i < TOKEN_COUNT) {
    token[i++][j] = 0;
    j = 0;
   }
   i = 0;
   process();
  } else if (c == ',') {
   if (i < TOKEN_COUNT)
    token[i++][j] = 0;
   j = 0;
  } else {
   if (i < TOKEN_COUNT && j < TOKEN_SIZE - 1)
    token[i][j++] = c;
  }
 }
}

#11 Re: Програмування Arduino » не працює ArduinoISP » 2025-03-20 21:02:25

Спробуйте зробити за допомогою avrdude з командного рядка по цій інструкції https://forum.arduino.ua/viewtopic.php?id=2904
Також подивіться, що за ArduinoISP.ino ви компілюєте, його потрібно брати з arduino-examples, бо в інеті валяється купа його непрацюючих модифікацій.

#12 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-15 15:39:17

float floatval = 26.4212;
int intval = floatval * 100 + 0.5;
Send_ar[6] = intval >> 8;
Send_ar[7] = intval & 0xff;

#13 Re: Програмування Arduino » Ошибка компиляции » 2025-03-07 12:38:24

vigor53 пише:

Доброго всем здоровья!
Просветите пожалуйста строчка в коде что означает  4000000.0F

#define resistorValue  4000000.0F   // change this to whatever resistor value you are using

F - суфікс для константи типу float
https://en.wikipedia.org/wiki/C_data_types

#14 Re: Програмування Arduino » Циклічний (коловий) масив » 2025-01-03 21:42:24

Основною фішкою рінгбуфера (якщо не псувати "оптимізаціями" стандартну реалізацію) є можливість виконувати запис і читання в двох окремих потоках без будь-яких синхронізацій між ними.

#15 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-02 09:41:05

Зробіь масив int random_index[16]; спочатку заповніть його числами від 0 до 15, а потім їх перетасуйте (google: shuffle), з масиву послідовно берете індекс і заповнюєте цей стовпчик

#16 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-01 18:44:36

Вилазите за межі масива
i=4 замінити на i=3
i<=4 замінити на i<4

#17 Re: Апаратні питання » Усилтель напряжения с 5 на 10 вольт или АЦП 10 вольт » 2024-12-23 18:47:33

shrek пише:

Как не крути переменный резистор, на выходе всегда 11.2.

У Вас входи підсилювача закорочені між собою.

#19 Re: Проекти » Моніторинг батареї UPS через інтернет » 2024-12-21 09:55:48

З езернет інтерфейсом https://github.com/honechko/snmpvm
Ще поки руки не дійшли замовити в китаї платки та оформити в пристойному вигляді

#20 Re: Програмування Arduino » Нужна консультация ардуино + Nextion экран. Заплачу. » 2024-10-27 10:13:27

dimich пише:

Вставив картинкою бо форумний двіжок зʼїдає бекслеші в тексті

Ставте два бекслеша підряд. При використанні "попередній перегляд" один бекслеш зникає в вікні вводу тексту, тому доводиться ще раз розставляти дублі.

#21 Re: Проекти » Майстер шини 1-wire + Linux » 2024-10-17 16:30:51

Оффтоп: може кому пригодиться така ідея конвертера логічних рівнів для ESP-01 на основі цієї платки, використовував її при розробці прошивки, також можна використати для отримання 5-вольтового 1-wire.
P1150223_s.jpg
P1150224_s.jpgP1150225_s.jpg

#22 Re: Проекти » Майстер шини 1-wire + Linux » 2024-10-17 14:38:29

Зарезервований коментар, якщо тема розростеться, щоб робити тут посилання по темі.

#23 Проекти » Майстер шини 1-wire + Linux » 2024-10-17 14:37:09

Honey
відповідей: 3

Для тих, хто працює з 1-wire під Linux, доступні два способи роботи з адаптером (майстром шини 1-wire): з простору користувача (найпопулярнішим ПЗ є OWFS) і через драйвер в ядрі. В OWFS реалізована робота майже з усіма існуючими адаптерами, а от в ядрі не густо, є драйвери GPIO-адаптера (w1-gpio), USB-адаптера (ds2490), I2C-адаптера (ds2482), але чомусь не було UART-адаптера (ds2480b).

Коли я вибирав, на якій мікросхемі зробити готовий пристрій, то, незважаючи на це, вибрав UART-інтерфейс, оскільки для моїх задач була необхідна гальванічна розв'язка і зробити її значно простіше на однонаправлених лініях, а з драйвером вирішив "розібратися" пізніше. Є ще й друга причина вибору саме послідовного інтерфейсу, але про це згодом.

Отже, Linux-драйвер для ось такого готового майстра шини 1-wire на мікросхемі ds2480b вже є і його можна взяти звідси. В цій темі намагатимусь допомагати з компіляцією драйвера.

1-wire bus master

Якщо адаптер підключено до комп'ютера з Linux через USB-UART або до пінів Raspberry Pi ось так:
UART 5V
Raspberry Pi
Тоді "приєднати" драйвер до відповідного послідовного порта (/dev/ttyUSB0 або /dev/ttyAMA0) можна командою:

ser1wm_attach /dev/ttyUSB0

Виконувати цю команду можна доручити udevd, щоб він її виконував щоразу, коли до USB підключається USB-UART, до якого підключено майстер шини 1-wire. Наприклад так:

ACTION=="add", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb",\
 ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A50285BI",\
 RUN+="/usr/local/bin/ser1wm_attach /dev/%k"

В Linux є така утиліта socat, за допомогою якої послідовний порт по TCP можна "передати" на інший хост:

1) на боці реального послідовного порта піднімаєм сервер на TCP-порту:
socat tcp-l:4232,bind=10.0.0.4,reuseaddr /dev/ttyUSB0,raw,echo=0,b9600,cs8

2) на іншому боці підключаємось і утворюєм віртуальний послідовний порт:
socat tcp:10.0.0.4:4232 pty,raw,echo=0,link=/dev/ttyvirt0

До такого віртуального послідовного порта також можна приєднати даний драйвер:

ser1wm_attach /dev/ttyvirt0

Але в ser1wm_attach реалізована можливість робити це напряму без другої команди socat (її функціонал вбудовано), ось так:

ser1wm_attach 10.0.0.4:4232

Кмітливі вже здогадалися, що і першу команду socat також можна в щось вбудувати, наприклад реалізувати її на мікроконтролері з мережевим інтейфейсом, до якого підключено майстер шини 1-wire (або навіть і майстер шини реалізувати програмно). Це і є та друга причина, по якій вибрано послідовний інтерфейс, оскільки його без будь-яких алгоритмів і overhead можна передавати по TCP.

В якості proof-of-concept викладаю прошивку, яка перетворить ESP-01 на майстер шини 1-wire (на піні RX), а по TCP дозволяє приєднати даний драйвер за допомогою останньої наведеної команди ser1wm_attach.

WiFi 1-wire bus master
Для переведення прошивки в режим конфігурування потрібно при подачі живлення закоротити між собою (але не на землю) піни IO0 та IO2. В режимі конфігурування (на це вказує блимання світлодіодом) підключитися до точки доступу ser1wm_setup, зайти браузером на http://192.168.1.1/ і виконати налаштування.

В планах є також реалізація "Ethernet to 1-wire", тому драйвер назвав не ds2480b а більш загально - ser1wm (скорочення від serial 1-wire master).

Добре, "приєднали" драйвер до послідовного порта чи ESP, а що далі?

В dmesg маємо побачити щось подібне:

serio: Serial port pts9
ser1wm serio3: attaching 1-wire bus master
w1_master_driver w1_bus_master1: Attaching one wire slave 28.0000023ccaeb crc 45

Ядро саме буде періодично (раз на 10 сек) опитувати шину 1-wire і писати в dmesg про знайдені слейви. Кожен слейв, поки він присутній на шині, буде мати свій каталог в /sys/bus/w1/devices в якому будуть файли для роботи з слейвом, які саме файли - залежить від сімейства слейва. Наприклад, для DS18B20:

cat /sys/bus/w1/devices/28-0000023ccaeb/w1_slave
78 01 1e 00 7f ff 08 10 e1 : crc=e1 YES
78 01 1e 00 7f ff 08 10 e1 t=23500

#24 Re: Програмування Arduino » переривання по usart atmega » 2024-10-12 10:33:17

Можу зробити те, що ви хочете, на m8a або m328p, звертайтесь в пошту.

#25 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-16 08:41:30

Cherep_VM пише:

датчик з газ.лічильника - геркон

Можна використати SS49E (аналоговий датчик Холла), але він потребує налаштування threshold-ів, це робиться записом в пам'ять лічильника і я для цієї процедури написав веб-інтерфейс (інструкція), що вже вимагає щоб лічильник був підключений до лінукса на якому має бути запущений owhttpd. Тут один користувач викладав урізану лише для ds2423 "емуляцію" owhttpd на мікроконтролері.

Підвал форуму