Oled 0.96 и HC-SR04 без Adafruit
- Войдите на сайт для отправки комментариев
Чт, 20/10/2016 - 15:02
Сегодня первй раз начал разбираться с данными устройствами, по этому наткнулся на проблемы:
Почему в интернете множество примеров с
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]
о мама мия... извините за орфографию
Так в чем проблемы то?
собственно вопросы
1) Почему по сути две библиотеки? Они под разные дисплеи или просто возможностми отличаютс а применять можно к любому oled?
2) библиотека Ultrasonic умеет отображать миллиметры?
3) почему в 9 строке немогу применить int ? дабы избавится от запятой.
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".
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? Извините что готовое уже не могу понять(((
3) "что означает параметр "1" в строке 35?"- это я сам бы хотел знать((
Из описания функции String():
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.
вот оНо что!
the desired decimal places
теперь буду знать, а я уже полез в дебри читая напутствия))
закрыл по ссылке английскую версию и давай здесь искать(
+1)) Спасибо
как насчет 1 и2 вопросов?
1. SSD1306 - это не единственный дисплей, а целое семейство дисплеев, слегка различающихся по своим свойствам. На основе одной общей модели китайцы производят целую кучу "совместимых". Поэтому у них может слегка отличаться инициализация и набор поддерживаемых функций. Разработчики библиотек, как правило, тестируют свот поделки на одном-двух экзкмплярах. Соответственно, работает не на всех. Я, когда писал свою библиотеку, сначала нашел ту, которая работает с моим дисплеем, потом перенес из нее инициализацию в ту, что с моим дисплеем первоначально не работала, но больше устраивала по свойствам, ну и только потом стал дописывать уже свой функционал (в частности, кириллицу). Заодно переделывая те моменты, что мне не понравились (в частности, в несколько раз увеличил скорость работы).
2. Отображает - на чем? По идее, просто должна выдавать число в нужной размерности.
3. Все ответы есть в описании функции по приведенной мной ссылке.
Разработчики библиотек, как правило, тестируют свот поделки на одном-двух экзкмплярах.
Adafruit сам производит модули и делает для них библиотеки: https://learn.adafruit.com/
Китайцы же копируют эти модули, но не всегда точно.
Библиотеки пишет тоже не только Adafruit.
И не факт, что те, кто их пишет, пользуются оригинальными Адафрутовскими железками, а не китайскими.
2. Отображает - на чем? По идее, просто должна выдавать число в нужной размерности.
Отображает на экране, ну получается возвращает либо
float daln = ultrasonic.Ranging(CM);
либо дюймы, если изменить в скобках на INC кажись, но не суть. А суть в том что эта библиотека не возвращает миллиметры. нужно формулу наверное потом дописывать в самой библиотеке.
По третьему вопросу очень ясно)))