Oled 0.96 и HC-SR04 без Adafruit

maxvalin
Offline
Зарегистрирован: 22.02.2016

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

Почему в интернете множество примеров с 

04 #include <Adafruit_SSD1306.h>
05  
06 #define OLED_RESET 4
07  
08 Adafruit_SSD1306 display(OLED_RESET);

 

но мой не работает с ними а работает с #include <OLED_I2C.h>

и второе, не могу в данном прмере использовать int чтоб избавится от  десятой миллиметра.Изначально промудохавшись с #include <Ultrasonic.h> понял что ммиллиметры з нее не вытянуть а если и вытянуть то как это сделать, не известно.

здесь два варианта, изначально закоментированы строки с билиотекой Ultrasonic.h а потом простым чтением портов. Но как только меняю float daln; на int daln. показаний на экране нету.

[code]
#include <SPI.h>
//#include <Wire.h>
#include <OLED_I2C.h>
OLED  myOLED(52, 49, 52); //пины дисплея 
extern uint8_t RusFont[]; // Русский шрифт
extern uint8_t MegaNumbers[]; // Подключение больших шрифтов
extern uint8_t SmallFont[]; // Базовый шрифт без поддержки русскийх символов.
float daln;
 
//#include <Ultrasonic.h>
//Ultrasonic ultrasonic(8,9); //trig 8 , exo 9 
 
void setup(){  
 myOLED.begin();
 myOLED.setFont(RusFont);
 pinMode(8, OUTPUT); 
 pinMode(9, INPUT);
}
 
void loop() {
  int duration, mm; 
  digitalWrite(8, LOW); 
  delayMicroseconds(2); 
  digitalWrite(8, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(8, LOW); 
  duration = pulseIn(9, HIGH); 
  daln = duration / 5.8;
  //float daln = ultrasonic.Ranging(CM);
  myOLED.clrScr(); // Стираем все с экрана
  myOLED.setFont(RusFont);
  myOLED.print("HFCCNJZYBT", CENTER, 1); // Выводим надпись "расстояние"
  myOLED.setFont(MegaNumbers);
  myOLED.print(String (daln, 1), CENTER, 15);   // Отображение значения растояния
  myOLED.update();
  delay(100);
}
[/code]

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

о мама мия... извините за орфографию

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Так в чем проблемы то?

maxvalin
Offline
Зарегистрирован: 22.02.2016

собственно вопросы

1) Почему по сути две библиотеки? Они под разные дисплеи или просто возможностми отличаютс а применять можно к любому oled?

2) библиотека Ultrasonic  умеет отображать  миллиметры?

3) почему в 9 строке немогу применить int ? дабы избавится от запятой. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1) о каких именно библиотеках речь? Если о стандартных библиотеках Ардуино, т их число исчисляется десятками. Причем для 0.96 OLED, насколько мне известно, среди стиандартных нет. Если Вы имеете в виду, зачем две библиотеки от Adafruit, то так они устроены: в одной содержится полный набор всех используемых функций с несколькими виртуальными низкоуровневыми, а в другой содержится как раз описание этих низкоуровневых функций для конкретного "железа".

2) понятия не имею. Насколдько я знаю,  Ultrasonic - это ультразвуковой датчик, следовательно, аопросами отображения его библиотека вообще заниматься не должна.

3) я не специалисьт по С/С++, но мне кажется, дело в том, что вызывается другой конструктор, совсем не тот, который Вам бы хотелось. Чтобы проверить это, ответьте на вопрос: что означает параметр "1" в строке 35?

 

PS. По поводу 3)

Посмотре: https://www.arduino.cc/en/Reference/StringConstructor - действительно, в исходном варианте первый параметр воспринимался как число с плавающей точкой, а второй - число знаков после запятой, то после Ваших исправлений: первый параметр - целое число, а второй - основание (BIN, HEX, DEC).

Отсюда вывод: не нужно менять тип переменной, а в 35 строке заменить "1" на "0".

maxvalin
Offline
Зарегистрирован: 22.02.2016

1) Речь завел о двух типах библиотек это о <OLED_I2C.h> и (<Adafruit_GFX.h> <Adafruit_SSD1306.h>)  О них и хотелось бы узнать. Почему их две, поему у меня первая работает OLED_I2C.h а связка второй (<Adafruit_GFX.h> <Adafruit_SSD1306.h>) нет.

Может что то неправильно сделал, и библиотеки не причем, возможно, ибо первый раз. Просто узнать хотел в чем между ними разница? То что вторая состоит из двух "подбиблиотек" это я понял (спасибо за разъяснение!) Но принципиально к самому экрану можно применять только одну из них <OLED_I2C.h> или (<Adafruit_GFX.h> <Adafruit_SSD1306.h>) или же они под один и тот же дисплей? Только команды в них разные соответственно с функциями.

2) да,  <Ultrasonic.h> это библиотека для ультразвукового датчика! И в ней команды я нашел CM и Inc (сантиметры и дюймы) а нужны были миллиметры.Вот и спросил о них. Ведь она таки и отображает , единицы измерения в ней выставляются. Этот вопрос не относился как вопрос к oled экрану. 

3) "что означает параметр "1" в строке 35?"- это я сам бы хотел знать((

" а в 35 строке заменить "1" на "0" /// почему именно на 0?  Извините что готовое уже не могу понять(((

 

fogary
Offline
Зарегистрирован: 05.03.2016

maxvalin пишет:

3) "что означает параметр "1" в строке 35?"- это я сам бы хотел знать((

Из описания функции String():

Цитата:
Syntax

String(val)
String(val, base)
String(val, decimalPlaces)

Parameters

val: a variable to format as a String - string, char, byte, int, long, unsigned int, unsigned long, float, double
base (optional) - the base in which to format an integral value
decimalPlaces (only if val is float or double) - the desired decimal places

Ваш вариант - последний, т. е. "1" - это кол-во знаков после запятой. Используется только для значений типа float или double, иными словами, с целыми числами не работает.

Попробуйте вовсе убрать "1" для переменной типа int.

maxvalin
Offline
Зарегистрирован: 22.02.2016

вот оНо что!

the desired decimal places

теперь буду знать, а я уже полез в дебри читая напутствия))

закрыл по ссылке английскую версию и давай здесь искать(

+1)) Спасибо

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

как насчет 1 и2 вопросов?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. SSD1306 - это не единственный дисплей, а целое семейство дисплеев, слегка различающихся по своим свойствам. На основе одной общей модели китайцы производят целую кучу "совместимых". Поэтому у них может слегка отличаться инициализация и набор поддерживаемых функций. Разработчики библиотек, как правило, тестируют свот поделки на одном-двух экзкмплярах. Соответственно, работает не на всех. Я, когда писал свою библиотеку, сначала нашел ту, которая работает с моим дисплеем, потом перенес из нее инициализацию в ту, что с моим дисплеем первоначально не работала, но больше устраивала по свойствам, ну и только потом стал дописывать уже свой функционал (в частности, кириллицу). Заодно переделывая те моменты, что мне не понравились (в частности, в несколько раз увеличил скорость работы).

2. Отображает - на чем? По идее, просто должна выдавать число в нужной размерности.

3. Все ответы есть в описании функции по приведенной мной ссылке.

arduinec
Offline
Зарегистрирован: 01.09.2015

andriano пишет:

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

Adafruit сам производит модули и делает для них библиотеки: https://learn.adafruit.com/
Китайцы же копируют эти модули, но не всегда точно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Библиотеки пишет тоже не только Adafruit.

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

maxvalin
Offline
Зарегистрирован: 22.02.2016

andriano пишет:

2. Отображает - на чем? По идее, просто должна выдавать число в нужной размерности.

Отображает на экране,  ну получается возвращает либо

 float daln = ultrasonic.Ranging(CM);

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

По третьему вопросу очень ясно)))