1. Уважаемый Гость! При написании вопросов в раздел форума [ArduCopter] Вопросы, проблемы и решения обязательно придерживаться шаблона сообщения, оговоренного в правилах раздела! Если сообщение не будет оформлено должным образом, то и ответ на вопрос будет с наименьшим приоритетом. Старайтесь дать максимально полную информацию по вашей проблеме, чтобы можно было более детально рассматривать вопрос!
    Скрыть объявление
  2. Уважаемый Гость! Хотите получать кэшбэк с покупок в online-магазинах? Сервис "Zozi.ru" дает такую возможность!
    Скрыть объявление
  3. Друзья! Для нашего ресурса необходим дополнительный объем пространства в облаке Dropbox. Подробнее.
    Скрыть объявление

Arduino и AVR (Atmel) микроконтроллеры

Тема в разделе "Наши другие увлечения", создана пользователем raefa, 9 мар 2016.

Реклама. Купить это место.
  1. raefa

    raefa Главнокомандующий Команда форума

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    Последнее редактирование: 19 окт 2017
  2. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    Ребята.. а не подскажет ли кто, можно не умея программировать сделать на ардуине и двухразрядном индикаторе типа датчика уровня бензина?
    Я не могу из найденных в гугле примеров собрать нужный. Есть с одним разрядом примеры, есть просто со светодиодами, есть с 4-х разрядными, но не понимая функционал сдвигового регистра (да впрочем как вообще языка программирования) не могу заставить цифры гореть в двух отделах. Или вроде две горят, но одна мерцает так, что не понятно что там.

    Прикрепил код, где цифры от 0 до 9 меняются, и светодиод загорается типа когда меньше 3л (для примера), но нужно сделать двухразрядный индикатор.

    Код:
    /*
    ********************************************************************
      Name    : shiftOutAnalogueDisplay, Test code
      Author  : Benjo Charlie
      Date    : 13 Sept, 2013
      Version : 1.0
      Notes   : This is an adaptation of the ReadAnalogVoltage tutorial.
              :
              : The idea is to map the analogue input voltage and display that
              : mapped value on a 7 segment display via a shiftbit register.
      Tutorial: 74HC595 Shift Bit Register using a 7 Segment Display, ...
    
    <a href="http://www.youtube.com/watch?v=shcumKPTcTk" title="http://www.youtube.com/watch?v=shcumKPTcTk" rel="nofollow">http://www.youtube.com/watch?v=shcumKPTcTk</a>
    Shift Bit Registers can be a little tricky to map out and setup. I designed this simple bit of code to help you do just that. A simple bit shift operation that sends a HIGH signal down each of the Shift Bit Registers pins in turn. i.e. shiftOutDisplay
    I've also developed this very simple method that goes hand in hand with the code and should be a good starting point for anyone who is not too familiar with Binary.
    Finally, I've added some useful code to display the map that you've created. i.e.
    I hope you find it useful, I know I've had a lot of fun with this stuff :)
    
    LINKS:
    shiftOutDisplay
    <a href="https://gist.github.com/benjjo/6559436" title="https://gist.github.com/benjjo/6559436" rel="nofollow">https://gist.github.com/benjjo/6559436</a>
    
    shiftOutAnalogueDisplay
    <a href="https://gist.github.com/benjjo/6559456" title="https://gist.github.com/benjjo/6559456" rel="nofollow">https://gist.github.com/benjjo/6559456</a>
    
    ShiftOut Reference:
    <a href="http://arduino.ru/Reference/ShiftOut" title="http://arduino.ru/Reference/ShiftOut" rel="nofollow">http://arduino.ru/Reference/ShiftOut</a>
    
    ShiftOut Tutorial:
    <a href="http://arduino.cc/en/Tutorial/ShiftOut" title="http://arduino.cc/en/Tutorial/ShiftOut" rel="nofollow">http://arduino.cc/en/Tutorial/ShiftOut</a>
    
    Music written by Tom Cusack
    Composer -- Tom Cusack
    Music from <a href="http://www.freemusicforvideos.com" title="www.freemusicforvideos.com" rel="nofollow">www.freemusicforvideos.com</a>
    ********************************************************************
    
    7 Segment (Common Anode) Display Map: (This can be altered to reflect your HW)
    
        D   E  5V   F   G
    ___|___|___|___|___|____
    |                        |
    |        F               |
    |    E       G           |
    |        D               |
    |    A       C           |
    |        B       H(Dot)  |
    |________________________|
        |   |   |   |   |
        A   B  5V   C   H
    
    74HC595 Map:
         _______
    Q1  |1 *  16|  Vcc                  PINS 1-7, 15   Q0 - Q7   Output Pins
    Q2  |2    15|  Q0                   PIN 8       GND         Ground, Vss
    Q3  |3    14|  DS                   PIN 9       Q7"         Serial Out
    Q4  |4    13|  OE                   PIN 10       MR         Master Reclear, active low
    Q5  |5    12|  ST_CP                PIN 11       SH_CP     Shift register clock pin
    Q6  |6    11|  SH_CP                PIN 12       ST_CP     Storage register clock pin (latch pin)
    Q7  |7    10|  MR                   PIN 13       OE         Output enable, active low
    GND |8_____9|  Q7"                  PIN 14       DS         Serial data input
                                        PIN 16       Vcc         Positive supply voltage
               _______
       LED Q1-|1 *  16|-5V
       LED Q2-|2    15|-LED Q0
       LED Q3-|3    14|-PIN 11
       LED Q4-|4    13|-GND
       LED Q5-|5    12|-PIN 8
       LED Q6-|6    11|-PIN 12 ; 1uF TO GND
       DOT Q7-|7    10|-5V
          GND-|8_____9|-NILL
    
    */
    
    int latchPin = 8;     //Pin connected to ST_CP of 74HC595
    int clockPin = 12;    //Pin connected to SH_CP of 74HC595
    int dataPin = 11;     //Pin connected to DS of 74HC595
    int sensorPin=A0;
    byte SegDisplay; // переменная для вывода символов на индикаторе
    
    
    // Setup the combination to display each number on the display
    /*byte g_digits[11]={
    B00111111, B00000110,    // 0 1
    B01011011, B01001111,    // 2 3
    B01100110, B01101101,    // 4 5
    B01111101, B00000111,    // 6 7
    B01111111, B01101111,    // 8 9
    B00000000, };           // все сегменты выключены
    */
    byte ZERO = 192; // A number value goes here.
    byte ONE = 249;
    byte TWO = 164;
    byte THREE = 176;
    byte FOUR = 153;
    byte FIVE = 146;
    byte SIX = 130;
    byte SEVEN = 248;
    byte EIGHT = 128;
    byte NINE = 144;
    byte MAX = 127;
    
    
    
    void setup() {   
      pinMode(8, OUTPUT);
      pinMode(12, OUTPUT);
      pinMode(11, OUTPUT);
      pinMode(13, OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      int analogueValue = analogRead(sensorPin);
      analogueValue = map(analogueValue, 660, 970, 0, 10); //тут диапазон переводится с фоторезистора (временно), а будут батчик резистивный
      digitalWrite(latchPin, LOW);
    /*
    // Разбиваем цифру по разрядам индикатора
      if (disp < 10) // если наша цифра меньше 10, то
      {
    //    Indicate(0, 11); // пишем в первый разряд пусто
    //    Indicate(1, 11); // пишем во второй разряд пусто
        registerWrite(0, 11); // пишем в третий разряд пусто
        registerWrite(1, disp); // пишем в четвертый разряд нашу цифру
      }
      else if (disp < 100) // если наша цифра меньше 100, то
      {
    //    Indicate(0, 11); // пишем в первый разряд пусто
    //    Indicate(1, 11); // пишем во второй разряд пусто
        registerWrite(0, disp / 10); // пишем в третий разряд - цифру делёную на 10
        registerWrite(1, disp % 10); // пишем в четвертый разряд цифру оставшуюся от деления на 10
    */
      if (analogueValue==0) SegDisplay=ZERO; // Min value
      if (analogueValue==1) SegDisplay=ONE;
      if (analogueValue==2) SegDisplay=TWO;
      if (analogueValue==3) SegDisplay=THREE;
      if (analogueValue==4) SegDisplay=FOUR;
      if (analogueValue==5) SegDisplay=FIVE;
      if (analogueValue==6) SegDisplay=SIX;
      if (analogueValue==7) SegDisplay=SEVEN;
      if (analogueValue==8) SegDisplay=EIGHT;
      if (analogueValue==9) SegDisplay=NINE;
      if (analogueValue>9) SegDisplay=MAX; // Max Value: illuminate Dot
    
      if (analogueValue<3) digitalWrite(13, HIGH);
      {
      delay(300);              // wait for a second
      digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
      delay(300);              // wait for a second
      }
      shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay);
    
      digitalWrite(latchPin, HIGH); //take the latch pin high so the LEDs will light up:
    
      // Print out the corresponding Shift Bit Register pin with it's value.
      Serial.print("analogueValue = ");
      Serial.println(analogueValue);
      Serial.print("SegDisplay = ");
      Serial.println(SegDisplay, BIN);
      delay(100); // Allow to settle
    }
     
    Последнее редактирование модератором: 23 ноя 2017
  3. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    где схема? и код давайте с тегом code - в неформатированном виде его читать невозможно
     
    Revenger нравится это.
  4. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    Сорри, вот код, который пока хотя бы на одну цифру работает:
    Код:
    /*
    ********************************************************************
      Name    : shiftOutAnalogueDisplay, Test code
      Author  : Benjo Charlie
      Date    : 13 Sept, 2013
      Version : 1.0
      Notes   : This is an adaptation of the ReadAnalogVoltage tutorial.
              :
              : The idea is to map the analogue input voltage and display that
              : mapped value on a 7 segment display via a shiftbit register.
      Tutorial: 74HC595 Shift Bit Register using a 7 Segment Display, ...
    
    <a href="http://www.youtube.com/watch?v=shcumKPTcTk" title="http://www.youtube.com/watch?v=shcumKPTcTk" rel="nofollow">http://www.youtube.com/watch?v=shcumKPTcTk</a>
    Shift Bit Registers can be a little tricky to map out and setup. I designed this simple bit of code to help you do just that. A simple bit shift operation that sends a HIGH signal down each of the Shift Bit Registers pins in turn. i.e. shiftOutDisplay
    I've also developed this very simple method that goes hand in hand with the code and should be a good starting point for anyone who is not too familiar with Binary.
    Finally, I've added some useful code to display the map that you've created. i.e.
    I hope you find it useful, I know I've had a lot of fun with this stuff :)
    
    LINKS:
    shiftOutDisplay
    <a href="https://gist.github.com/benjjo/6559436" title="https://gist.github.com/benjjo/6559436" rel="nofollow">https://gist.github.com/benjjo/6559436</a>
    
    shiftOutAnalogueDisplay
    <a href="https://gist.github.com/benjjo/6559456" title="https://gist.github.com/benjjo/6559456" rel="nofollow">https://gist.github.com/benjjo/6559456</a>
    
    ShiftOut Reference:
    <a href="http://arduino.ru/Reference/ShiftOut" title="http://arduino.ru/Reference/ShiftOut" rel="nofollow">http://arduino.ru/Reference/ShiftOut</a>
    
    ShiftOut Tutorial:
    <a href="http://arduino.cc/en/Tutorial/ShiftOut" title="http://arduino.cc/en/Tutorial/ShiftOut" rel="nofollow">http://arduino.cc/en/Tutorial/ShiftOut</a>
    
    Music written by Tom Cusack
    Composer -- Tom Cusack
    Music from <a href="http://www.freemusicforvideos.com" title="www.freemusicforvideos.com" rel="nofollow">www.freemusicforvideos.com</a>
    ********************************************************************
    
    7 Segment (Common Anode) Display Map: (This can be altered to reflect your HW)
    
        D   E  5V   F   G
    ___|___|___|___|___|____
    |                        |
    |        F               |
    |    E       G           |
    |        D               |
    |    A       C           |
    |        B       H(Dot)  |
    |________________________|
        |   |   |   |   |
        A   B  5V   C   H
    
    74HC595 Map:
         _______
    Q1  |1 *  16|  Vcc                  PINS 1-7, 15   Q0 - Q7   Output Pins
    Q2  |2    15|  Q0                   PIN 8       GND         Ground, Vss
    Q3  |3    14|  DS                   PIN 9       Q7"         Serial Out
    Q4  |4    13|  OE                   PIN 10       MR         Master Reclear, active low
    Q5  |5    12|  ST_CP                PIN 11       SH_CP     Shift register clock pin
    Q6  |6    11|  SH_CP                PIN 12       ST_CP     Storage register clock pin (latch pin)
    Q7  |7    10|  MR                   PIN 13       OE         Output enable, active low
    GND |8_____9|  Q7"                  PIN 14       DS         Serial data input
                                        PIN 16       Vcc         Positive supply voltage
               _______
       LED Q1-|1 *  16|-5V
       LED Q2-|2    15|-LED Q0
       LED Q3-|3    14|-PIN 11
       LED Q4-|4    13|-GND
       LED Q5-|5    12|-PIN 8
       LED Q6-|6    11|-PIN 12 ; 1uF TO GND
       DOT Q7-|7    10|-5V
          GND-|8_____9|-NILL
    
    */
    
    int latchPin = 8;     //Pin connected to ST_CP of 74HC595
    int clockPin = 12;    //Pin connected to SH_CP of 74HC595
    int dataPin = 11;     //Pin connected to DS of 74HC595
    int sensorPin=A0;
    byte SegDisplay; // переменная для вывода символов на индикаторе
    
    
    // Setup the combination to display each number on the display
    /*byte g_digits[11]={
    B00111111, B00000110,    // 0 1
    B01011011, B01001111,    // 2 3
    B01100110, B01101101,    // 4 5
    B01111101, B00000111,    // 6 7
    B01111111, B01101111,    // 8 9
    B00000000, };           // все сегменты выключены
    */
    byte ZERO = 192; // A number value goes here.
    byte ONE = 249;
    byte TWO = 164;
    byte THREE = 176;
    byte FOUR = 153;
    byte FIVE = 146;
    byte SIX = 130;
    byte SEVEN = 248;
    byte EIGHT = 128;
    byte NINE = 144;
    byte MAX = 127;
    
    
    
    void setup() {     
      pinMode(8, OUTPUT); 
      pinMode(12, OUTPUT);
      pinMode(11, OUTPUT);
      pinMode(13, OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      int analogueValue = analogRead(sensorPin);
     
      analogueValue = map(analogueValue, 660, 970, 0, 10); //тут диапазон переводится с фоторезистора (временно), а будут батчик резистивный
      digitalWrite(latchPin, LOW); 
     
    /*
    // Разбиваем цифру по разрядам индикатора
      if (disp < 10) // если наша цифра меньше 10, то
      {
    //    Indicate(0, 11); // пишем в первый разряд пусто
    //    Indicate(1, 11); // пишем во второй разряд пусто
        registerWrite(0, 11); // пишем в третий разряд пусто
        registerWrite(1, disp); // пишем в четвертый разряд нашу цифру
      }
      else if (disp < 100) // если наша цифра меньше 100, то
      {
    //    Indicate(0, 11); // пишем в первый разряд пусто
    //    Indicate(1, 11); // пишем во второй разряд пусто
        registerWrite(0, disp / 10); // пишем в третий разряд - цифру делёную на 10
        registerWrite(1, disp % 10); // пишем в четвертый разряд цифру оставшуюся от деления на 10
    */ 
      if (analogueValue==0) SegDisplay=ZERO; // Min value
      if (analogueValue==1) SegDisplay=ONE;
      if (analogueValue==2) SegDisplay=TWO;   
      if (analogueValue==3) SegDisplay=THREE;   
      if (analogueValue==4) SegDisplay=FOUR;   
      if (analogueValue==5) SegDisplay=FIVE;   
      if (analogueValue==6) SegDisplay=SIX;   
      if (analogueValue==7) SegDisplay=SEVEN;   
      if (analogueValue==8) SegDisplay=EIGHT;   
      if (analogueValue==9) SegDisplay=NINE;   
      if (analogueValue>9) SegDisplay=MAX; // Max Value: illuminate Dot
      if (analogueValue<3) digitalWrite(13, HIGH);
      {
      delay(300);              // wait for a second
      digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
      delay(300);              // wait for a second
      }
     
      shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); 
    
      digitalWrite(latchPin, HIGH); //take the latch pin high so the LEDs will light up:
    
      // Print out the corresponding Shift Bit Register pin with it's value.
      Serial.print("analogueValue = ");
      Serial.println(analogueValue);
      Serial.print("SegDisplay = ");
      Serial.println(SegDisplay, BIN);
     
      delay(100); // Allow to settle
    }
    Правда после вставки "делей" в условие для включения светодиода, появилась задержка на всём. С другой стороны, может это и к лучшему, если бензин в баке колышится, то не стОит резко менять цифры наверное.

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

    На словах пока так: Датчик в баке типа переменного резистора, сейчас на макетке я сделал делитель из фоторезистора, его данные считываются и преобразуются в цифры. В идеале две цифры.
     
  5. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    Сейчас "сотворил" из кусков найденного в инете на две цифры, вписал туда функцию монитора порта, вижу правильные показания от 0 до 29 (пусть не 30, ну ничего), кое-как добился что вроде выводятся цифры в нужных местах, но первая мерцает так, что больше похоже, что она горит и цифры в этом разряде в итоге меняются вместе с правой (( Что мешает светиться ему нормально?
    Код:
    //********************************************************************
    //  Name    : Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, переменный резистор
    //  Author  : CheBuraw
    //  Date    : 11 Feb, 2015
    //  Version : 0.9
    //********************************************************************
    int latchPin = 8;     //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты
    int clockPin = 12;    //Пин подключен к SH_CP входу 74HC595
    int dataPin = 11;     //Пин подключен к DS входу 74HC595
    
    int TimeLight = 5;  //время для разогрева сегментов
    int sensorPin=A0;
    
    byte SegDisplay; // переменная для вывода символов на индикаторе
    byte RazrDisplay; // переменная для включения разрядов
    
    // Настройка комбинации для отображения каждого номера на дисплее.
    // Комбинация выбрана на основе таблицы отображаемого знака данным порта
    // Соответственно { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , dp, - }
    byte g_digits[12]={192,249,164,176,153,146,130,248,128,144,127,255}; //массив цифр, генерирующий из сегментов цифры
    byte g_registerArray[2]={2,1}; //массив цифр, указывающий разряды
    
    
    void setup() {
    // обозначаем все пины как выходы
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      int disp = 0; //создаем переменную для вывода на экран
    
      int analogueValue = analogRead(sensorPin);  // читаем аналоговый пин A0
      analogueValue = map(analogueValue, 660, 970, 0, 30); //преобразуем диапазон с А0 (0-1023) в нужный нам (0-30)
    Serial.println(analogueValue);
      disp = analogueValue; // записываем получившуюся после преобразования цифру в переменну для вывода на экран
    
    // Разбиваем цифру по разрядам индикатора
      if (disp < 10) // если наша цифра меньше 10, то
      {
         Indicate(0, 10); // пишем в первый разряд пусто
        Indicate(1, disp); // пишем во второй разряд нашу цифру
      }
      if (disp < 10) // если наша цифра меньше 10, то
      {
      digitalWrite(13, HIGH);
        delay(100);              // wait for a second
        digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
        delay(100);              // wait for a second
        }
      else if (disp > 10) // если наша цифра больше 10, то
      {
        Indicate(0, disp / 10); // пишем в первый разряд - цифру делёную на 10
        Indicate(1, disp % 10); // пишем во второй разряд цифру оставшуюся от деления на 10
    /*
    Допустим наша цифра 25.
      Если мы ее поделим на 10, то у нас получится 2,5. Цифры после запятой, в данном случае,
    у нас не остаются. Таким образом мы имеем в третем разряде цифру 2.
      В чевертый разряд мы, как раз и записываем цифру-остаток полученную в результате деления.
    В нашем случае это и есть та самая 5.
    Аналогичным образом разбивается наша цифра и далее.
    */
      }
    
    }
    
    void Indicate(int r,int x)
    {
    SegDisplay=g_digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре.
    RazrDisplay=g_registerArray[r];  // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре.
      digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
          shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда)
          shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay);  // Записываем информацию для первого регистра (Номер символа)
      digitalWrite(latchPin, HIGH);  //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    
       delay(TimeLight); // пауза, чтобы сегменты "разгорелись"
    }
    а, и светодиод на ноге 13 не загорается, т.е. условие не выполняется.
    --- Сообщения объединены, 23 ноя 2017 ---
    Почему не загорался светодиод нашел (забыл прописать его вначале). а почему цифры меняться начинают на индикаторе вместе одинаково - пока не понял (
     

    Вложения:

    • IMG_6399[1].JPG
      IMG_6399[1].JPG
      Размер файла:
      88,2 КБ
      Просмотров:
      2
  6. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    С мерцающим символом разобрался...впрочем как и с выводом на обе цифры(!) Сам укосячил, не на втором регистре взял питание анода второго символа, а с +5в... видать пока что-то не получалось, я и передёрнул проводки )) Вроде работает и адекватно. Остаётся вопрос, как "замедлить" изменение показания, чтобы цифры не скакали резко при изменении сопротивления датчика? Ну типа как на машине, стрелка не скачет, а примороженная ))
     
    Последнее редактирование: 24 ноя 2017
  7. LampGraph

    LampGraph Кандидат наук

    Регистрация:
    16 ноя 2015
    Сообщения:
    1.229
    Город:
    Абакан
    Имя:
    Вячеслав
    Усредняй. Как усреднять выше хорошо разобрано Артемом и Андреем.
    --- Сообщения объединены, 24 ноя 2017 ---
    Усредняй. Как усреднять выше хорошо разобрано Артемом и Андреем.
    Я использую такой метод:
    При считывании данных мы не заменяем старое значение, а накапливаем среднее. В вашем коде это будет выглядеть так:
    1. Строку
    Код:
    int analogueValue = analogRead(sensorPin);  // читаем аналоговый пин A0
    меняем на
    Код:
    analogueValue += analogRead(sensorPin);  // читаем аналоговый пин A0, добавляем новое значение к старому
    analogueValue /= 2;  //делим получившееся значение пополам, тем самым получая среднее
    Далее, так как мы убрали объявление переменной в процедуре "loop", нам нужно объявить ее раньше.
    В Setup прописываем
    Код:
    int analogueValue = analogRead(sensorPin); //Инициализируем переменную
     
  8. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    Спасибо, только это просто изменило диапазон данных в "мап" и всё. Подправил на поделенное (670-970 на 278-432) и на индикаторе те же цифры, и так же быстро и нервно меняются...

    Вероятно нужно использовать фильтр на вывод, а не на считывание?
    Сейчас попробую поковыряться в коде, который мне дал один коллега по соседству.
     
  9. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Ещё бы, так как переменная как статическая никак не объявлена.
    Если сделать как написано:
    В Setup прописываем
    int analogueValue = analogRead(sensorPin); //Инициализируем переменную

    то мы просто создаём локальную (только в setup) переменную, которая снаружи никак не видна
    Поэтому переменная должна быть объявлена как глобальная (в самом начале, до setup и loop):
    int analogueValue;
    а в setup только принициализирована:
    analogueValue = analogRead(sensorPin); //Инициализируем переменную
    Вот так должно работать. Но работать всё равно будет плохо - усреднение слабое - желательно порядка 10% добавлять за цикл (см. предлагаемые мной в ветке варианты кода).
    --- Сообщения объединены, 24 ноя 2017 ---
    PS: код жуткий совершенно. Да и сама реализация динамической индикации через Ж.
     
  10. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    не знаю.. ничего не меняется. В смысле не замедляется.

    Может что не так вписал (( При просто вставке этих делений на индикаторе белиберда вместо цифр, т.е. данные наверное делятся и перестают нормально пониматься функцией МАП и выводится фигня.
    Код:
    //********************************************************************
    //  Name    : Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, переменный резистор
    //  Author  : CheBuraw
    //  Date    : 11 Feb, 2015
    //  Version : 0.9
    //********************************************************************
    int latchPin = 8;     //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты
    int clockPin = 12;    //Пин подключен к SH_CP входу 74HC595
    int dataPin = 11;     //Пин подключен к DS входу 74HC595
    
    int TimeLight = 5;  //время для разогрева сегментов
    int sensorPin=A0;
    int analogueValue;
    
    byte SegDisplay; // переменная для вывода символов на индикаторе
    byte RazrDisplay; // переменная для включения разрядов
    unsigned long timer, count, timerMeasure, countMeasure;
    
    // Настройка комбинации для отображения каждого номера на дисплее.
    // Комбинация выбрана на основе таблицы отображаемого знака данным порта
    // Соответственно { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , dp, - }
    byte g_digits[12]={192,249,164,176,153,146,130,248,128,144,127,255}; //массив цифр, генерирующий из сегментов цифры
    byte g_registerArray[2]={2,1}; //массив цифр, указывающий разряды
    
    
    void setup() {
    // обозначаем все пины как выходы
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      pinMode(13, OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
    
    
      int disp = 0; //создаем переменную для вывода на экран
    
    
    //  analogueValue = analogRead(sensorPin);  // читаем аналоговый пин A0
    
      analogueValue += analogRead(sensorPin);  // читаем аналоговый пин A0, добавляем новое значение к старому
      analogueValue /= 2;  //делим получившееся значение пополам, тем самым получая среднее
      Serial.println(analogueValue);
      analogueValue = map(analogueValue, 670, 949, 0, 30); //преобразуем диапазон с А0 (0-1023) в нужный нам (0-8888)
      disp = analogueValue; // записываем получившуюся после преобразования цифру в переменну для вывода на экран
    
    // Разбиваем цифру по разрядам индикатора
      if (disp < 10) // если наша цифра меньше 10, то
      {
         Indicate(0, 10); // пишем в первый разряд пусто
        Indicate(1, disp); // пишем во второй разряд нашу цифру
      }
      if (disp < 7) // если наша цифра меньше 7, то
      {
        digitalWrite(13, HIGH);
    //    else if (disp > 10)
    //    {
    //    delay(250);              // wait for a second
    //    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    //    delay(250);              // wait for a second
        }
      else if (disp > 10); // если наша цифра больше 10, то
    
        Indicate(0, disp / 10); // пишем в первый разряд - цифру делёную на 10
        Indicate(1, disp % 10); // пишем во второй разряд цифру оставшуюся от деления на 10
    /*
    Допустим наша цифра 25.
      Если мы ее поделим на 10, то у нас получится 2,5. Цифры после запятой, в данном случае,
    у нас не остаются. Таким образом мы имеем в третем разряде цифру 2.
      В чевертый разряд мы, как раз и записываем цифру-остаток полученную в результате деления.
    В нашем случае это и есть та самая 5.
    Аналогичным образом разбивается наша цифра и далее.
    */
      }
    
    
    void Indicate(int r,int x)
    {
    SegDisplay=g_digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре.
    RazrDisplay=g_registerArray[r];  // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре.
      digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
          shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда)
          shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay);  // Записываем информацию для первого регистра (Номер символа)
      digitalWrite(latchPin, HIGH);  //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    
       delay(TimeLight); // пауза, чтобы сегменты "разгорелись"
    }
    Там закоментировал кусок, это по совету знакомого пытаюсь воткнуть фильтр, но делаю это просто перетаскиванием из его кода в свой, "пока не перестанет выдавать ошибки" )
     
  11. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Так я говорил - сглаживание слишком слабое. Лучше немного полистать ветку и сделать сглаживание с добавлением примерно 10%.
     
  12. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    Ясно, спасибо. Чтение чужих/под другие задачи кодов мне ничего не даст к сожалению. Из всех буковок языка я пока запомнил отчётливо только делей и иф...
    Пойду пытать гугл, может поможет.
     
  13. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Так а чем гугл поможет, если вы из него ничего скомпилировать для себя не сможете? :)
    Во-первых - придётся уйти в float, так как точности integer для длинного округления недостаточно.
    Выглядеть это будет примерно так:
    В разделе глобальных переменных надо объявить:

    float analogValue;
    const float int_coeff = 0.01f;

    В setup

    analogValue = (float) analogRead(sensorPin);

    Ну и в loop

    analogValue = (analogValue * (1.0f - int_coeff)) + (float) analogRead(sensorPin) * int_coeff;
    disp = map(round(analogueValue), 670, 949, 0, 30);

    Для настройки степени сглаживания надо играться значением int_coeff - оно должно быть от 0 (время реакции равно бесконечности) до 1 (нет сглаживания).
     
  14. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    просто в надежде на подобные вашим советы, т.е. вживую как бы спросить, а не просто читать тексты теории (я в курсе нынешнего тренда везде отправлять учить мануалы и т.п. ).
    после этого вообще ничего не выводится.
    Наверное оставлю как есть, пусть мельтишат цифры, за то выводится )
     
  15. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Код давайте - посмотрю - где ошибка.
     
  16. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    Вставил только "ваши строки"

    Код:
    //********************************************************************
    //  Name    : Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, переменный резистор
    //  Author  : CheBuraw
    //  Date    : 11 Feb, 2015
    //  Version : 0.9
    //********************************************************************
    int latchPin = 8;     //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты
    int clockPin = 12;    //Пин подключен к SH_CP входу 74HC595
    int dataPin = 11;     //Пин подключен к DS входу 74HC595
    
    int TimeLight = 5;  //время для разогрева сегментов
    int sensorPin=A0;
    int analogueValue;
    
    byte SegDisplay; // переменная для вывода символов на индикаторе
    byte RazrDisplay; // переменная для включения разрядов
    //unsigned long timer, count, timerMeasure, countMeasure;
    float analogValue;
    const float int_coeff = 0.01f;
    
    // Настройка комбинации для отображения каждого номера на дисплее.
    // Комбинация выбрана на основе таблицы отображаемого знака данным порта
    // Соответственно { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , dp, - }
    byte g_digits[12]={192,249,164,176,153,146,130,248,128,144,127,255}; //массив цифр, генерирующий из сегментов цифры
    byte g_registerArray[2]={2,1}; //массив цифр, указывающий разряды
    int disp = 0; //создаем переменную для вывода на экран
    
    void setup() {
    // обозначаем все пины как выходы
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      pinMode(13, OUTPUT);
      analogValue = (float) analogRead(sensorPin);
     
      Serial.begin(9600);
    }
    
    void loop() {
     
       
    /*
      analogueValue = analogRead(sensorPin);  // читаем аналоговый пин A0
     
      analogueValue = map(analogueValue, 670, 949, 0, 30); //преобразуем диапазон с А0 (0-1023) в нужный нам (0-8888)
      disp = analogueValue; // записываем получившуюся после преобразования цифру в переменну для вывода на экран
    */
    analogValue = (analogValue * (1.0f - int_coeff)) + (float) analogRead(sensorPin) * int_coeff;
    disp = map(round(analogueValue), 670, 949, 0, 30);
    Serial.println(analogueValue);
    
    // Разбиваем цифру по разрядам индикатора
      if (disp < 10) // если наша цифра меньше 10, то
      {
         Indicate(0, 10); // пишем в первый разряд пусто
        Indicate(1, disp); // пишем во второй разряд нашу цифру
      }
      if (disp < 7) // если наша цифра меньше 7, то
      {
        digitalWrite(13, HIGH);
    //    else if (disp > 10)
    //    {
    //    delay(250);              // wait for a second
    //    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    //    delay(250);              // wait for a second
        }
      else if (disp > 10); // если наша цифра больше 10, то
     
        Indicate(0, disp / 10); // пишем в первый разряд - цифру делёную на 10
        Indicate(1, disp % 10); // пишем во второй разряд цифру оставшуюся от деления на 10
    /*
    Допустим наша цифра 25.
      Если мы ее поделим на 10, то у нас получится 2,5. Цифры после запятой, в данном случае,
    у нас не остаются. Таким образом мы имеем в третем разряде цифру 2.
      В чевертый разряд мы, как раз и записываем цифру-остаток полученную в результате деления.
    В нашем случае это и есть та самая 5.
    Аналогичным образом разбивается наша цифра и далее.
    */
      }
     
    
    void Indicate(int r,int x)
    {
    SegDisplay=g_digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре.
    RazrDisplay=g_registerArray[r];  // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре.
      digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
          shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда)
          shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay);  // Записываем информацию для первого регистра (Номер символа)
      digitalWrite(latchPin, HIGH);  //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    
       delay(TimeLight); // пауза, чтобы сегменты "разгорелись"
    }
     
  17. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    пардон, опечатка, должно быть
    disp = map(round(analogValue), 670, 949, 0, 30);
     
    Revenger нравится это.
  18. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    Ну вот, практически то, что нужно )) Цифры "догоняют" изменения на ноге датчика.
    Я скоро вернусь :sneaky:

    п.с. далеко не уходите пожалуйста (шучу)
    --- Сообщения объединены, 24 ноя 2017 ---
    Забыл спросить, а ошибка из-за analogValue почему? Вернее получается две разных переменных чтоли, analogValue и analogueValue ?
     
  19. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    а, вроде analogueValue можно убрать из описания переменных...
     
  20. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    Да. Я хотел одну, но просто опечатался :)
    Её можно вообще убрать отовсюду.
     
    Revenger нравится это.
  21. Revenger

    Revenger Старший научный сотрудник

    Регистрация:
    10 ноя 2016
    Сообщения:
    912
    Город:
    Ставрополь
    Имя:
    Александр
    вроде убрал.
    Уже вполне нормально получилось. Снежок потает, залезу в проводку сопротивление датчика замерю и можно будет в кучу собирать.
    А пока... пора заняться еще тахометром и спидометром ))
    Можно же по такому же принципу скорость вывести? Судя по недавним постам датчик холла можно "заставить работать на себя"?
    Импульсы стандартные, 6 магнитов в редукторе стоят. Сам датчик холла я паял, не помню маркировку детальки, но 5В сигнальные у него.
    А обороты пока не знаю, там же с индуктивного датчика берутся данные...
     
Реклама. Купить это место.