Создать скетч простого вольтметра от 0 до 20 вольт, c десятичной точкой на tm74hc595 и Ардуино uno
- Войдите на сайт для отправки комментариев
Пнд, 18/02/2019 - 14:14
Есть пару готовых скетчей но никак не могу сделать значение десятичным тоесть с точкой. Помогите пожалуйста.
Дак на 74HC595 нигде десятичной точки нету, равно как и на Ардуино Uno
Есть модуль tm74hc595 внизу есть 4 точки. Нужно их тупо засветить или нужно программно прописать ? Я только начинаю изучать все это. Ардуина в сериал выдает число с запятой а вот на дисплее запятой нет (
Вот тут пример http://arduinolab.pw/index.php/2015/12/05/dinamicheskaya-indikaciya-i-7-...
И в комментах хороший пример но я не могу норм вывести значение чтоб была десятичная точка
возьми такой, и не морочь людям голову
https://ru.aliexpress.com/item/0-36-0-36-TM1637-7/32962489291.html
Чем он лучше та?) А на нем типо легче?
Я же помощи прошу а не совета.
Модули TM-ок попадаются с разными разделителями. У кого-то точка, у кого-то двоеточие. У товарища в либе нет принта под float, я так мыслю.
я ему ссылку дал на модуль с точками. У меня 3 таких работает нормально и без заморочек. 6 строчек кода - и ставь десятичную точку куда хошь
Как сюда фото и код Скетча вставить ?
Азнакомица с http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov
#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); // защелкиваем регистры } }что нужно изменить чтоб он выдавал float на дисплей. 3.3 например
при функции map точка теряется.
вычисления должны быть такие ?
Чуваки помогите я вас рассцелую ))
Курсовик, видима, горит
нет. я не для учебы
скока платишь? :)
сделаю за дошик. каждому
Это ж вроде платный раздел. Ну, спросил человек, назначить цену и договариваться. Чего сыр-бор то разводить?
кто сможет сделать? напишите цену я выберу, рублей 200 норм?) я если посижу додумаюсь но времени мало((
луче посиди
спасибо за неоказанную помощь
спасибо за неоказанную помощь
Так тебе её никто не окажет. То у тебя
рублей 200 норм
А то вообще распугиваешь народ
Чуваки помогите я вас рассцелую ))
Тут по большей части люди традиционной ориентации собрались.
языки есть? я же вопрос спросил сколько? что молчите та. ну скажите цену и сроки. что цену та набивать. нет так нет.
одни сплетники да советчики
Надо было с этого начинать. А ты неправильно зашёл - ввязался в дискуссию, коды какие-то, примеры. У народа уже настрой не на то. Попробуй сделать новую тему, только сразу пиши не в терминах "помощи", а в терминах "заказа", чтобы недоразумений не было.
спасибо за неоказанную помощь
да тут реально не сложно все. Десятичная точка на твоем индикаторе - судя по всему старший бит. Управление инверсное, то есть если бит "0" - точка горит, бит "1" - гаснет.
А дальше тебе надо разбить целую часть числа на разряды, чтобы выяснить, сколько у тебя цифр ДО ЗАПЯТОЙ - и после этого числа цифр вывести на экран точку.
Р е а л и з у е м о - maslachenko767@mail.ru , консультации, подбор компонентов бесплатно, гарантии
зачем спрашивать про бюджет, если хотите получить услугу бесплатно. странно это всё..
А чего тут странного?! Человек просто попутал раздел Песочница. Раздел для новичков или Аппаратные вопросы с разделом Ищу исполнителя, вот и путает бюджет с безвозмездной помощью.
Почему попутал? Вроде, всё праивльно понимает
я же вопрос спросил сколько? что молчите та. ну скажите цену и сроки. .
Другое дело, что о деньгах у него странное представление
рублей 200 норм?
хотя, часть, похоже, предлагает натурой оплатить,
Чуваки помогите я вас рассцелую ))
но это всё-таки "на любителя".
Почему попутал? Вроде, всё праивльно понимает
я же вопрос спросил сколько? что молчите та. ну скажите цену и сроки. .
Так это он только потом понял что тут платить надо, а с самого начала писал
и даже требовалFan3310 пишет: Я же помощи прошу а не совета.
кто сможет сделать? напишите цену я выберу, рублей 200 норм?) я если посижу додумаюсь но времени мало((
Да что тут думать? Вот бесплатно: надо разбить целую часть числа на разряды, чтобы выяснить, сколько у тебя цифр до запятой - и после этого числа цифр вывести на экран точку.
На пример моего термометра(времен начала изучения ардуино) бесплатно. Как переделать в замер напряжения - даже не спрашивай.
/* 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); // пауза, чтобы сегменты "разгорелись" }