Ответить
  • keramogranit Junior Member
    офлайн
    keramogranit Junior Member

    62

    9 лет на сайте
    пользователь #1361191

    Профиль
    Написать сообщение

    62
    # 31 августа 2017 13:05

    ARTexpress, Это прекрасно, но хотелось бы найти в Минске

  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 31 августа 2017 17:06 Редактировалось zverjuga, 1 раз.

    я здесь покупал
    http://www.ebay.com/itm/5-x-Stepper-motor-NEMA-17-76-oz-in-CNC-MI ... 1438.l2649

    5 движков за 40 баксов. дешевле ты нигде не найдешь. у нас переплатишь в три раза. если не спешишь, то лучше подождать недели три, зато купить по очень хорошей цене.

    проклятый антисутенерский закон!
  • DominatorBLR Senior Member
    офлайн
    DominatorBLR Senior Member

    4607

    14 лет на сайте
    пользователь #200849

    Профиль
    Написать сообщение

    4607
    # 1 сентября 2017 08:45
    ARTexpress:

    SIO, ну так-то да

    Добавлено спустя 2 минуты 10 секунд

    DominatorBLR:

    А почему не стоит то запускать дисплей без библиотеки, библиотека - это тот же кусок программы, только там ещё и лишнего будет гора. ?

    чтобы утверждать, что в библиотеке гора лишнего, нужно уметь писать свои библиотеки.

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

  • ARTexpress Member
    офлайн
    ARTexpress Member

    289

    18 лет на сайте
    пользователь #51872

    Профиль
    Написать сообщение

    289
    # 1 сентября 2017 15:43
    DominatorBLR:

    ... вот я и хочу сравнить прямое управление экраном и через библиотеку.

    Сложно комментировать...
    Могу предположить, что вы, предполагая избыточность кода в библиотеке, хотите написать свои функции, в надежде, что это даст экономию памяти?

  • Махасаматман Member
    офлайн
    Махасаматман Member

    274

    11 лет на сайте
    пользователь #721530

    Профиль
    Написать сообщение

    274
    # 1 сентября 2017 16:11

    Мне интересно, Доминатор, Вы вообще понимаете, что такое компиляция?
    Что скомпилированы и записаны в память МК будут только те функции, которые Вы у себя в коде использовали?
    Или Вы тешите себя надеждой, что Вы напишете функцию лучше, чем это сделано в библиотеке, которую юзают миллионы людей?
    Попробуйте тогда писать на ASM. Вот тут есть прекрасный туториал.

  • Benjamin_ Senior Member
    офлайн
    Benjamin_ Senior Member

    1156

    13 лет на сайте
    пользователь #323890

    Профиль
    Написать сообщение

    1156
    # 2 сентября 2017 18:58
    zverjuga:

    я тебе рекомендую активнее пользоваться таймерами. заведи отдельную функцию, которая будет срабатывать по таймеру и читать кнопку. прочтенное состояние кнопки сохраняй в отдельной глобальной переменной и уже используй ее в других функциях (например, когда тебе надо переключать режимы). перерисовку экрана также рекомендую делать в отдельной функции по таймеру. использование delay лично в твоем случае не нужное и вредное. внутри loop вообще желательно писать минимум кода или код, который занимается какой нибудь фиговиной, которая не влияет на рабочий код. основной код надо разносить по таймерам или прерываниям.

    спасибо большое за этот дельный совет. вот я месяц изучал таймеры, тренировался на примитивных цепочках, и в итоге написал скетч для моего экрана с помощью прерываний. Но т.к. я новичёк в этом деле- где то накосячил и прошу подсказки. В общем когда ардуино запускается, я вижу первый экран (из двух), и на этом всё. Кнопка не работает, режимы не переключаются, данные не обновляются. Подскажите пожалуйста, где косяк (а скорее всего косяки)

    #include <Adafruit_GFX.h> // Core graphics library
    #include <Adafruit_ST7735.h> // Hardware-specific library
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <SPI.h>

    // Подключение ТФТ
    #define TFT_CS 10
    #define TFT_RST 8
    #define TFT_DC 9
    #define TFT_SCLK 13
    #define TFT_MOSI 11

    //Инициализируем дисплей
    Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

    // Параметры датчика DS18B
    // Устанавливаем пин 3 на DS18B20
    #define ONE_WIRE_BUS 3
    OneWire oneWire(ONE_WIRE_BUS);
    float tempMin = 999;
    float tempMax = 0;
    int barra = 0;
    int RegimCount = 0;
    int KNOPKA = 2;
    int flagKNOPKA = 0;
    char conta = 0;
    DallasTemperature sensors(&oneWire);
    DeviceAddress sensor1;

    // обработка таймера
    volatile bool timerKNOPKAOn; //переменная вкл/выкл таймера
    unsigned long int timerKNOPKALoop; //переменная для хранения значения таймера
    bool KNOPKAOn; //переменная для хранения состояния кнопки
    volatile unsigned long int timerKNOPKA; //переменная подсчета миллисекунд - значение таймера

    ISR (TIMER0_COMPA_vect) //функция, вызываемая таймером-счетчиком каждые 0,001 сек.
    {
    if(timerKNOPKAOn) //если включен миллисекудный таймер для REGIM
    timerKNOPKA++; //инкремент переменной таймера (+1)
    }

    void setup() {
    pinMode(KNOPKA, INPUT);
    Serial.begin(9600);
    sensors.begin();
    tft.initR(INITR_BLACKTAB); // You will need to do this in every sketch
    //attachInterrupt(KNOPKA, regim, RISING);

    /**** настройка прерывания по таймеру каждую 0,001 сек (вызов функции ISR (TIMER0_COMPA_vect)) ****/
    TCCR0A |= (1 << WGM01); //сброс при совпадении
    OCR0A = 0xF9; //начало отсчета до переполнения (249)
    TIMSK0 |= (1 << OCIE0A); //разрешить прерывание при совпадении с регистром А
    TCCR0B |= (1 << CS01) | (1 << CS00); //установить делитель частоты на 64
    sei(); //разрешить прерывания

    }
    void loop()
    {
    if(digitalRead(2) == 1 && KNOPKAOn == 0) //флаг работы таймера == 0
    {
    timerKNOPKAOn = 1000; // запустить таймер на 1 сек;
    KNOPKAOn == 1; //флаг работы таймера = 1;
    flagKNOPKA == 1; // флаг нажатия кнопки = 1;
    if(RegimCount != 2) //переменная-счетчик экранов !=
    {
    RegimCount++; //переменная-счетчик экранов++;
    }
    else
    RegimCount = 1; //переменная-счетчик экранов = 0
    }

    if(timerKNOPKALoop < 1000)
    {
    cli();
    timerKNOPKALoop = timerKNOPKA;
    sei();
    }
    else
    {
    KNOPKAOn = 0;
    timerKNOPKAOn = 0;
    timerKNOPKAOn = 0;
    }

    if(flagKNOPKA == 1 && RegimCount == 1)
    {
    flagKNOPKA == 0;
    regim1 (); //функция вывода экрана №1();
    }

    if(flagKNOPKA == 1 && RegimCount == 2)
    {
    flagKNOPKA == 0;
    regim2 (); //функция вывода экрана №1();
    }
    }

    void regim1(void)
    {
    //tft print function!
    tft.setTextColor(ST7735_YELLOW);
    tft.setRotation(3);
    tft.setTextSize(2);
    tft.setCursor(35, 10);
    tft.println(" TEMP = C");
    tft.setTextSize(1);
    tft.setCursor(131, 10);
    tft.println("O");
    termo();
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(0);
    tft.setCursor(19, 59);
    tft.print("50");
    tft.setTextSize(0);
    tft.setCursor(19, 106);
    tft.print("0");
    tft.setTextSize(0);
    tft.setCursor(19, 7);
    tft.print("100");
    tft.setTextSize(0);
    tft.setCursor(19, 82);
    tft.print("25");
    tft.setTextSize(0);
    tft.setCursor(19, 32);
    tft.print("75");
    tft.setTextColor(ST7735_BLUE);
    tft.setTextSize(2);
    tft.setCursor(10, 40);
    tft.print(" CUR");
    tft.setTextSize(2);
    tft.setCursor(20, 65);
    tft.print(" MIN");
    tft.setTextSize(2);
    tft.setCursor(20, 90);
    tft.print(" MAX");
    // Информация датчика темп.
    if (sensors.getAddress(sensor1, 0))
    {
    sensors.requestTemperatures();
    float tempC = sensors.getTempC(sensor1);
    // Atualiza temperaturas minima e maxima
    if (tempC < tempMin)
    {
    tempMin = tempC;
    }
    if (tempC > tempMax)
    {
    tempMax = tempC;
    }
    barra = (int)tempC;

    // Отображаем на ТФТ
    tft.setTextColor(ST7735_RED);
    apaga_linha(100, 40);
    tft.setTextSize(2);
    tft.setCursor(100, 40);
    tft.println(tempC, 1);
    //tft.print("C");

    tft.setTextColor(ST7735_GREEN);
    apaga_linha(100, 65);
    tft.setCursor(100, 65);
    tft.println(tempMin, 1);

    tft.setTextColor(ST7735_YELLOW);
    apaga_linha(100, 90);
    tft.setCursor(100, 90);
    tft.println(tempMax, 1);

    tft.setTextColor(ST7735_GREEN);
    tft.setTextSize(1);
    apaga_linha(99, 104);
    tft.setCursor(45, 110);
    tft.print(" SENSOR OK ");
    if (tempMin > 50)
    tempMin = 999;
    tft.fillRect(5, 12, 7, 99, ST7735_RED);
    tft.fillRect(5, 12, 7, 100 - barra, ST7735_BLACK);
    conta++;
    if (conta == 1)
    {
    tft.setTextSize(1);
    tft.setCursor(45, 110);
    tft.print(" |");
    }
    if (conta == 2)
    {
    tft.setTextSize(1);
    tft.setCursor(45, 110);
    tft.print(" /");
    }

    if (conta == 3)
    {
    tft.setTextSize(1);
    tft.setCursor(45, 110);
    tft.print(" -");
    }
    if (conta == 4)
    {
    tft.setTextSize(1);
    tft.setCursor(45, 110);
    tft.print(" \\");
    conta = 1;
    }
    }
    else (!sensors.getAddress(sensor1, 0));
    {
    tft.setTextColor(ST7735_RED);
    tft.setTextSize(1);
    apaga_linha(99, 104);
    tft.setCursor(45, 110);
    tft.print(" SENSOR ERRO ");
    tempMin = 999;
    tempMax = 0;
    }
    }

    void regim2(void)
    {
    tft.fillScreen(ST7735_BLACK);
    tft.setRotation(3);
    tft.setTextSize(2); // Определяем размер шрифта
    tft.setCursor(5, 60); // Устанавливаем курсор в левый верхний угол области вывода
    tft.setTextColor(ST7735_BLUE); // Определяем цвет вывода на дисплей
    tft.print("loading...");
    }

    void apaga_linha (int16_t x, int16_t y)
    {
    tft.fillRect(x, y, 50, 16, ST7735_BLACK);
    }
    void termo ()
    {
    tft.drawRect(4, 11, 9, 100, ST7735_WHITE);
    // tft.fillRect(5, 12, 7, barra, ST7735_YELLOW);
    tft.drawRect(40, 4, 119, 122, ST7735_MAGENTA);

    //Рисунок термометра
    tft.drawLine(14, 11, 17, 11, ST7735_WHITE); // LINHA DE 100
    tft.drawLine(13, 86, 16, 86, ST7735_WHITE); // LINHA DE 75
    tft.drawLine(13, 36, 16, 36, ST7735_WHITE); // LINHA DE 25
    tft.drawLine(13, 61, 16, 61, ST7735_WHITE); // LINHA DE 50
    tft.drawLine(14, 110, 16, 110, ST7735_WHITE); // LINHA DE 0
    tft.drawLine(13, 98, 14, 98, ST7735_WHITE); //
    tft.drawLine(13, 73, 14, 73, ST7735_WHITE); //
    tft.drawLine(13, 48, 14, 48, ST7735_WHITE); //
    tft.drawLine(13, 23, 14, 23, ST7735_WHITE); // L
    tft.drawCircle(8, 118, 8, ST7735_WHITE);
    tft.fillCircle(8, 118, 7, ST7735_RED);
    }

    А вот тут приведена схема, по которой я пытаюсь построить скетч

    настройка переменных;

    void setup() {
    настройка пина для кнопки;

    }

    void loop()
    {
    if(digitalRead(5) == 1 && флаг работы таймера == 0)
    {
    запустить таймер на 1 сек;
    флаг работы таймера = 1;
    флаг нажатия кнопки = 1;
    if(переменная-счетчик экранов != 2)
    {
    переменная-счетчик экранов++;
    }
    else
    переменная-счетчик экранов = 0;
    }

    if(значение таймера < 1000)
    {
    cli();
    считываем значение таймера;
    sei();
    }
    else
    {
    флаг работы таймера = 0;
    таймер = 0;
    остановить работу таймера;
    }

    if(флаг нажатия кнопки == 1 и переменная-счетчик экранов == 0)
    {
    флаг нажатия кнопки = 0;
    функция вывода экрана №1();
    }

    if(флаг нажатия кнопки == 1 и переменная-счетчик экранов == 1)
    {
    флаг нажатия кнопки = 0;
    функция вывода экрана №2();
    }

    }

  • VDi Member
    офлайн
    VDi Member

    386

    17 лет на сайте
    пользователь #80522

    Профиль
    Написать сообщение

    386
    # 6 сентября 2017 09:03

    нужна помощь в написании скетча для получения изображения с камеры ov7670.
    необходимо по комманде или по расписанию получить от камеры raw файл, без преобразования.
    подробности в личку, помощь оплачивается.

  • DominatorBLR Senior Member
    офлайн
    DominatorBLR Senior Member

    4607

    14 лет на сайте
    пользователь #200849

    Профиль
    Написать сообщение

    4607
    # 6 сентября 2017 20:15 Редактировалось DominatorBLR, 2 раз(а).

    Махасаматман, я понимаю что используется не вся библиотека, но я не понимаю что именно используется, а судя по описанию даташита на экран ничего смертельного там для управления нет. Я не знаю как реализованы универсальные команды, может и можно конкретно под мою задачу сделать проще. К тому же компеляция тоже вносит свои баги, об этом я тоже читал. В идеале конечно проще писать на асемблере, но его тоже нужно изучить и научиться заливать в контроллер. Проще мне начать с уже готовых вариантов и расширяться. Ладно. Разберусь со временем сам. Просто это хобби и не там много времени у меня на него, все медленно познаю.

    Добавлено спустя 21 минута 24 секунды

    Кстати приехал мой Монстр Мотор Шилд

    Начал его колупать. Ещё не добрался до главного - максимальные рабочие токи. Но уже опробовал на лампах.
    Из недостатков пока выявил следующее: при заявленных рабочих напряжениях нагрузки 5,5В-16В по факту начинает нормально работать с 9В, при более низком напряжении на выходе напряжение проседает. Второй существенный минус, но до конца не изученный - это снижение на выходе напряжения при реверсе, есть подозрение что связано с очень маленькой нагрузкой, но может и брак чипа.
    Из явных плюсов - управление ШИМом, токовый аналоговый выход, позволяет либо сразу отключить программно плату либо снизить скважность ШИМ, вообщем вариантов много, и если ещё отградуировать то можно и реальные рабочие токи снимать с него.
    Еще проблема моего экземпляра, что чипы немного криво припаяны нет идеальной ровной поверхности между двумя чипами, один на доли миллиметра выступает над вторым, одним радиатором может не получиться нормально холодить, но разделив его на двое или взяв два малых радиатора охладим без проблем.
    Ещё считаю что неудачно расположены выходы нагрузки, при установки шилда как на фото, второй канал очень близко к разъему USB.
    Так как плата рассчитана сама немного отводить тепло с нижней части чипа, я в любом случае буду снимать с Уны её и крепить отдельно. Для себя решил что лучше брать две отдельных платы по одному чипу на каждой.

  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    4105

    17 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    4105
    # 6 сентября 2017 22:41
    DominatorBLR:

    при заявленных рабочих напряжениях нагрузки 5,5В-16В по факту начинает нормально работать с 9В,

    Чем питаете? Проверьте не проседает ли питание на входе шилда под нагрузкой.

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • DominatorBLR Senior Member
    офлайн
    DominatorBLR Senior Member

    4607

    14 лет на сайте
    пользователь #200849

    Профиль
    Написать сообщение

    4607
    # 7 сентября 2017 06:12
    SIO:

    DominatorBLR:

    при заявленных рабочих напряжениях нагрузки 5,5В-16В по факту начинает нормально работать с 9В,

    Чем питаете? Проверьте не проседает ли питание на входе шилда под нагрузкой.

    Не, не, с питанием все хорошо

    да и нагрузка полностью активная, при пониженном напряжении наоборот было бы лучше.

  • art100 Клуб Самоделкиных
    офлайн
    art100 Клуб Самоделкиных

    5060

    13 лет на сайте
    пользователь #397580

    Профиль
    Написать сообщение

    5060
    # 7 сентября 2017 22:26 Редактировалось art100, 3 раз(а).
    DominatorBLR:

    Вопрос: как к ардуинке уно можно подключить 2-3 дисплея LCD 4x20 ?...

    4х20 ???
    легко
    по двум вяроуйкам
    теоретически 255 штук можно прикрутить
    как работает не проверял

    Круиз-контроль 88 км/ч. Радость никакая печаль.
  • nml Senior Member
    офлайн
    nml Senior Member

    714

    20 лет на сайте
    пользователь #10494

    Профиль
    Написать сообщение

    714
    # 8 сентября 2017 09:41
    art100:

    теоретически 255 штук можно прикрутить

    3 адресных линии 255 ну никак не дадут.

    +37529-7708828 (mts,telegram) +375-29-909-68-42(vel,viber)
  • ARTexpress Member
    офлайн
    ARTexpress Member

    289

    18 лет на сайте
    пользователь #51872

    Профиль
    Написать сообщение

    289
    # 8 сентября 2017 10:02
    nml:

    art100:

    теоретически 255 штук можно прикрутить

    3 адресных линии 255 ну никак не дадут.

    и я о том-же.
    хотя я как-то рассматривал коммутатор i2c, для использования множества гироскопов (чтобы можно было брать готовые модули, а у них у всех адрес один и тот-же)

  • DominatorBLR Senior Member
    офлайн
    DominatorBLR Senior Member

    4607

    14 лет на сайте
    пользователь #200849

    Профиль
    Написать сообщение

    4607
    # 8 сентября 2017 11:01 Редактировалось DominatorBLR, 3 раз(а).

    я ещё до этой темы не добрался, но как насчет адресных расширителей? С ними получиться подключать устройства с одинаковыми внутренними адресами?

    Добавлено спустя 1 час 43 минуты 40 секунд

    Ещё вопросик: у меня в void loop() нет ни каких задержек, но подключен OLED экран 128x64. В программе при повороте джойстика задано изменить значение переменной на единицу, вывести на экран. В результате скорость изменения переменной примерно 3 единицы в секунду. Это связано с тем что прорисовка экрана занимает столько много времени и вся скорость Уны уходит на это?

    void loop()
    {
    digitalWrite(EN2, HIGH); // включаем мотор 2
    digitalWrite(INA2, LOW); // крутим мотор 2 в одну сторону
    digitalWrite(INB2, HIGH);
    analogWrite(PWM2,motorSpeed2);

    cspin1 = analogRead(A2); // читаем значение тока мотора 1
    cspin2 = analogRead(A3); // читаем значение тока мотора 2
    ButtonX = analogRead(A4); // читаем значение джойстика оси Х
    ButtonY = analogRead(A5); // читаем значение джойстика оси Y

    if (ButtonX > 1000)
    {
    motorSpeed2 = motorSpeed2 + 1;
    }
    if (ButtonX < 100)
    {
    motorSpeed2 = motorSpeed2 - 1;
    }

    myOLED.setFont(RusFont);
    myOLED.clrScr(); // Стираем все с экрана
    myOLED.print("Crjhjcnm vjnjh 1 - ", LEFT, 0); // Выводим надпись "Скорость мотор 1 - "
    myOLED.printNumI(motorSpeed1,100,0);
    myOLED.print("Crjhjcnm vjnjh 2 - ", LEFT, 10); // Выводим надпись "Скорость мотор 2 - "
    myOLED.printNumI(motorSpeed2,100,10);
    myOLED.print("Njr vjnjh 1 - ", LEFT, 20); // Выводим надпись "Ток мотор 1 - "
    myOLED.printNumI(cspin1,100,20);
    myOLED.print("Njr vjnjh 2 - ", LEFT, 30); // Выводим надпись "Ток мотор 2 - "
    myOLED.printNumI(cspin1,100,30);
    myOLED.print("Pyfxtybt { - ", LEFT, 40); // Выводим надпись "Значение Х - "
    myOLED.printNumI(ButtonX,100,40);
    myOLED.print("Pyfxtybt E - ", LEFT, 50); // Выводим надпись "Значение У - "
    myOLED.printNumI(ButtonY,100,50);
    myOLED.update(); // Обновляем информацию на дисплее
    }

  • art100 Клуб Самоделкиных
    офлайн
    art100 Клуб Самоделкиных

    5060

    13 лет на сайте
    пользователь #397580

    Профиль
    Написать сообщение

    5060
    # 8 сентября 2017 19:24 Редактировалось art100, 13 раз(а).
    ARTexpress:

    ... i2c, для использования множества гироскопов (чтобы можно было брать готовые модули, а у них у всех адрес один и тот-же)

    ты че?
    на мои фото глянь еще раз
    адрес 3 бита выбирается перемычкой на каждом адаптере I2C по 1.5 бакса рулящего индиктором по 5 баксов 20х4
    3 бита это 255 девайсов
    по дефалту у меня китайцы перемыкают адреса несволько вариантов
    я сам правлю как мен удобно
    щяс гляную коде
    ...
    P.S. у вас облом
    на текущем нотебуке кода и ардуин компиляторов не поднимал а из ванны вылезать лень пока

    хотя щас гляну на моем ftp://

    P.S. у вас облом
    вырублен железо

    хотя щас гляну на моем веб http://

    P.S. у вас облом
    вырублен похоже маршрут из ванной

    Только ссылку выложил всякие хохлы поперли пытаться взламывать

    P.S. кто тут еще не понял как гирлянды ЖКИ вешать
    берите с моего сайта
    http://art1.by/sheet/arduino_inout/jpg/219.png
    хотя картинка с помоев интернетов копипастил
    ну короче покупаем адаптеры I2C не важно на что LCD 1602... 2004
    сами поймете что адреса из 255 еще пловить надо
    щас код поищу какой-нибудь из моих
    255 девайсов на шинке I2C еще поискать прийдется
    и я перепаиваю перемычки адресов на совпадающее с моим готовым кодом
    ищу свежего китайца на шине стандартно перебором адресов

    код выделить все

    #include &lt;Wire.h&gt;
    //------------------------------------
    void setup(){
    Wire.begin();
    Serial.begin(9600);
    Serial.println(&quot;\nI2C Scanner&quot;);
    }
    //=====================================
    void loop(){
    byte error, address; int nDevices; nDevices=0;
    Serial.println(&quot;Scanning...&quot;);
    for(address = 1; address &lt; 127; address++ ){
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
    Serial.print(&quot;I2C device found at address 0x&quot;);
    if (address&lt;16) Serial.print(&quot;0&quot;);
    Serial.print(address,HEX);
    nDevices++;
    }
    else if (error==4) {
    Serial.print(&quot;error&quot;);
    if (address&lt;16) Serial.print(&quot;0&quot;);
    Serial.println(address,HEX);
    }
    }
    if (nDevices == 0) Serial.println(&quot;No I2C devices found\n&quot;);
    else Serial.println(&quot;done\n&quot;);
    delay(5000);
    }
    //=====================================

    о я наврал
    127 адресов перебираю
    получается 127 ЖКИ 20х4 теоретически хотя странно 3 ноги это вроде больше
    лень думу думать я пошел с чудо хакерами каклами развлекаться

    P.S. ну вот и все развлечение с каклами закончилось
    я только одну дырочку прикрыл на Сервер Актив Директория
    только 1 час прошел
    и каклам интерес пропал подбирать пароли

    Может опять отркруыть достпу к актву ну чтоб жизнь малиной не казалась? Поразвлекаться? Я еще даже в обратку ничего не тыкал. :shuffle: :weep:
    О! Похоже кто-то в моей сети в контакте болтает.

    Круиз-контроль 88 км/ч. Радость никакая печаль.
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 8 сентября 2017 20:25 Редактировалось zverjuga, 2 раз(а).
    DominatorBLR:

    Это связано с тем что прорисовка экрана занимает столько много времени и вся скорость Уны уходит на это?

    да, так и есть. у тебя в лупе несколько узких мест

    диагноз
    1. digitalWrite - это медленная библиотечная функция. используй прямую запись к порты (регистры). это в разы быстрее
    2. myOLED.clrScr() - это очень медленная операция. нет совершненно никакого смысла в каждом цикле стирать экран. у тебя он по итогу будет моргать
    3. ну и все принты - это тоже медленные функции

    лечение
    1. перенести работу с экраном в отдельное прерывание по таймеру
    2. скорость таймера можно сделать невысокую. думаю, десять прерываний в секунду вполне достаточно
    3. самое важно - перерисовывать экран только тогда, когда это действительно необходимо. это значит, что где то у тебя должен быть флажок, который говорит программе о том, что что то изменилось и экран надо перерисовать. если флажок сброшен, то ничего не делать, просто пропускаем очередной цикл. как только ты вносишь какие то изменения на экране - сделать перерисовку
    4. опционально, для идеала - перерисовывать только то, что действительно нужно перерисовать. допустим, ты поменял текст, тогда надо перерисовать только текст, остальное трогать не нужно

    у меня есть разработанная мною лично достаточно неплохая, на мой скромный взгляд, библиотека, которая позволяет программировать экран на С++ на уровне форм (вьюшек). и она именно этим и занимается, рисует только то, что нужно и только если были какие то изменения. скорость при этом получается максимально высокой (ну можно еще больше ускорить, если не пользоваться библиотекой TTF, а самому программировать экран, но этим мне было лень заниматься). все хочу ее как нибудь выложить на гитхаб, да никак руки не дойдут. только работать она будет, если использовать С++, а не обычный С.

    проклятый антисутенерский закон!
  • DominatorBLR Senior Member
    офлайн
    DominatorBLR Senior Member

    4607

    14 лет на сайте
    пользователь #200849

    Профиль
    Написать сообщение

    4607
    # 8 сентября 2017 20:47 Редактировалось DominatorBLR, 1 раз.
    zverjuga:

    1. digitalWrite - это медленная библиотечная функция. используй прямую запись к порты (регистры). это в разы быстрее

    до этого ещё не добрался

    zverjuga:

    2. myOLED.clrScr() - это очень медленная операция. нет совершненно никакого смысла в каждом цикле стирать экран. у тебя он по итогу будет моргать

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

    zverjuga:

    3. ну и все принты - это тоже медленные функции

    Я тут спрашивал про управление экраном LCD без библиотеке, но мне дали понять что лучше чем проверенная временем библиотека я не напишу ничего.
    Выводы: по сегодняшним данным у меня нет возможности быстро изучить сложное программирование, решение моей проблемы пока вижу в изменении ШИМ на больший интервал (5-10 единиц за раз). После сборки детского электромобиля буду уже дорабатывать. Самый простой способ я вижу в использовании двух контроллеров, один по управлению двигателя и резкого реагирования на изменения параметров, второй для вывода данных этих данных, связь с телефоном. Так как все равно в Уне заняты у меня все порты, а все что я хотел не реализовано. Можно конечно же прикупить мегу, но опять же тут уже нужно правильно запрограммировать её, что я пока не могу сделать.

    zverjuga:

    4. опционально, для идеала - перерисовывать только то, что действительно нужно перерисовать. допустим, ты поменял текст, тогда надо перерисовать только текст, остальное трогать не нужно

    так библиотека myOLED не позволит мне это, там только одно команда отрисовки буфера - yOLED.update()

    Добавлено спустя 6 минут 38 секунд

    Есть ещё одна проблема с МонстрМотор шилдом связанная с измерением тока, при ШИМ регулировании и чтении данных с порта, я читаю как максимальный ток, когда есть положительный всплеск ШИМ, так и нулевой либо отличный от максимального, при "дырке". Пока ничего не придумал кроме как читать 3-5-10 значений в массив и выводить максимальное и/или среднее, и заменять сдвигом данных в массиве, т.о. получать значение с меньшими скачками. Кто может посоветовать как ещё решить данную проблему?

  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 8 сентября 2017 21:30 Редактировалось zverjuga, 2 раз(а).

    DominatorBLR,
    можешь и в лупе перерисовывать. но добавь флажок, который будет говорить о том, что что то поменялось и экран надо перерисовать. если у тебя датчики выдают одинаковое значение, то какой смысл перерисовывать экран? то только зря расходуешь ресурсы. даже если датчик выдал какое то новое значени, то опять таки, не факт, что его надо перерисовать. допустим, ты рисуешь показания тока с точностью до десятых долей, а датчик выдал новое значение, в котором изменена сотая доля. в таком случае нет никакого смысла перерисовывать экран

    DominatorBLR:

    так библиотека myOLED не позволит мне это, там только одно команда отрисовки буфера - yOLED.update()

    значит нужно с умом использовать то, что есть. можно перерисовать не весь экран, а его малую часть. ну или, как я писал выше, не перерисовывать вообще, если в этом нет нужды.

    DominatorBLR:

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

    так и перерисовывай раз в секунду. повесь перерисовку на таймер, который будет срабатывать раз в секунду, и там рисуй. loop работает бесконечно и с максимальной скоростью. ниже приведен псевдокод, как работает loop

    int main() {
    init();
    while(true) {
    loop();
    };
    }

    как только loop прекращает свою работу и процессор не занят прерываниями, он снова начинает свою работу. нет никакого смысла в нем каждый раз делать такую медленную и ресурсоемкую задачу, как отрисовка экрана

    проклятый антисутенерский закон!
  • VDi Member
    офлайн
    VDi Member

    386

    17 лет на сайте
    пользователь #80522

    Профиль
    Написать сообщение

    386
    # 9 сентября 2017 12:10

    Все еще нужна помощь в написании скетча для получения изображения с камеры ov7670.
    необходимо по комманде или по расписанию получить от камеры raw файл, без преобразования.
    подробности в личку, помощь оплачивается.

    собрал как описано здесь http://privateblog.info/arduino-uno-i-kamera-ov7670-primer-ispolzovaniya/ и залил скетч.
    в скетче в loop первой строкой добавил вывод в serial monitor (9600) строки "hello world".
    принимаю по 9600, выводит только "he".

    моих знаний не хватает, может быть кто то может уделить время и разобраться?

  • art100 Клуб Самоделкиных
    офлайн
    art100 Клуб Самоделкиных

    5060

    13 лет на сайте
    пользователь #397580

    Профиль
    Написать сообщение

    5060
    # 9 сентября 2017 20:08 Редактировалось art100, 7 раз(а).
    VDi:

    Все еще нужна помощь в написании скетча для получения изображения с камеры ov7670.
    ... получить от камеры raw файл, без преобразования.
    .

    собрал как описано здесь http://privateblog.info/arduino-uno-i-kamera-ov7670-primer-ispolzovaniya/ и залил скетч.
    в скетче в loop первой строкой добавил вывод в serial monitor (9600) строки "hello world".
    принимаю по 9600, выводит только "he".

    моих знаний не хватает, может быть кто то может уделить время и разобраться?

    ардуника и камера? вы знаете толк в извращениях :rotate:
    ардуина же тебе говорит мне ардуинке Хе....рова :trollface:
    если мне не изменяет память в это 5 лет назад уже все поиграли и плюнули бедняжку 8-ми битовую на 16 мегегерцах мучать :lol:
    садо мазо блин

    купи любую китай веб камерку вскрой и посмотри какой чип и кварц там лежит и ценник в заводском исполнении умножай на 100 для разовой разработки

    я когда увидел 640ч480 уже сразу статью закрыл
    я тыкал мышиную камерку что-то 50х50 ардуинка еще что-то видео успевала

    как минимум надо хотябы разогнатся на что-нибудь если так уж вперлось слово ардуина типа Adruino Duo и хотелки поубавить до 320х240 1fps

    Круиз-контроль 88 км/ч. Радость никакая печаль.