вольтметр на arduino nano и SSD1306 дисплее

djvindetta
Offline
Зарегистрирован: 22.06.2017

прошу помощи, я начинающий, прошу не бить ) 

суть проблемы- пытаюсь создать простейший вольтметр на nano и SSD1306 

до этого выводил изображение на экран, все получилось. Но вот при компиляции кода на вольтметр постоянно выскакивает проблема с VOID SETUP а точнее со строками, в которых описывается операция с дисплеем, пытался удалять, переставлять, но все четно!( ошибка одна и также (exit status 1 

'display' was not declared in this scope) 

знающие люди, ткните носом что я не так делаю, очень хочу научиться программировать arduio но - пока только ломаю голову ! 
 

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
 
int analogInput = 0;               // переменная для удобства инициализации и работы с аналог. портом 0
float vout = 0.0;                  // переменная с значением выходного напряжения  
float vin = 0.0;                   // переменная с результатом измерений
float R1 = 100000.0;               // сопротивление R1
float R2 = 10000.0;                // сопротивление R2
int value = 0;                     // переменная хранения данных 
 
void setup(){ 
   Serial.begin(9600);
 
  pinMode(analogInput, INPUT);   // инициализируем аналоговый порт 0, как вход
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Hello, world!");
  display.setTextColor(BLACK, WHITE); // установка курсора 
}
void loop()                        // производим чтение аналогового сигнала и выводим на дисплей
{
   value = analogRead(analogInput);// читаем аналоговый сигнал, с аналог. порта - 0 
   vout = (value * 5.0) / 1024.0;  // не забываем про внесение поправки (5.0 - это идеальный вариант,хотя все возможно)
   vin = vout / (R2/(R1+R2));      // в переменной будет значение входного напряжения
   if (vin<0.09)                   // проверка, для получ. 0
  {   
   vin=0.0;                        // обнуляем нежелательное значение
   }
void loop()    
   display.println("U = ","vin","volt");
 
   delay(500); // задержка 500 мс. 
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

где и как описана/объявлена переменная display?

djvindetta
Offline
Зарегистрирован: 22.06.2017

 в VOID SETUP

начина вот с этой строки 

  display.setTextSize(1);

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

это использование (обращение к) переменной.  А объявление где?  Какого она типа?

 

и пошто 2 раза void loop() написано?

djvindetta
Offline
Зарегистрирован: 22.06.2017

прошу простить за тупость обьявление к чему должно относиться ?!

 

djvindetta
Offline
Зарегистрирован: 22.06.2017

действительно 2 void loop(((
убрал его теперь придерается к 

 display.println("U = ","vin","volt"); 

пишет - 'display' was not declared in this scope

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

к переменной display

вот это

int analogInput = 0;               // переменная для удобства инициализации и работы с аналог. портом 0
08 float vout = 0.0;                  // переменная с значением выходного напряжения 
09 float vin = 0.0;                   // переменная с результатом измерений
10 float R1 = 100000.0;               // сопротивление R1
11 float R2 = 10000.0;                // сопротивление R2
12 int value = 0;                     // переменная хранения данных
 

объявления.  Вот это 

   vin = vout / (R2/(R1+R2));      // в переменной будет значение входного напряжения
 

использование переменных vin, vout, R1, R2,  ОБЪЯВЛЕННЫХ ранее

djvindetta
Offline
Зарегистрирован: 22.06.2017

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ёптваюмать!!!  ты сам писал

"до этого выводил изображение на экран"

ну дак посмотри же прошлый код, КАКОГО ТИПА была переменная display. 

в ОБЬЯВЛЕНИЯХ, между #Includ-ами и void setup().  И обьяви ты ее наконец так же. 

djvindetta
Offline
Зарегистрирован: 22.06.2017

вот все что было между ними

Adafruit_SSD1306 display(OLED_RESET);

 const unsigned char PROGMEM logoBmp[] = {
посде скобки шол код картинки 
все, больше ничего не было
 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

и что тебе мешает вставить 

Adafruit_SSD1306 display(OLED_RESET);  // ОБЪЯВЛЕНИЕ ТИПА

где нить между другими обьявлениями

      int analogInput = 0;               // переменная для удобства инициализации и работы с аналог. портом 0
08 float vout = 0.0;                  // переменная с значением выходного напряжения 
09 float vin = 0.0;                   // переменная с результатом измерений
10 float R1 = 100000.0;               // сопротивление R1
11 float R2 = 10000.0;                // сопротивление R2
12

int value = 0;                     // переменная хранения данных 

Adafruit_SSD1306 display(OLED_RESET); 

 

djvindetta
Offline
Зарегистрирован: 22.06.2017

опять проблема с дисплеем exit status 1

no matching function for call to 'Adafruit_SSD1306::println(const char [5], const char [4], const char [5])'
на строке
 display.println("U = ","vin","volt");
нужна константа, но я не знаю как она пишится 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

потому что вот так надо писать

display.print("U = ");display.print("vin"); display.println("volt");

djvindetta
Offline
Зарегистрирован: 22.06.2017

спасибо большое за помощь, все заработало
вот готовый код прошивки 
 

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4


int analogInput = 0;               // переменная для удобства инициализации и работы с аналог. портом 0
float vout = 0.0;                  // переменная с значением выходного напряжения  
float vin = 0.0;                   // переменная с результатом измерений
float R1 = 100000.0;               // сопротивление R1
float R2 = 10000.0;                // сопротивление R2
int value = 0;                     // переменная хранения данных 
Adafruit_SSD1306 display(OLED_RESET);
void setup(){ 
  pinMode(analogInput, INPUT);   // инициализируем аналоговый порт 0, как вход 
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
  display.display();
  delay(2000);
  display.clearDisplay();}
void loop() {                      // производим чтение аналогового сигнала и выводим на дисплей
 
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
   value = analogRead(analogInput);// читаем аналоговый сигнал, с аналог. порта - 0 
   vout = (value * 5.0) / 1024.0;  // не забываем про внесение поправки (5.0 - это идеальный вариант,хотя все возможно)
   vin = vout / (R2/(R1+R2));      // в переменной будет значение входного напряжения
   if (vin<0.09)                   // проверка, для получ. 0
  {   
   vin=0.0;                        // обнуляем нежелательное значение
   }   
   display.print("U = ");display.print(vin); display.println("volt");
   display.display();
   delay(500);
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нальешь при случае.