Нужно вывести температуру с DS18B20 на OLED LCD 0,96 128x64

chrysler
Offline
Зарегистрирован: 02.03.2015

Доброго времени суток!

Ситуация следующая, в автомобиле беда с датчиком температуры - вечно бред показывает. Менял на новый и через некоторое время все постарому. Поэтому решил не мучится с этим безобразием, и сделать эктронную замену.

Примеров того как собрать воедино с 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");
}

Надеюсь на Вашу помощь и разъяснение, а возможно и конкретное указание того, что не првильно или чего тут не хватает.

 

bwn
Offline
Зарегистрирован: 25.08.2014

Может смотрел не внимательно, но нет ни одной строки, которая что либо выводила на ваш дисплей, все идет в сериал. Должно быть что то типа display.println(Tc_100); после 91 строки 3-го кода. До этого скорее всего надо выбрать шрифт, цвет и позицию с которой пойдет печать. У меня таких не было, эксперимент вам в руки.

Самое лучшее, выбросьте из первого кода все лишнее (кастрируйте до 10-15строк), научитесь уверенно выводить значение любой переменной на ваш дисплей (это расположено со 121 строки первого кода), а потом уже занятся прикладной задачей. Кстати в коде для DS18 тоже 80% абсолютно не нужной воды.

chrysler
Offline
Зарегистрирован: 02.03.2015

bwn пишет:

Может смотрел не внимательно, но нет ни одной строки, которая что либо выводила на ваш дисплей, все идет в сериал. Должно быть что то типа display.println(Tc_100); после 91 строки 3-го кода. До этого скорее всего надо выбрать шрифт, цвет и позицию с которой пойдет печать. У меня таких не было, эксперимент вам в руки.

Самое лучшее, выбросьте из первого кода все лишнее (кастрируйте до 10-15строк), научитесь уверенно выводить значение любой переменной на ваш дисплей (это расположено со 121 строки первого кода), а потом уже занятся прикладной задачей. Кстати в коде для DS18 тоже 80% абсолютно не нужной воды.

Спасибо за отклик! Попробовал Ваши замечания на практике и, не с первого раза, результат все таки стал ближе.

А теперь почему ближе:

1. Температу считается до сотых - не думаю, что это актуально, хотя бы до десятых;

2. Шрифты - над этим поработаю завтра;

3. Пока не понял как вывести знак цельсия на экран, т.е. маленький кружок - буду рад помощи и советам.

А вот что именно у меня получилось:

// Для дисплея
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

// Для датчика температуры
#include <OneWire.h>  
OneWire ds(7);  // работаем через пин 7
 
void setup(){  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay();
  
  Serial.begin(9600);
}
 
void loop() {
 
    //Работа датчика температуры
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      Serial.print("\n");
      ds.reset_search();
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // запускаем преобразование, оставляем питание на линии (второй параметр =1)

  delay(1000);     // должно хватить 750 мс
  // после завершения преобразования нужно снять питание с линии вызвав метод ds.depower
  // метод reset сделает это за нас

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // чтение показаний датчика

  
  for ( i = 0; i < 9; i++) {           // читаем 9 байт
    data[i] = ds.read();
    
  }
    
  float Tc_100;
  Tc_100 = (data[1]*256. + data[0])/16.;
  
  Serial.print(Tc_100);
   
  //Работа Дисплея
  display.clearDisplay();
  display.setCursor(20,20);
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.print(Tc_100); //Выводим переменную на дисплей
  display.setCursor(110,26);  //Сместил букву С
  display.setTextSize(2);
  display.println("C");
  display.display();
  delay(1000);
}

Снял маленькое видео, если интересно, то можете скачать и дать совет, что и как лучше сделать: https://yadi.sk/i/kKn98PCnf2KfG

Если, слабый интернет или еще какие-то причины, то вот фото:

bwn
Offline
Зарегистрирован: 25.08.2014

Попробуйте в строке display.print(Tc_100); подставить (Тс_100, 0) или (Тс_100, 1)

Значок цельсия - либо он есть в шрифтах и надо найти,  выведя последовательно все символы на экран, через for или рисовать самому и потом выводить.

Теперь delay() надо казнить.

Гриша
Offline
Зарегистрирован: 27.04.2014

http://arduino.ru/forum/obshchii/russkie-simvoly-lcd-5110#comment-60546

посмотрите этот пост, я сам с кодировкой не знаком (еще не дошел в процессе обучения),  думаю поможет найти символ (если он сть)

возможно: http://unicode-table.com/ru/#control-character поможет (DEC: 176)

chrysler
Offline
Зарегистрирован: 02.03.2015

bwn пишет:

Попробуйте в строке display.print(Tc_100); подставить (Тс_100, 0) или (Тс_100, 1)

Значок цельсия - либо он есть в шрифтах и надо найти,  выведя последовательно все символы на экран, через for или рисовать самому и потом выводить.

Теперь delay() надо казнить.

Доброго времени суток!

1. Убрал 

 Serial.begin(9600);

Вчера его сотавил для диагностики того, что выводится в com и того, что на дисплей - теперь он, думаю, лишнее звено.

2. С количеством знаков после запятой помог именно (Тс_100, 1). Как и хотел - округлил до десятых;

3. Так и не смог сделать нормальный знак градуса и в итоге, пока расположил все не так как бы хотелось, а визуального вывода добился "первобытно общинным строем". Все, что попадалось в нете - это создание символа, но и тот я не понял по какому принципу работает и как его привязать к данному коду, поэтому снова прошу наставить на пусть иснинный;

Видел примеры с предложением рисовать символы - все схожи, но не смог понять принципа вывода - может только пока не смог...

Начало у всех было такое:

// создать знак градуса
uint8_t grad[8] = {
  B00110,
  B01001,
  B00110,
  B00000,
  B00000,
  B00000,
  B00000
};
// и записать в символ 0 индикатора
lcd.createChar(0, grad);

Тут компилятор сразу ругался на Char - я так понимаю, что у меня его просто нет или в данном, моем, случае не может рабоать.

4. Не понял хода Вашей мысли "Теперь delay() надо казнить". Разъясните что имелось ввиду?

 

chrysler
Offline
Зарегистрирован: 02.03.2015

Забыл выложить код, что сегодня получился, хотя, по сути, там мало чего изменилось:

// Для дисплея
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

// Для датчика температуры
#include <OneWire.h>  
OneWire ds(7);  // работаем через пин 7
 
void setup(){  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay();

}
 
void loop() {
 
    //Работа датчика температуры
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      Serial.print("\n");
      ds.reset_search();
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // запускаем преобразование, оставляем питание на линии (второй параметр =1)

  delay(1000);     // должно хватить 750 мс
  // после завершения преобразования нужно снять питание с линии вызвав метод ds.depower
  // метод reset сделает это за нас

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // чтение показаний датчика

  for ( i = 0; i < 9; i++) {           // читаем 9 байт
    data[i] = ds.read();
   }
  
  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(Tc_100);
   
  //Работа Дисплея
  display.clearDisplay();
  display.setCursor(5,5);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("ENGINE"); //Надпись сверху дисплея
  display.setCursor(90,5);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("T"); //Знак температуры
  display.setCursor(109,5);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println("O"); //Импровезированный знак градуса
  display.setCursor(115,5);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("C"); //Импровезированный знак Цельсия
  display.setCursor(30,38);
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.print(Tc_100,1); //Выводим переменную на дисплей
  display.display();
  delay(1000);
}

 

chrysler
Offline
Зарегистрирован: 02.03.2015

Гриша пишет:

http://arduino.ru/forum/obshchii/russkie-simvoly-lcd-5110#comment-60546

посмотрите этот пост, я сам с кодировкой не знаком (еще не дошел в процессе обучения),  думаю поможет найти символ (если он сть)

возможно: http://unicode-table.com/ru/#control-character поможет (DEC: 176)

Григорий спасибо за полезную информацию!

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

chrysler
Offline
Зарегистрирован: 02.03.2015

Еще вопрос - Хочу проверить точность показаний. В сети вычитал, что проверяют два раза. Один раз в кипяток и должно получиться 100℃ с разбежкой в плюс минус 0,5 градуса, а после, второй раз, в лед и тоже разбежка может быть.

Я, конечно, читал в даташите, что он больше ста градусов держит, но вот как в реальности он себя поведет? Даже не знаю... Кто знает? Или Есть более лояльный способ проверки?

bwn
Offline
Зарегистрирован: 25.08.2014

chrysler пишет:

Еще вопрос - Хочу проверить точность показаний. В сети вычитал, что проверяют два раза. Один раз в кипяток и должно получиться 100℃ с разбежкой в плюс минус 0,5 градуса, а после, второй раз, в лед и тоже разбежка может быть.

Я, конечно, читал в даташите, что он больше ста градусов держит, но вот как в реальности он себя поведет? Даже не знаю... Кто знает? Или Есть более лояльный способ проверки?

Вода с тающим льдом вам даст 0 (дистиллированная), это true (сам не проверял), а вот 100гр кипящая вода это false (true ну очень случайно). Значит верхний предел либо с эталонным градусником рядом в воде (контакты тщательно заизолировать). Либо естественный эталон - вы сами. Померили себе температуру ртутным термометром, потом на то же место датчик. А верхний предел у него 125гр., на деле я думаю выше, только за точность не отвечают.

По delay(), если у вас останется термометр как сейчас, то без разницы, если начнете что то добавлять, быстро обнаружите тупизну вашего девайса.

Гриша
Offline
Зарегистрирован: 27.04.2014

bwn пишет:

По delay(), если у вас останется термометр как сейчас, то без разницы, если начнете что то добавлять, быстро обнаружите тупизну вашего девайса.

...здесь имеется ввиду использовать millis вместо delay , delay "вешает" контроллер, а  millis "делает что-то другое" пока не истечет оведенный срок (blinking without delay) в примерах.

градусник проверять во лду и кипятке бесполезно не имея образцовый измеритель, +-2С будет минимальная погрешность метода, а при точности 0,5 С теряется всякий смысл проверки... 

Гриша
Offline
Зарегистрирован: 27.04.2014

сам еще не разбирасля и проверить нечем...

попробуйте в строку 26 вставить 


// создать знак градуса
int grad[8] = {B00110, B01001, B00110, B00000, B00000, B00000, B00000};

или

// создать знак градуса
byte grad[8] = {B00110, B01001, B00110, B00000, B00000, B00000, B00000};

собственно когда они столбиком видно как выглядит символ и каое поле занимает и имя (переменная) ему grad

и в строке 69 заменить на: 

display.println(grad); //Импровезированный знак градуса

здесь, надеюсь меня поправят гуру, как правильно отправить в print сразу 8 вайт переменой grad

chrysler
Offline
Зарегистрирован: 02.03.2015

Всем спасибо за помощь!

Все получилось. Температуру показывает весьма точно. Пороверял как на себе, так и на паяльной станции  у очень хорошего человека, который согласился мне помощь.

Он в этом разбирается, поправил, то что было не правильно. С его помощью разобрался как вносить свои символы и как вставлять цифры своим шрифтом (тот что мне нравиться), а не тот, что из библиотеки берется.

Так что Вам bwn и Григорий - спасибо за то, что поддержали на начальном этапе, а Хорошему человеку и земляку - за то, что ускорил мой путь к конечному и желаемому результату!

Да, сколько не боролся со съемкой, чтобы показать фото нормально - так и не получилось... Но если присмотреться, то видна сверху надпись "Температура двигателя" и за цифрами - знак "Градус Цельсия" хорошо получился. За основу был взят шрифт Arial (как-то приглянулся). А вот с надписью сверху - тут все в произвольной форме, т.к. в одну строчку через шрифт Arial слишком мелко и не читается на расстоянии, а в ручную - получилось не плохо. 

Теперь остается все это внедрять на сам автомобиль) 

Хотя...уже витают мысли о том, что можно подключить еще один дисплей и вывести уровень топлива, а то по факту в ардуино задействовано только три ноги (питание я в расчет не беру), т.е. может много, а почти ни чего не делает. Но это как говориться: "Будет совершенно другая история...", а для начала нужно еще заказать и дождаться дисплея)

 

bwn
Offline
Зарегистрирован: 25.08.2014

А что мешает на этом дисплее менять экраны и отображать температуру двигла, уровень топлива, температуру и влажность в салоне и пр.?

chrysler
Offline
Зарегистрирован: 02.03.2015

bwn пишет:

А что мешает на этом дисплее менять экраны и отображать температуру двигла, уровень топлива, температуру и влажность в салоне и пр.?

Доброго времени суток bwn!

Да ни чего не мешает, в принципе, просто в автомобиле датчик температуры и уровень топлива всегда оба на виду, поэтому в данном случае именно по этому есть мысль реализации сего проекта через два дисплея.

По поводу температуры в салоне и за бортом - это хорошая идея, я тоже над ней задумывался, тем более реализовать ее теперь весьма просто добавив кнопку, чтобы менять вывод информации на дисплей, и несколько датчиков. Осталось только купить кнопку,пару датчиков температуры и найти пример реализации посменного вывода информации на дисплей.

bwn
Offline
Зарегистрирован: 25.08.2014

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Может проще взять готовую библиотеку?

Я смотрю вы тут на знак температуры не обращаете внимания. Ну если это совсем не важно......

 

chrysler
Offline
Зарегистрирован: 02.03.2015

bwn пишет:

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

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

Все, что сказано выше - относится к температуре. Датчик топлива наименее важный датчик и его мониторинг можно с чем-то чередовать, но опять же - я как минимум не сторонник такой концепции.

chrysler
Offline
Зарегистрирован: 02.03.2015

trembo пишет:

Может проще взять готовую библиотеку?

Я смотрю вы тут на знак температуры не обращаете внимания. Ну если это совсем не важно......

 

Почему? Знак учитывается - на дисплей выводится и отрицательная температура. Это было сделано из-за ошибки появляющейся на дисплее при температуре ниже нуля. Это не критично, но для меня - как минимум не приятно.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Отрицательные температуры- это не просто "1" в старшем разряде......

http://playground.arduino.cc/Learning/OneWire

LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;


  if (SignBit) // If its negative
  {
     Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if (Fract < 10)
  {
     Serial.print("0");
  }
  Serial.print(Fract);

  Serial.print("\n");

 

TovBender
Offline
Зарегистрирован: 12.04.2015

товарищь 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
Offline
Зарегистрирован: 02.03.2015

:)

 

chrysler
Offline
Зарегистрирован: 02.03.2015

TovBender пишет:

товарищь 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

SKub
Offline
Зарегистрирован: 19.04.2015

chrysler

Спасибо большое за совет , попробую вашу библиотеку.

ставил и другие библо. SSD1306 другие не дают ошибку, а пишут что очень мало памяти осталось.

chrysler
Offline
Зарегистрирован: 02.03.2015

SKub пишет:

chrysler

Спасибо большое за совет , попробую вашу библиотеку.

ставил и другие библо. SSD1306 другие не дают ошибку, а пишут что очень мало памяти осталось.

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

А так не за что - пользуйтесь.

cudla1973
Offline
Зарегистрирован: 21.02.2013

Кто нибудь знает как выводить  на монитор  не температуру ,а  текст ,например при достижении температуры в 60 градусов на мониторе отображалось слово грибы а не температура? или где почитать буду благодарен.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

  //Работа Дисплея
  display.clearDisplay();
  
  if(Tc_100 < 60) // Сравниваем значение 
  {
    display.setCursor(5,5);
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.println("ENGINE"); //Надпись сверху дисплея
    display.setCursor(90,5);
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.println("T"); //Знак температуры
    display.setCursor(109,5);
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.println("O"); //Импровезированный знак градуса
    display.setCursor(115,5);
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.println("C"); //Импровезированный знак Цельсия
    display.setCursor(30,38);
    display.setTextSize(3);
    display.setTextColor(WHITE);
    display.print(Tc_100,1); //Выводим переменную на дисплей
  }
  else
  {
    display.setCursor(5,5);
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.println("GRYBY"); //Надпись сверху дисплея
    display.setCursor(90,5);
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.print("12345789"); //Частушки
  }
  display.display();
  delay(1000);

 

cudla1973
Offline
Зарегистрирован: 21.02.2013

Tomasina пишет:



    display.print("12345789"); //Частушки

 

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

пробовал с переменной char Str[8]="chesnok"; таких будет три разных названия ,вот как их выводить по очереди нажатия кнопок?

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
#include <OneWire.h> 
OneWire ds(7);  // работаем через пин 7
float Tc_100;
int regim=0; 
int flag=0; 
int mochnost=0;


void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
  display.display();
  delay(200);
  display.clearDisplay();
   pinMode(8,OUTPUT);    
   pinMode(9,OUTPUT);    
   pinMode(10,OUTPUT); 
  }
void loop() 
{
  display.println("\n");

  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      Serial.print("\n");
      ds.reset_search();
      return;
  }
ds.reset();
  ds.select(addr);
  ds.write(0x44,1);       

  delay(10);    
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // чтение показаний датчика

  
  for ( i = 0; i < 9; i++) {           // читаем 9 байт
    data[i] = ds.read();
  
{
  
    Tc_100 = (data[1]*256. + data[0])/16.;
 
  Serial.print(Tc_100,1);
   
  //Работа Дисплея
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print(Tc_100,1); 
  display.println(" C");
 
  
  display.setCursor(0,45);
  display.print(mochnost);
  display.println("  w");
  
   
  display.setTextSize(2);
  display.display();
  delay(10);
}
{
 {   
   if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата   
     // и переменн¤ flag равна 0 , то ... 
     { 
       regim++;   
       flag=1; 
        //это нужно дл¤ того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
          if(regim>5)//ограничим количество режимов 
        { 
          regim=1;//так как мы используем только одну кнопку, 
                    // то переключать режимы будем циклично 
        } 
       } 
       if(digitalRead(14)==LOW&&flag==1)//если кнопка Ќ≈ нажата 
     //и переменна¤ flag равна - 1 ,то ... 
     { 
           flag=0;//обнул¤ем переменную "knopka" 
     } 
      if(regim==1)//первый режим 100 ватт
   { 
      Tc_100 = (data[1]*256. + data[0])/16.;
      
      if(Tc_100  < 50)
      
       {
      digitalWrite(8,HIGH);
      
       }
       else
        {
        digitalWrite(8,LOW);
        }
        delay(10);
        mochnost=300;
       
         
        
    } 
    if(regim==2)//второй режим 300 ватт
    { 
      Tc_100 = (data[1]*256. + data[0])/16.; 
 if(Tc_100  < 65)
    {
      digitalWrite(8,HIGH);//выключаем реле 8
      digitalWrite(9,HIGH); //включаем реле9
      mochnost=600; 
       }
       else
      digitalWrite(8,LOW);//выключаем реле 8
      digitalWrite(9,LOW);
    } 
      
    if(regim==3)//третий режим 400 ватт
    { 
       Tc_100 = (data[1]*256. + data[0])/16.; 
       if(Tc_100  < 80)
    {
        
      digitalWrite(8,HIGH);//выключаем реле 8
      digitalWrite(9,HIGH); //включаем реле9
      digitalWrite(10,HIGH); //включаем реле10
       mochnost=900;
       }
       else
       {
        digitalWrite(8,LOW);//выключаем реле 8
        digitalWrite(9,LOW); //включаем реле9
        digitalWrite(10,LOW);
        }

  
      
    } 
      
 
    if(regim==5)//выключем все реле  
    
    {
       
       mochnost=000;
    
 
      digitalWrite(8,LOW);//выключаем реле 8
      digitalWrite(9,LOW); //выключаем реле 9
    digitalWrite(10,LOW);//выключаем реле 10
      }

 delay(10);

 
    
      
}}}}

 

Гриша
Offline
Зарегистрирован: 27.04.2014

cudla1973 пишет:

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

в этом месте не понятен алгоритм...

если t1< t <t2  или строго если t==t1 ? или речь идет о надписи при нажатии кнопки ( код не смотрел, только прочитал сам вопрос)

попробуйте разобраться  с этим, там вроде все просто написано, пример только не самый понятный (пока сам не напишешь хоть раз)

вообще алгоритм очень плохо описан - не ясно, чего вы хотите (я не понял)...

cudla1973
Offline
Зарегистрирован: 21.02.2013

алгоритм простой один раз нажал кнопку включается тен с вентилятором и держит температуру например 50 градусов ,второй раз нажал тоже самое но температура уже 60 градусов ,третий раз нажал температура 80 градусов . температуру потом изменю по таблице для сушки овощей 

Гриша
Offline
Зарегистрирован: 27.04.2014

cudla1973 пишет:

алгоритм простой один раз нажал кнопку включается тен с вентилятором и держит температуру например 50 градусов ,второй раз нажал тоже самое но температура уже 60 градусов ,третий раз нажал температура 80 градусов . температуру потом изменю по таблице для сушки овощей 

т.е. по нажатию кнопки менять переменную t1 (установочная, заданная температура, не фактическая с градусника), но не температуру выводить на экран, а слово?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
byte regim = 0;
boolean flag = 0;

 

//Работа Дисплея      
      display.clearDisplay();
      switch(regim)
      {
      case 0:
        display.setTextSize(2);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.print(Tc_100,1); 
        display.println(" C");
        display.setCursor(0,45);
        display.print(mochnost);
        display.println("  W");
        break;
      case 1:
        display.setTextSize(2);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.println("Voda");
        display.setCursor(0,45);
        display.println("Pivo");
        break;
      default:
        display.setTextSize(2);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.print("Undefined");
      }
      display.display();

 

cudla1973
Offline
Зарегистрирован: 21.02.2013

Гриша пишет:

cudla1973 пишет:

алгоритм простой один раз нажал кнопку включается тен с вентилятором и держит температуру например 50 градусов ,второй раз нажал тоже самое но температура уже 60 градусов ,третий раз нажал температура 80 градусов . температуру потом изменю по таблице для сушки овощей 

т.е. по нажатию кнопки менять переменную t1 (установочная, заданная температура, не фактическая с градусника), но не температуру выводить на экран, а слово?

да это я и хотел бы

Гриша
Offline
Зарегистрирован: 27.04.2014

офтоп.

cudla1973 пишет:

да это я и хотел бы

есть 2 варианта - сложный (его описывать не буду), и простой, в следующем посте напишу алгоритм (немного пожже)

:)

cudla1973
Offline
Зарегистрирован: 21.02.2013

Tomasina пишет:

byte regim = 0;
boolean flag = 0;

 

//Работа Дисплея      
      display.clearDisplay();
      switch(regim)
      {
      case 0:
        display.setTextSize(2);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.print(Tc_100,1); 
        display.println(" C");
        display.setCursor(0,45);
        display.print(mochnost);
        display.println("  W");
        break;
      case 1:
        display.setTextSize(2);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.println("Voda");
        display.setCursor(0,45);
        display.println("Pivo");
        break;
      default:
        display.setTextSize(2);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.print("Undefined");
      }
      display.display();

 

А потом просто в функцию кнопок писать case0, case1,....?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

в кнопках ничего писать не надо, у тебя вывод информации обрабатывается по значению переменной regim.

Гриша
Offline
Зарегистрирован: 27.04.2014

Tomasina пишет:

в кнопках ничего писать не надо, у тебя вывод информации обрабатывается по значению переменной regim.

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

cudla1973
Offline
Зарегистрирован: 21.02.2013

Tomasina пишет:

в кнопках ничего писать не надо, у тебя вывод информации обрабатывается по значению переменной regim.

получается regim 1 ,regim2 ,regim3 писать в функции кнопки и тогда  будет выводится case1,case2,case3 ?   

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Гриша пишет:
тут человек еще не понял алгоритм работы, а это следующий шаг - код. ему с алгоритмом нужно помощь.. щас алгоритм накидаю, там посмотрим представление в коде...

мои поправки к алгоритму не относятся. Вывод инфы отдельно, алгоритм обработки температуры отдельно. Не надо все в одну кучу кидать, потом фиг разберется.

Гриша
Offline
Зарегистрирован: 27.04.2014

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  - просто нужно понять как он работает…

Вроде алгоритм описал, не знаю только на сколько понятно :)

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

так все это уже есть в строках 83-170. Малость коряво, конечно, но очен похоже на ваш алгоритм.

Гриша
Offline
Зарегистрирован: 27.04.2014

Tomasina пишет:

так все это уже есть в строках 83-170. Малость коряво, конечно, но очен похоже на ваш алгоритм.

я не смотрел код - это долго... я описал смысл, ну и выкинул из лупа сообщения на дисплей, там еще можно резать и резать код... ну хоть

       .... 
       display.setCursor(0,45);
  //      display.print(mochnost);
         display.print(myStrings[tr]); // только смысл - для кода не верно 
        display.println("  W");
      ....
передлать этот пример:

char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6"};
 
void setup(){
Serial.begin(9600);
}
 
void loop(){
for (int i = 0; i < 6; i++){
   Serial.println(myStrings[i]);
   delay(500);
   }
}

upd я еще только учусь, т.к. это хобби, но утверждаю - сперва алгоритм, потом код!!!!! иначе никак

cudla1973
Offline
Зарегистрирован: 21.02.2013

Гриша пишет:

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  - просто нужно понять как он работает…

Вроде алгоритм описал, не знаю только на сколько понятно :)


Спасибо сегодня вечером буду пробовать по вашей инструкции , я пробовал с глобальной переменной но у меня она не выводилась , понимаю что где-то делаю не так ,но я же учусь. Всем премного благодарен всем кто откликнулся.

cudla1973
Offline
Зарегистрирован: 21.02.2013

cudla1973 пишет:

Tomasina пишет:

byte regim = 0;
boolean flag = 0;

 

//Работа Дисплея      
      display.clearDisplay();
      switch(regim)
      {
      case 0:
        display.setTextSize(2);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.print(Tc_100,1); 
        display.println(" C");
        display.setCursor(0,45);
        display.print(mochnost);
        display.println("  W");
        break;
      case 1:
        display.setTextSize(2);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.println("Voda");
        display.setCursor(0,45);
        display.println("Pivo");
        break;
      default:
        display.setTextSize(2);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.print("Undefined");
      }
      display.display();

 

А потом просто в функцию кнопок писать case0, case1,....?

А вот с этим кодом мне проще оказалось выводить .вообще переделывать ничего не надо было просто заменил работу дисплея добавил case2 case 3 и названия свои  ,только от boolean flag = 0; так и не понял для чего без него все работает.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

cudla1973 пишет:
только от boolean flag = 0; так и не понял для чего без него все работает.

Это нужно для работы кнопки, к отображению не относится. Просто изначально было int flag=0, это нерационально в части использования памяти.

cudla1973
Offline
Зарегистрирован: 21.02.2013

Tomasina пишет:

cudla1973 пишет:
только от boolean flag = 0; так и не понял для чего без него все работает.

Это нужно для работы кнопки, к отображению не относится. Просто изначально было int flag=0, это нерационально в части использования памяти.

Спасибо учту , а я  думаю почему не компилируется убрал свой  int flag=0 ; всё компилируется.

Теперь столкнулся с русским шрифтом есть библиотека для I2 с русским шрифтом но у меня дисплей spi , вот интересно есть ли для него библа с русским?

Гриша
Offline
Зарегистрирован: 27.04.2014

delete

upd? может поможет... это