Помогите разобраться с кодом

Если датчик не выдает данные - меняй датчик.

1 лайк

Спасибо

там не может быть пусто, скорость порта монитора 115200 выставлял?

там минимум это:

START
In LOOP

 CRC=0
0.00
0.0
In LOOP

 CRC=0
0.00
0.0
In LOOP

 CRC=0
0.00
0.0

#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() {
  Serial.begin(115200);
  Serial.println("START");
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}


void loop() {

  Serial.println("In 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 = 0;
  Tc_100 = (data[1] * 256.0 + data[0]) / 16.0;
  Serial.println(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(2);
  display.setTextColor(WHITE);
  Serial.println(Tc_100, 1);
  display.print(Tc_100, 1); //Выводим переменную на дисплей
  display.display();
  delay(1000);
}

там что то с выводом на дисплей, не выводится во вторую половину
разбираться не охота, сами…

1 лайк

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

А зачем? При разлочивании мк доктор трёт содержимое flash…

я вспомнил что там не так!!

// Для дисплея
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Ширина OLED-дисплея, в пикселях
#define SCREEN_HEIGHT 64 // Высота OLED-дисплея в пикселях
#define OLED_RESET    -1 // т.к.у дисплея нет пина сброса прописываем -1, если используется общий сброс Arduino

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Объявляем имя и задаем параметры


// Для датчика температуры
#include <OneWire.h>
OneWire ds(7);  // работаем через пин 7

void setup() {
  Serial.begin(115200);
  Serial.println("START");
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}


void loop() {

  Serial.println("In 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 = 0;
  Tc_100 = (data[1] * 256.0 + data[0]) / 16.0;
  Serial.print("T=");
  Serial.println(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(2);
  display.setTextColor(WHITE);
  Serial.println(Tc_100, 1);
  display.println(Tc_100, 1); //Выводим переменную на дисплей
  display.display();
  delay(1000);
}

строки 6-10

1 лайк

ОГРОМНОЕ СПАСИБО,побольше бы таких людей,все работает

1 лайк

Если не тяжело попробуй в оригинальном скетче эту строку поменять на эту

Эту
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

на эту
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

на котором у меня ничего неработало?

можешь на моём, где уже отображение было. кроме температуры

я смотрю, ты сегодня в ударе :innocent:

голова лопнет,от того что незнаеш

да нет, это я местному “гуру” @ua6em, написал.
у него в привычку входит, по выходным, пару раз садится в лужу.

Зашил,ничего

отрицательный результат тоже результат

а что должно было произойти если у устройства адрес 0x3C, а не 0x3D ?

1 лайк

< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32>