Нужно вывести температуру с DS18B20 на OLED LCD 0,96 128x64
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Ситуация следующая, в автомобиле беда с датчиком температуры - вечно бред показывает. Менял на новый и через некоторое время все постарому. Поэтому решил не мучится с этим безобразием, и сделать эктронную замену.
Примеров того как собрать воедино с oled дисплеями 16х2 или от нокиа - хватает, но в моем случае используется именно экран LED LCD 0,96. Выбор по двум причинам: первая - несмотря на размеры он хорошо читается; вторая - в отличии от нокиа я его легко простым паяльником припояю, когда все заработает и дело до платы дойдет.
У меня получилось по отдельности запусть датчик температуры DS18B20 и сам дисплей. Да забыл сказать, что все это на Arduino NANO V3.0 присоединяется мной.
И так отдельно, всем известный пример, подключения дисплея
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #define NUMFLAKES 10 #define XPOS 0 #define YPOS 1 #define DELTAY 2 #define LOGO16_GLCD_HEIGHT 16 #define LOGO16_GLCD_WIDTH 16 static const unsigned char PROGMEM logo16_glcd_bmp[] = { B00000000, B11000000, B00000001, B11000000, B00000001, B11000000, B00000011, B11100000, B11110011, B11100000, B11111110, B11111000, B01111110, B11111111, B00110011, B10011111, B00011111, B11111100, B00001101, B01110000, B00011011, B10100000, B00111111, B11100000, B00111111, B11110000, B01111100, B11110000, B01110000, B01110000, B00000000, B00110000 }; #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif void setup() { Serial.begin(9600); // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64) // init done // Show image buffer on the display hardware. // Since the buffer is intialized with an Adafruit splashscreen // internally, this will display the splashscreen. display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); // draw a single pixel display.drawPixel(10, 10, WHITE); // Show the display buffer on the hardware. // NOTE: You _must_ call display after making any drawing commands // to make them visible on the display hardware! display.display(); delay(2000); display.clearDisplay(); // draw many lines testdrawline(); display.display(); delay(2000); display.clearDisplay(); // draw rectangles testdrawrect(); display.display(); delay(2000); display.clearDisplay(); // draw multiple rectangles testfillrect(); display.display(); delay(2000); display.clearDisplay(); // draw mulitple circles testdrawcircle(); display.display(); delay(2000); display.clearDisplay(); // draw a white circle, 10 pixel radius display.fillCircle(display.width()/2, display.height()/2, 10, WHITE); display.display(); delay(2000); display.clearDisplay(); testdrawroundrect(); delay(2000); display.clearDisplay(); testfillroundrect(); delay(2000); display.clearDisplay(); testdrawtriangle(); delay(2000); display.clearDisplay(); testfilltriangle(); delay(2000); display.clearDisplay(); // draw the first ~12 characters in the font testdrawchar(); display.display(); delay(2000); display.clearDisplay(); // draw scrolling text testscrolltext(); delay(2000); display.clearDisplay(); // text display tests display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Hello, world!"); display.setTextColor(BLACK, WHITE); // 'inverted' text display.println(3.141592); display.setTextSize(2); display.setTextColor(WHITE); display.print("0x"); display.println(0xDEADBEEF, HEX); display.display(); delay(2000); // miniature bitmap display display.clearDisplay(); display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); display.display(); // invert the display display.invertDisplay(true); delay(1000); display.invertDisplay(false); delay(1000); // draw a bitmap icon and 'animate' movement testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH); } void loop() { } void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { uint8_t icons[NUMFLAKES][3]; // initialize for (uint8_t f=0; f< NUMFLAKES; f++) { icons[f][XPOS] = random(display.width()); icons[f][YPOS] = 0; icons[f][DELTAY] = random(5) + 1; Serial.print("x: "); Serial.print(icons[f][XPOS], DEC); Serial.print(" y: "); Serial.print(icons[f][YPOS], DEC); Serial.print(" dy: "); Serial.println(icons[f][DELTAY], DEC); } while (1) { // draw each icon for (uint8_t f=0; f< NUMFLAKES; f++) { display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, WHITE); } display.display(); delay(200); // then erase it + move it for (uint8_t f=0; f< NUMFLAKES; f++) { display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, BLACK); // move it icons[f][YPOS] += icons[f][DELTAY]; // if its gone, reinit if (icons[f][YPOS] > display.height()) { icons[f][XPOS] = random(display.width()); icons[f][YPOS] = 0; icons[f][DELTAY] = random(5) + 1; } } } } void testdrawchar(void) { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); for (uint8_t i=0; i < 168; i++) { if (i == '\n') continue; display.write(i); if ((i > 0) && (i % 21 == 0)) display.println(); } display.display(); } void testdrawcircle(void) { for (int16_t i=0; i<display.height(); i+=2) { display.drawCircle(display.width()/2, display.height()/2, i, WHITE); display.display(); } } void testfillrect(void) { uint8_t color = 1; for (int16_t i=0; i<display.height()/2; i+=3) { // alternate colors display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2); display.display(); color++; } } void testdrawtriangle(void) { for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) { display.drawTriangle(display.width()/2, display.height()/2-i, display.width()/2-i, display.height()/2+i, display.width()/2+i, display.height()/2+i, WHITE); display.display(); } } void testfilltriangle(void) { uint8_t color = WHITE; for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) { display.fillTriangle(display.width()/2, display.height()/2-i, display.width()/2-i, display.height()/2+i, display.width()/2+i, display.height()/2+i, WHITE); if (color == WHITE) color = BLACK; else color = WHITE; display.display(); } } void testdrawroundrect(void) { for (int16_t i=0; i<display.height()/2-2; i+=2) { display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE); display.display(); } } void testfillroundrect(void) { uint8_t color = WHITE; for (int16_t i=0; i<display.height()/2-2; i+=2) { display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color); if (color == WHITE) color = BLACK; else color = WHITE; display.display(); } } void testdrawrect(void) { for (int16_t i=0; i<display.height()/2; i+=2) { display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE); display.display(); } } void testdrawline() { for (int16_t i=0; i<display.width(); i+=4) { display.drawLine(0, 0, i, display.height()-1, WHITE); display.display(); } for (int16_t i=0; i<display.height(); i+=4) { display.drawLine(0, 0, display.width()-1, i, WHITE); display.display(); } delay(250); display.clearDisplay(); for (int16_t i=0; i<display.width(); i+=4) { display.drawLine(0, display.height()-1, i, 0, WHITE); display.display(); } for (int16_t i=display.height()-1; i>=0; i-=4) { display.drawLine(0, display.height()-1, display.width()-1, i, WHITE); display.display(); } delay(250); display.clearDisplay(); for (int16_t i=display.width()-1; i>=0; i-=4) { display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE); display.display(); } for (int16_t i=display.height()-1; i>=0; i-=4) { display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE); display.display(); } delay(250); display.clearDisplay(); for (int16_t i=0; i<display.height(); i+=4) { display.drawLine(display.width()-1, 0, 0, i, WHITE); display.display(); } for (int16_t i=0; i<display.width(); i+=4) { display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE); display.display(); } delay(250); } void testscrolltext(void) { display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(10,0); display.clearDisplay(); display.println("scroll"); display.display(); display.startscrollright(0x00, 0x0F); delay(2000); display.stopscroll(); delay(1000); display.startscrollleft(0x00, 0x0F); delay(2000); display.stopscroll(); delay(1000); display.startscrolldiagright(0x00, 0x07); delay(2000); display.startscrolldiagleft(0x00, 0x07); delay(2000); display.stopscroll(); }
В результате чего как ив видео у Дмирия Осипова - все работает (https://www.youtube.com/watch?v=a583vq0vXyg).
Далее пробую подключить отдельно датчик температуры DS18B20. Не с первого раза, но и тут проблем не возникло:
#include <OneWire.h> // DS18S20 Temperature chip i/o OneWire ds(7); // работаем через пин 7 void setup(void) { // инициализация портов ввода/вывода // подключаем последовательный вывод Serial.begin(9600); } void loop(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds.search(addr)) { Serial.print("No more addresses.\n"); ds.reset_search(); return; } Serial.print("R="); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return; } if ( addr[0] == 0x28) { Serial.print("Device is a DS18B20 family device.\n"); } else { Serial.print("Device family is not recognized: 0x"); Serial.println(addr[0],HEX); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // запускаем преобразование, оставляем питание на линии (второй параметр =1) delay(1000); // должно хватить 750 мс // после завершения преобразования нужно снять питание с линии вызвав метод ds.depower // метод reset сделает это за нас present = ds.reset(); ds.select(addr); ds.write(0xBE); // чтение показаний датчика Serial.print("P="); Serial.print(present,HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // читаем 9 байт data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print( OneWire::crc8( data, 8), HEX); Serial.println(); float Tc_100; Tc_100 = (data[1]*256. + data[0])/16.; Serial.print("T="); Serial.print(Tc_100); Serial.print("\n"); }
Все по отдельности работает. Тут можно сказать, что и "Медведя на мотоцикле ездить научить можно", а вот дальше... дальше я не знаю. Все выше - это списанное как в школе не сделанное домашнее задание когда-то.
Я, конечно, не стал сразу же писать Вам и просить о помощи, а попробовал сам слепить этих два скетча, но в итоге на экране мишура, а датчик температуры как отсылал в com порт данные - так и шлет:
#include <OneWire.h> // Подключаем библиотеку датчика температуры #include <SPI.h> #include <Wire.h> // Подключаем библиотеку для шины I2C / для работы дисплея. #include <Adafruit_GFX.h> // Скачанная библиотека для дисплея. #include <Adafruit_SSD1306.h> // Скачанная библиотека для дисплея. // Для дисплея. // Дисплей подключаем по 2 проводам, на Arduino Nano v3 (A4 = SDA) и (A5 = SCL). #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); // -------------------------------------- // Для датчика температуры назначаем D7 OneWire ds(7); // работаем через пин 7 // -------------------------------------- void setup(){ // Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 0.96" 128X64 OLED LCD Display)I2C АДРЕС. SPI.begin(); // инициализация SPI / Init SPI bus. // инициализация портов ввода/вывода // подключаем последовательный вывод Serial.begin(9600); } void loop() { byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds.search(addr)) { Serial.print("No more addresses.\n"); ds.reset_search(); return; } Serial.print("R="); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return; } if ( addr[0] == 0x28) { Serial.print("Device is a DS18B20 family device.\n"); } else { Serial.print("Device family is not recognized: 0x"); Serial.println(addr[0],HEX); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // запускаем преобразование, оставляем питание на линии (второй параметр =1) delay(1000); // должно хватить 750 мс // после завершения преобразования нужно снять питание с линии вызвав метод ds.depower // метод reset сделает это за нас present = ds.reset(); ds.select(addr); ds.write(0xBE); // чтение показаний датчика Serial.print("P="); Serial.print(present,HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // читаем 9 байт data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print( OneWire::crc8( data, 8), HEX); Serial.println(); float Tc_100; Tc_100 = (data[1]*256. + data[0])/16.; Serial.print("T="); Serial.print(Tc_100); Serial.print("\n"); }
Надеюсь на Вашу помощь и разъяснение, а возможно и конкретное указание того, что не првильно или чего тут не хватает.
Может смотрел не внимательно, но нет ни одной строки, которая что либо выводила на ваш дисплей, все идет в сериал. Должно быть что то типа display.println(Tc_100); после 91 строки 3-го кода. До этого скорее всего надо выбрать шрифт, цвет и позицию с которой пойдет печать. У меня таких не было, эксперимент вам в руки.
Самое лучшее, выбросьте из первого кода все лишнее (кастрируйте до 10-15строк), научитесь уверенно выводить значение любой переменной на ваш дисплей (это расположено со 121 строки первого кода), а потом уже занятся прикладной задачей. Кстати в коде для DS18 тоже 80% абсолютно не нужной воды.
Может смотрел не внимательно, но нет ни одной строки, которая что либо выводила на ваш дисплей, все идет в сериал. Должно быть что то типа display.println(Tc_100); после 91 строки 3-го кода. До этого скорее всего надо выбрать шрифт, цвет и позицию с которой пойдет печать. У меня таких не было, эксперимент вам в руки.
Самое лучшее, выбросьте из первого кода все лишнее (кастрируйте до 10-15строк), научитесь уверенно выводить значение любой переменной на ваш дисплей (это расположено со 121 строки первого кода), а потом уже занятся прикладной задачей. Кстати в коде для DS18 тоже 80% абсолютно не нужной воды.
Спасибо за отклик! Попробовал Ваши замечания на практике и, не с первого раза, результат все таки стал ближе.
А теперь почему ближе:
1. Температу считается до сотых - не думаю, что это актуально, хотя бы до десятых;
2. Шрифты - над этим поработаю завтра;
3. Пока не понял как вывести знак цельсия на экран, т.е. маленький кружок - буду рад помощи и советам.
А вот что именно у меня получилось:
Снял маленькое видео, если интересно, то можете скачать и дать совет, что и как лучше сделать: https://yadi.sk/i/kKn98PCnf2KfG
Если, слабый интернет или еще какие-то причины, то вот фото:
Попробуйте в строке display.print(Tc_100); подставить (Тс_100, 0) или (Тс_100, 1)
Значок цельсия - либо он есть в шрифтах и надо найти, выведя последовательно все символы на экран, через for или рисовать самому и потом выводить.
Теперь delay() надо казнить.
http://arduino.ru/forum/obshchii/russkie-simvoly-lcd-5110#comment-60546
посмотрите этот пост, я сам с кодировкой не знаком (еще не дошел в процессе обучения), думаю поможет найти символ (если он сть)
возможно: http://unicode-table.com/ru/#control-character поможет (DEC: 176)
Попробуйте в строке display.print(Tc_100); подставить (Тс_100, 0) или (Тс_100, 1)
Значок цельсия - либо он есть в шрифтах и надо найти, выведя последовательно все символы на экран, через for или рисовать самому и потом выводить.
Теперь delay() надо казнить.
Доброго времени суток!
1. Убрал
Вчера его сотавил для диагностики того, что выводится в com и того, что на дисплей - теперь он, думаю, лишнее звено.
2. С количеством знаков после запятой помог именно (Тс_100, 1). Как и хотел - округлил до десятых;
3. Так и не смог сделать нормальный знак градуса и в итоге, пока расположил все не так как бы хотелось, а визуального вывода добился "первобытно общинным строем". Все, что попадалось в нете - это создание символа, но и тот я не понял по какому принципу работает и как его привязать к данному коду, поэтому снова прошу наставить на пусть иснинный;
Видел примеры с предложением рисовать символы - все схожи, но не смог понять принципа вывода - может только пока не смог...
Начало у всех было такое:
Тут компилятор сразу ругался на Char - я так понимаю, что у меня его просто нет или в данном, моем, случае не может рабоать.
4. Не понял хода Вашей мысли "Теперь delay() надо казнить". Разъясните что имелось ввиду?
Забыл выложить код, что сегодня получился, хотя, по сути, там мало чего изменилось:
http://arduino.ru/forum/obshchii/russkie-simvoly-lcd-5110#comment-60546
посмотрите этот пост, я сам с кодировкой не знаком (еще не дошел в процессе обучения), думаю поможет найти символ (если он сть)
возможно: http://unicode-table.com/ru/#control-character поможет (DEC: 176)
Григорий спасибо за полезную информацию!
По первой ссылке, начал читать, но сонными глазами уследить не получается - завтра после работы попробую, а вот по второй, к сожалению, она хороша - эта таблица, но знак температуры Цельсия - превращается в арабскую вязь. Как я понимаю - все ведет к тому, что эти самые символы - нужно подключать и применять, а простая подстановка - не работает.
Еще вопрос - Хочу проверить точность показаний. В сети вычитал, что проверяют два раза. Один раз в кипяток и должно получиться 100℃ с разбежкой в плюс минус 0,5 градуса, а после, второй раз, в лед и тоже разбежка может быть.
Я, конечно, читал в даташите, что он больше ста градусов держит, но вот как в реальности он себя поведет? Даже не знаю... Кто знает? Или Есть более лояльный способ проверки?
Еще вопрос - Хочу проверить точность показаний. В сети вычитал, что проверяют два раза. Один раз в кипяток и должно получиться 100℃ с разбежкой в плюс минус 0,5 градуса, а после, второй раз, в лед и тоже разбежка может быть.
Я, конечно, читал в даташите, что он больше ста градусов держит, но вот как в реальности он себя поведет? Даже не знаю... Кто знает? Или Есть более лояльный способ проверки?
Вода с тающим льдом вам даст 0 (дистиллированная), это true (сам не проверял), а вот 100гр кипящая вода это false (true ну очень случайно). Значит верхний предел либо с эталонным градусником рядом в воде (контакты тщательно заизолировать). Либо естественный эталон - вы сами. Померили себе температуру ртутным термометром, потом на то же место датчик. А верхний предел у него 125гр., на деле я думаю выше, только за точность не отвечают.
По delay(), если у вас останется термометр как сейчас, то без разницы, если начнете что то добавлять, быстро обнаружите тупизну вашего девайса.
По delay(), если у вас останется термометр как сейчас, то без разницы, если начнете что то добавлять, быстро обнаружите тупизну вашего девайса.
...здесь имеется ввиду использовать millis вместо delay , delay "вешает" контроллер, а millis "делает что-то другое" пока не истечет оведенный срок (blinking without delay) в примерах.
градусник проверять во лду и кипятке бесполезно не имея образцовый измеритель, +-2С будет минимальная погрешность метода, а при точности 0,5 С теряется всякий смысл проверки...
сам еще не разбирасля и проверить нечем...
попробуйте в строку 26 вставить
или
собственно когда они столбиком видно как выглядит символ и каое поле занимает и имя (переменная) ему grad
и в строке 69 заменить на:
здесь, надеюсь меня поправят гуру, как правильно отправить в print сразу 8 вайт переменой grad
Всем спасибо за помощь!
Все получилось. Температуру показывает весьма точно. Пороверял как на себе, так и на паяльной станции у очень хорошего человека, который согласился мне помощь.
Он в этом разбирается, поправил, то что было не правильно. С его помощью разобрался как вносить свои символы и как вставлять цифры своим шрифтом (тот что мне нравиться), а не тот, что из библиотеки берется.
Так что Вам bwn и Григорий - спасибо за то, что поддержали на начальном этапе, а Хорошему человеку и земляку - за то, что ускорил мой путь к конечному и желаемому результату!
Да, сколько не боролся со съемкой, чтобы показать фото нормально - так и не получилось... Но если присмотреться, то видна сверху надпись "Температура двигателя" и за цифрами - знак "Градус Цельсия" хорошо получился. За основу был взят шрифт Arial (как-то приглянулся). А вот с надписью сверху - тут все в произвольной форме, т.к. в одну строчку через шрифт Arial слишком мелко и не читается на расстоянии, а в ручную - получилось не плохо.
Теперь остается все это внедрять на сам автомобиль)
Хотя...уже витают мысли о том, что можно подключить еще один дисплей и вывести уровень топлива, а то по факту в ардуино задействовано только три ноги (питание я в расчет не беру), т.е. может много, а почти ни чего не делает. Но это как говориться: "Будет совершенно другая история...", а для начала нужно еще заказать и дождаться дисплея)
А что мешает на этом дисплее менять экраны и отображать температуру двигла, уровень топлива, температуру и влажность в салоне и пр.?
А что мешает на этом дисплее менять экраны и отображать температуру двигла, уровень топлива, температуру и влажность в салоне и пр.?
Доброго времени суток bwn!
Да ни чего не мешает, в принципе, просто в автомобиле датчик температуры и уровень топлива всегда оба на виду, поэтому в данном случае именно по этому есть мысль реализации сего проекта через два дисплея.
По поводу температуры в салоне и за бортом - это хорошая идея, я тоже над ней задумывался, тем более реализовать ее теперь весьма просто добавив кнопку, чтобы менять вывод информации на дисплей, и несколько датчиков. Осталось только купить кнопку,пару датчиков температуры и найти пример реализации посменного вывода информации на дисплей.
Да и с кнопкой не париться. Выводить информацию через промежутки времени, если вышла за установленные пределы, звук.сигнал и отображение.
Может проще взять готовую библиотеку?
Я смотрю вы тут на знак температуры не обращаете внимания. Ну если это совсем не важно......
Да и с кнопкой не париться. Выводить информацию через промежутки времени, если вышла за установленные пределы, звук.сигнал и отображение.
Нет такой вариант не устраивает тем, что в случае чего можно упустить возможность предопределить ситуацию, и лишь узнать о ней из сигнализации. Поэтому, если и делать, то с выводом информации по требованию, т.е. по умолчанию выводится всегда одна и таже информация, а при необходимости - меняется на другую.
Все, что сказано выше - относится к температуре. Датчик топлива наименее важный датчик и его мониторинг можно с чем-то чередовать, но опять же - я как минимум не сторонник такой концепции.
Может проще взять готовую библиотеку?
Я смотрю вы тут на знак температуры не обращаете внимания. Ну если это совсем не важно......
Почему? Знак учитывается - на дисплей выводится и отрицательная температура. Это было сделано из-за ошибки появляющейся на дисплее при температуре ниже нуля. Это не критично, но для меня - как минимум не приятно.
Отрицательные температуры- это не просто "1" в старшем разряде......
http://playground.arduino.cc/Learning/OneWire
товарищь chrysler
попробовал ваш Скетч . он пишет ошибку.
C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\libraries\Adafruit_SSD1306\Adafruit_SSD1306.cpp:433:6: error: prototype for 'void Adafruit_SSD1306::dim(boolean)' does not match any in class 'Adafruit_SSD1306'
void Adafruit_SSD1306::dim(boolean dim) {
^
In file included from C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\libraries\Adafruit_SSD1306\Adafruit_SSD1306.cpp:28:0:
C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\libraries\Adafruit_SSD1306\Adafruit_SSD1306.h:152:8: error: candidate is: void Adafruit_SSD1306::dim(uint8_t)
void dim(uint8_t contrast);
^
Ошибка компиляции.
не подскажете как это поправить ??
пробовал дугую библиотеку заменить , тогда пишет что не хватает памяти, при загрузке только на 17 %
:)
товарищь chrysler
попробовал ваш Скетч . он пишет ошибку.
C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\libraries\Adafruit_SSD1306\Adafruit_SSD1306.cpp:433:6: error: prototype for 'void Adafruit_SSD1306::dim(boolean)' does not match any in class 'Adafruit_SSD1306'
void Adafruit_SSD1306::dim(boolean dim) {
^
In file included from C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\libraries\Adafruit_SSD1306\Adafruit_SSD1306.cpp:28:0:
C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\libraries\Adafruit_SSD1306\Adafruit_SSD1306.h:152:8: error: candidate is: void Adafruit_SSD1306::dim(uint8_t)
void dim(uint8_t contrast);
^
Ошибка компиляции.
не подскажете как это поправить ??
пробовал дугую библиотеку заменить , тогда пишет что не хватает памяти, при загрузке только на 17 %
Беда в самой библиотеке - ее нужно чуть-чуть исправлять. Причем - это не моя прихоть, а изначальная ошибка в библиотеке.
Скачай у меня, а так описание в сети есть как с этой проблемой бороться: https://yadi.sk/d/Okkn0YaPg6ZJN
chrysler
Спасибо большое за совет , попробую вашу библиотеку.
ставил и другие библо. SSD1306 другие не дают ошибку, а пишут что очень мало памяти осталось.
chrysler
Спасибо большое за совет , попробую вашу библиотеку.
ставил и другие библо. SSD1306 другие не дают ошибку, а пишут что очень мало памяти осталось.
Не вводите в заблуждение всех кто когда-либо будет читать этот пост - не моя это библиотека, а просто поправленная.
А так не за что - пользуйтесь.
Кто нибудь знает как выводить на монитор не температуру ,а текст ,например при достижении температуры в 60 градусов на мониторе отображалось слово грибы а не температура? или где почитать буду благодарен.
С одним значением я разобрался а у меня их четыре ,управляю одной кнопкой , это будет сушилка для овощей вернее она уже есть и работает но хотелось бы что бы вместо цифр были названия
пробовал с переменной char Str[8]="chesnok"; таких будет три разных названия ,вот как их выводить по очереди нажатия кнопок?
С одним значением я разобрался а у меня их четыре ,управляю одной кнопкой , это будет сушилка для овощей вернее она уже есть и работает но хотелось бы что бы вместо цифр были названия
в этом месте не понятен алгоритм...
если t1< t <t2 или строго если t==t1 ? или речь идет о надписи при нажатии кнопки ( код не смотрел, только прочитал сам вопрос)
попробуйте разобраться с этим, там вроде все просто написано, пример только не самый понятный (пока сам не напишешь хоть раз)
вообще алгоритм очень плохо описан - не ясно, чего вы хотите (я не понял)...
алгоритм простой один раз нажал кнопку включается тен с вентилятором и держит температуру например 50 градусов ,второй раз нажал тоже самое но температура уже 60 градусов ,третий раз нажал температура 80 градусов . температуру потом изменю по таблице для сушки овощей
алгоритм простой один раз нажал кнопку включается тен с вентилятором и держит температуру например 50 градусов ,второй раз нажал тоже самое но температура уже 60 градусов ,третий раз нажал температура 80 градусов . температуру потом изменю по таблице для сушки овощей
т.е. по нажатию кнопки менять переменную t1 (установочная, заданная температура, не фактическая с градусника), но не температуру выводить на экран, а слово?
алгоритм простой один раз нажал кнопку включается тен с вентилятором и держит температуру например 50 градусов ,второй раз нажал тоже самое но температура уже 60 градусов ,третий раз нажал температура 80 градусов . температуру потом изменю по таблице для сушки овощей
т.е. по нажатию кнопки менять переменную t1 (установочная, заданная температура, не фактическая с градусника), но не температуру выводить на экран, а слово?
да это я и хотел бы
офтоп.
да это я и хотел бы
есть 2 варианта - сложный (его описывать не буду), и простой, в следующем посте напишу алгоритм (немного пожже)
:)
А потом просто в функцию кнопок писать case0, case1,....?
в кнопках ничего писать не надо, у тебя вывод информации обрабатывается по значению переменной regim.
в кнопках ничего писать не надо, у тебя вывод информации обрабатывается по значению переменной regim.
тут человек еще не понял алгоритм работы, а это следующий шаг - код. ему с алгоритмом нужно помощь.. щас алгоритм накидаю, там посмотрим представление в коде...
в кнопках ничего писать не надо, у тебя вывод информации обрабатывается по значению переменной regim.
получается regim 1 ,regim2 ,regim3 писать в функции кнопки и тогда будет выводится case1,case2,case3 ?
мои поправки к алгоритму не относятся. Вывод инфы отдельно, алгоритм обработки температуры отдельно. Не надо все в одну кучу кидать, потом фиг разберется.
upd
Первое, задаем глобальные переменные:
tr; - переменная с которой будет работать управление (с ней будем сравнивать температуру градусника),
t1=50; - для сока
t2=60 ; - для компота
t3=70; - манная каша
…..
В сетапе tr=0; //(чтобы печка не улетела) с начала ничего не работает.
второе, описываем работу с кнопками, при нажатии циклически (по кругу) присваиваем tr=t1… tr=t3… и снова на круг…
если tr==t1 { для сока }….. tr==t2 { для компота }…. tr==t9 {запускаем стратегическую крылатую ракету}
третье: весь алгоритм работает только с tr … if t<tr – включить, else – выключить нагрев.
....
Простой вариант (избыточный, но очень понятный ) ИМХО
тут про отдельное написание функций (подпрограмм), я, обычно описываю между сетапом и лупом, пример ниже.
Void disp1() /// ; - не ставится!!!! :)
{
Сообщение первое на экран
}
Void disp2()
{
Сообщение второе на экран
}
……
в лупе :
If (tr==t1) { disp1();}// если условие верно, выполнить Void disp1()…
…… тоже самое сделает case - просто нужно понять как он работает…
Вроде алгоритм описал, не знаю только на сколько понятно :)
так все это уже есть в строках 83-170. Малость коряво, конечно, но очен похоже на ваш алгоритм.
так все это уже есть в строках 83-170. Малость коряво, конечно, но очен похоже на ваш алгоритм.
я не смотрел код - это долго... я описал смысл, ну и выкинул из лупа сообщения на дисплей, там еще можно резать и резать код... ну хоть
upd я еще только учусь, т.к. это хобби, но утверждаю - сперва алгоритм, потом код!!!!! иначе никак
upd
Первое, задаем глобальные переменные:
tr; - переменная с которой будет работать управление (с ней будем сравнивать температуру градусника),
t1=50; - для сока
t2=60 ; - для компота
t3=70; - манная каша
…..
В сетапе tr=0; //(чтобы печка не улетела) с начала ничего не работает.
второе, описываем работу с кнопками, при нажатии циклически (по кругу) присваиваем tr=t1… tr=t3… и снова на круг…
если tr==t1 { для сока }….. tr==t2 { для компота }…. tr==t9 {запускаем стратегическую крылатую ракету}
третье: весь алгоритм работает только с tr … if t<tr – включить, else – выключить нагрев.
....
Простой вариант (избыточный, но очень понятный ) ИМХО
тут про отдельное написание функций (подпрограмм), я, обычно описываю между сетапом и лупом, пример ниже.
Void disp1() /// ; - не ставится!!!! :)
{
Сообщение первое на экран
}
Void disp2()
{
Сообщение второе на экран
}
……
в лупе :
If (tr==t1) { disp1();}// если условие верно, выполнить Void disp1()…
…… тоже самое сделает case - просто нужно понять как он работает…
Вроде алгоритм описал, не знаю только на сколько понятно :)
Спасибо сегодня вечером буду пробовать по вашей инструкции , я пробовал с глобальной переменной но у меня она не выводилась , понимаю что где-то делаю не так ,но я же учусь. Всем премного благодарен всем кто откликнулся.
А потом просто в функцию кнопок писать case0, case1,....?
А вот с этим кодом мне проще оказалось выводить .вообще переделывать ничего не надо было просто заменил работу дисплея добавил case2 case 3 и названия свои ,только от boolean flag = 0; так и не понял для чего без него все работает.
Это нужно для работы кнопки, к отображению не относится. Просто изначально было int flag=0, это нерационально в части использования памяти.
Это нужно для работы кнопки, к отображению не относится. Просто изначально было int flag=0, это нерационально в части использования памяти.
Спасибо учту , а я думаю почему не компилируется убрал свой int flag=0 ; всё компилируется.
Теперь столкнулся с русским шрифтом есть библиотека для I2 с русским шрифтом но у меня дисплей spi , вот интересно есть ли для него библа с русским?
delete
upd? может поможет... это