Создать скетч простого вольтметра от 0 до 20 вольт, c десятичной точкой на tm74hc595 и Ардуино uno

Fan3310
Offline
Зарегистрирован: 18.02.2019

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

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Дак на 74HC595 нигде десятичной точки нету, равно как и на Ардуино Uno

Fan3310
Offline
Зарегистрирован: 18.02.2019

Есть модуль tm74hc595 внизу есть 4 точки. Нужно их тупо засветить или нужно программно прописать ? Я только начинаю изучать все это. Ардуина в сериал выдает число с запятой а вот на дисплее запятой нет (

Fan3310
Offline
Зарегистрирован: 18.02.2019

Вот тут пример http://arduinolab.pw/index.php/2015/12/05/dinamicheskaya-indikaciya-i-7-...

И в комментах хороший пример но я не могу норм вывести значение чтоб была десятичная точка

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

возьми такой, и не морочь людям голову 

https://ru.aliexpress.com/item/0-36-0-36-TM1637-7/32962489291.html

Fan3310
Offline
Зарегистрирован: 18.02.2019

Чем он лучше та?) А на нем типо легче?
Я же помощи прошу а не совета.

sadman41
Offline
Зарегистрирован: 19.10.2016

Модули TM-ок попадаются с разными разделителями. У кого-то точка, у кого-то двоеточие. У товарища в либе нет принта под float, я так мыслю.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

я ему ссылку дал на модуль с точками.  У меня 3 таких работает нормально и без заморочек.  6 строчек кода - и ставь десятичную точку куда хошь

Fan3310
Offline
Зарегистрирован: 18.02.2019

Как сюда фото и код Скетча вставить ?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Fan3310 пишет:
Как сюда фото и код Скетча вставить ?

Азнакомица с http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov

Fan3310
Offline
Зарегистрирован: 18.02.2019
#define SCLK 7 // пины ардуины
#define RCLK 6 
#define DIO 5 

byte digitBuffer[4];
unsigned long showTime = 0;

int v;
int b;
int z;
int j;

void setup(){ 
pinMode(RCLK, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(DIO, OUTPUT); 
}

void loop(){ 
z = analogRead(A0); 
j = map(z, 0, 1023, 0, 15); 
b = map(z, 0, 1023, 0, 9999);

if(millis() - showTime > 1000) { 
v= b; 
showTime = millis();
} 

for (int i =j; i <= 15; i++){
showDisplay2(); 
}
for (int i =15-j; i <= 15; i++){
showDisplay1(); 
} 
}
void showDisplay1(){
// заполняем массив

digitBuffer[0] = v % 10000/1000; 
digitBuffer[1] = v % 1000/100;
digitBuffer[2] = v % 100/10;
digitBuffer[3] = v % 10;

const byte digit[10] = { // маска для 7 сигментного индикатора 
0b11000000, // 0
0b11111001, // 1
0b10100100, // 2
0b10110000, // 3
0b10011001, // 4
0b10010010, // 5
0b10000010, // 6
0b11111000, // 7
0b10000000, // 8
0b10010000, // 9 
};

const byte chr[4] = { // маска для разряда
0b00001000, 
0b00000100, 
0b00000010, 
0b00000001 
};

// отправляем в цикле по два байта в сдвиговые регистры
for(byte i = 0; i <= 3; i++){ 
digitalWrite(RCLK, LOW); // открываем защелку
shiftOut(DIO, SCLK, MSBFIRST, digit[digitBuffer[i]]); // отправляем байт с "числом"
shiftOut(DIO, SCLK, MSBFIRST, chr[i]); // включаем разряд
digitalWrite(RCLK, HIGH); // защелкиваем регистры 
} 
}

void showDisplay2(){ 

const byte digit[1] = { // маска для 7 сегментного индикатора 
0b11111111, // все выключено 
};

const byte chr[4] = { // маска для разряда, все выключено
0b00000000, 
0b00000000, 
0b00000000, 
0b00000000 
};

// отправляем в цикле по два байта в сдвиговые регистры
for(byte i = 0; i <= 3; i++){ 
digitalWrite(RCLK, LOW); // открываем защелку
shiftOut(DIO, SCLK, MSBFIRST, digit[0]); // отправляем байт с "числом"
shiftOut(DIO, SCLK, MSBFIRST, chr[i]); // включаем разряд
digitalWrite(RCLK, HIGH); // защелкиваем регистры 
} 
}

 

Fan3310
Offline
Зарегистрирован: 18.02.2019

что нужно изменить чтоб он выдавал float на дисплей.     3.3 например

при функции map точка теряется.

вычисления должны быть такие ? 

float rawReading = analogRead(analogInput);
float volts = rawReading / 204.6;
disp.digit4(volts);
delay(500);
 
Fan3310
Offline
Зарегистрирован: 18.02.2019

Чуваки помогите я вас рассцелую ))

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Курсовик, видима, горит

Fan3310
Offline
Зарегистрирован: 18.02.2019

нет. я не для учебы

b707
Offline
Зарегистрирован: 26.05.2017

скока платишь? :)

man9913
Offline
Зарегистрирован: 19.03.2016

сделаю за дошик. каждому

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это ж вроде платный раздел. Ну, спросил человек, назначить цену и договариваться. Чего сыр-бор то разводить?

Fan3310
Offline
Зарегистрирован: 18.02.2019

кто сможет сделать? напишите цену я выберу, рублей 200 норм?) я если посижу додумаюсь но времени мало(( 

man9913
Offline
Зарегистрирован: 19.03.2016

луче посиди

Fan3310
Offline
Зарегистрирован: 18.02.2019

спасибо за неоказанную помощь 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Fan3310 пишет:

спасибо за неоказанную помощь 

Так тебе её никто не окажет. То у тебя 

Fan3310 пишет:

 рублей 200 норм

А то вообще распугиваешь народ

Fan3310 пишет:

Чуваки помогите я вас рассцелую ))

Тут по большей части люди традиционной ориентации собрались.

Fan3310
Offline
Зарегистрирован: 18.02.2019

языки есть? я же вопрос спросил сколько? что молчите та. ну скажите цену и сроки. что цену та набивать. нет так нет.

Fan3310
Offline
Зарегистрирован: 18.02.2019

одни сплетники да советчики

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

Fan3310 пишет:

спасибо за неоказанную помощь 

да тут реально не сложно все. Десятичная точка на твоем индикаторе - судя по всему старший бит. Управление инверсное, то есть если бит "0" - точка горит, бит "1" - гаснет.

А дальше тебе надо разбить целую часть числа на разряды, чтобы выяснить, сколько у тебя цифр ДО ЗАПЯТОЙ - и после этого числа цифр вывести на экран точку.

 

 

karamzin01
Offline
Зарегистрирован: 08.03.2018

Р е а л и з у е м о - maslachenko767@mail.ru , консультации, подбор компонентов бесплатно, гарантии

karamzin01
Offline
Зарегистрирован: 08.03.2018

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

ALEGYR
Offline
Зарегистрирован: 20.09.2018

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

А чего тут странного?!  Человек просто попутал раздел Песочница. Раздел для новичков или  Аппаратные вопросы с разделом Ищу исполнителя, вот и путает бюджет с безвозмездной помощью.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ALEGYR пишет:
Человек просто попутал раздел

Почему попутал? Вроде, всё праивльно понимает

Fan3310 пишет:

я же вопрос спросил сколько? что молчите та. ну скажите цену и сроки. .

Другое дело, что о деньгах у него странное представление

Fan3310 пишет:

рублей 200 норм?

хотя, часть, похоже, предлагает натурой оплатить,

Fan3310 пишет:

Чуваки помогите я вас рассцелую ))

но это всё-таки "на любителя".

ALEGYR
Offline
Зарегистрирован: 20.09.2018

ЕвгенийП пишет:

ALEGYR пишет:
Человек просто попутал раздел

Почему попутал? Вроде, всё праивльно понимает

Fan3310 пишет:

я же вопрос спросил сколько? что молчите та. ну скажите цену и сроки. .

Так это он только потом понял что тут платить надо,  а с самого начала писал

 

Fan3310 пишет:
Есть пару готовых скетчей но никак не могу сделать значение десятичным тоесть с точкой. Помогите пожалуйста.

и даже требовал

Fan3310 пишет:
Я же помощи прошу а не совета.

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Fan3310 пишет:

кто сможет сделать? напишите цену я выберу, рублей 200 норм?) я если посижу додумаюсь но времени мало(( 

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

lean_74
Offline
Зарегистрирован: 22.12.2015

На пример моего термометра(времен начала изучения ардуино)  бесплатно. Как переделать в замер напряжения - даже не спрашивай.

/*
  4-разрядный 7-сегментный индикатор. общий анод(катод)
                 1  A  F 2  3  B
  _______________|__|__|__|__|__|_____________
  |         |         |    |         |         |
  |    A    |    A    |    |    A    |    A    |
  | F     B | F     B | dp | F     B | F     B |
  |    G    |    G    |    |    G    |    G    |
  | E     C | E     C | dp | E     C | E     C |
  |    D    |    D    |    |    D    |    D    |
  |_________|_________|____|_________|_________|
                |  |  |  |  |  |
                E  D dp  C  G  4

  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 B -|1 *  16|-5V
   LED C -|2    15|-LED A
   LED D -|3    14|-PIN 11
   LED E -|4    13|-GND
   LED F -|5    12|-PIN 8
   LED G -|6    11|-PIN 12 ; 1uF TO GND
   LED dp-|7    10|-5V
      GND-|8_____9|-NILL
  // A  B  C  D  E  F  G  Dp
  // 8  7  6  5  4  3  2   1  -это номер бита в number[]

*/

#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire oneWire(15);// вход датчиков 18b20 A1
DallasTemperature ds(&oneWire);


unsigned long lastMillis = millis();

boolean flag = 0;

byte qty; // количество градусников на шине
float temp;  // текущая температура



int latchPin = 8;     //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты
int clockPin = 12;    //Пин подключен к SH_CP входу 74HC595
int dataPin = 13;     //Пин подключен к DS входу 74HC595

int TimeLight = 5;  //время для разогрева сегментов
int timeReadtemp =3; // время опроса термометра


//// Настройка комбинации для отображения каждого номера на дисплее. общий анод
//byte g_digits[] = {
//  0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001,  // 0 1 2 3 4
//  0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000,  // 5 6 7 8 9
//
//  0b01000000, 0b01111001, 0b00100100, 0b00110000, 0b00011001, // 0. 1. 2. 3. 4.
//  0b00010010, 0b00000010, 0b01111000, 0b00000000, 0b00010000, // 5. 6. 7. 8. 9.
//
//  0b11111111, 0b10011100,  // пустой знак, градус
//  0b01111111, 0b10001000, //точка  A
//  0b10100001, 0b10001110, 0b10000110, 0b11001110, 0b11000110,// d F Е Г С
//  0b10000111, 0b10001100, 0b10111111//  t,P, минус
//};      //
//
//byte g_registerArray[] = {
//  0b00000001, 0b00000010, 0b00000100, 0b00001000
//}; //массив цифр, указывающий разряды


// Настройка комбинации для отображения каждого номера на дисплее. общий катод
byte g_digits[] = {
  0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001,  // 0 1 2 3 4
  0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000,  // 5 6 7 8 9

  0b01000000, 0b01111001, 0b00100100, 0b00110000, 0b00011001, // 0. 1. 2. 3. 4.
  0b00010010, 0b00000010, 0b01111000, 0b00000000, 0b00010000, // 5. 6. 7. 8. 9.

  0b11111111, 0b10011100,  // пустой знак, градус
  0b01111111, 0b10001000, //точка  A
  0b10100001, 0b10001110, 0b10000110, 0b11001110, 0b11000110,// d F Е Г С
  0b10000111, 0b10001100, 0b10111111, 0b11000001, 0b11001000//  t,P, минус, U, П
};      //

byte g_registerArray[]={
  0b00000001, 0b00000010, 0b00000100,0b00001000
}; //массив цифр, указывающий разряды



void setup() {
  Wire.begin();
  
//Serial.begin(115200);

  // обозначаем все пины как выходы
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  ds.begin();
  ds.setResolution(12);    // установить разрешение (точность)
  ds.setWaitForConversion(false);  // отключить ожидание

  qty = ds.getDeviceCount();
}

void loop() {


    if (flag == 0)
    {
      //перед измерением температуры очищаем дисплей от мусора
          Indicate(3, 20);
          Indicate(2, 20);
          Indicate(1,20);
          Indicate(0,20);

      ds.requestTemperatures(); // считываем температуру с датчикa
      temp = ds.getTempCByIndex(0);
     
      lastMillis = millis();
       flag = 1;
    }

    if (millis() - lastMillis >= timeReadtemp * 1000) {
      //
      flag = 0;
     }

  printTemp(temp);

}




void   printTemp(float t) {
  int temp10 = 0;
  temp10 = t * 10;

  // если температура плюсовая выводим с нулем
  if (t >= 0) {

    if (temp10 < 100) // если наша цифра меньше 100, то
    {
      Indicate(3, 20); // пишем в первый разряд пусто
      Indicate(2,  temp10 / 10 + 10); // пишем во второй разряд температуру
      Indicate(1, temp10 %  10); // пишем в третий разряд - цифру делёную на 10
      Indicate(0, 21); // пишем в четвертый разряд градус
    }
    else
    {
      Indicate(3, temp10 / 100);
      Indicate(2, (temp10 % 100) / 10 + 10);
      Indicate(1, temp10 % 10);
      Indicate(0, 21);
    }

  }
  else {
    // тутнадо вывод отрицательных температур дописать
    if (abs(temp10) < 100) // если наша цифра меньше 100, то
    {
      Indicate(3, 31); // пишем в первый разряд минус
      Indicate(2,  abs(temp10) / 10 + 10); // пишем во второй разряд температуру
      Indicate(1, abs(temp10) %  10); // пишем в третий разряд - цифру делёную на 10
      Indicate(0, 21); // пишем в четвертый разряд градус
    }
    else
    {
      Indicate(3, 31);      
      Indicate(2, abs(temp10) / 100);
      Indicate(1, (abs(temp10) % 100) / 10 + 10);
      Indicate(0, abs(temp10) % 10);

    }
    
  }
}


void Indicate(int r, int x)
{
  digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
  shiftOut(dataPin, clockPin, MSBFIRST, g_digits[x]); // Записываем информацию для второго регистра (Номер разряда)
  shiftOut(dataPin, clockPin, MSBFIRST, g_registerArray[r]);  // Записываем информацию для первого регистра (Номер символа)
  digitalWrite(latchPin, HIGH);  //"защелкиваем" регистр, тем самым устанавливая значения на выходах

  delay(TimeLight); // пауза, чтобы сегменты "разгорелись"
}