Sari la conținut
ELFORUM - Forumul electronistilor

Ajutor cu un volt-termometru cu display OLED


fratello

Postări Recomandate

Da, fix la aia ma refeream, acum stateam si eu sa-l caut cum se numeste.  Poti incerca sa vezi daca face la fel sau nu, macar te convingi daca e din cauza memoriei sau nu.

Editat de Bandi Szasz
Link spre comentariu
  • Răspunsuri 117
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • fratello

    59

  • zvonacfirst

    17

  • nico_2010

    14

  • Bandi Szasz

    10

Top autori în acest subiect

Imagini postate

Alt procesor si ai rezolvat p[roblema definitiv.  Nu cred ca faci astea pentru vanzare astfel incat fiecare leu sa conteze.

 

Arduino costa 10 lei, cu 20 de lei poti sa folosesti esp32, rpi pico, cred ca si stm32.

Link spre comentariu

La tine nu Flash-ul e problema, ci RAM-ul, Flash are destul si nano. ESP8266 are 64KB RAM vs Nano care are 2kB. Nu iti trebuie nici 32M flash, in idea daca gasesti cu 4-8-16M si e mai ieftin este arhisuficient pentru ce vrei tu sa faci acolo. 

Si da, probabil ar rezolva problemele, daca nu te grabesti poti lua de la Ali, e vro 17 lei buc si de ceva vreme a aparut "Choice", cauti produse marcate cu "Choice", iei de 45 de lei si ai transport gratuit, vine cu curierul la usa. Iei 3 bucati cu acelasi bani pe care iai de pe ala de 30 lei + vro 25 transport

Editat de Bandi Szasz
Link spre comentariu

Am "mutat" proiectul pe un Wemos D1 mini. Functioneaza, dar .... bineinteles ca partea de voltmetru este total aiurea :(.

Se pare ca A0 la Wemos nu este egal cu A0 la Nano.

Deci ... reluare ; vad ce placi mai gasesc prin casa (/magazine).

 

 

Asa ceva ar fi OK ?

esp32.jpg

Editat de fratello
Link spre comentariu

"

The Wemos boards have a voltage divider consisting of 220K & 100K, so that it can accept voltages up to 1.0*(220+100)/100 = 3.2V. If you want to increase this range, you can just put another resistor in series with the Wemos analog pin.

...Using a 1M resistor in series on the ADC pin I can accept up to 40.26V input, but anything over 13.2v will read as 13.2v"

 

Cu divizorul meu arata ... niste valori total aiurea ; si, oricum, nu va arata peste 13.2 volti (?!).

 

Din ce vad eu:

-renunt la partea de termometru

-incerc sa rescriu codul folosind o alta librarie pentru fonturi, mai mica

-renunt de tot, problema, oricat de mult ajutor as primi, ma depaseste.

Link spre comentariu

Cu libraria greiman / SSD1306Ascii  asa arata displayul, cu cel mai mare font :

 

ascii.thumb.jpg.1ba3a104ab655970c9788848cd02c2f2.jpg

 

Insuficient, pentru mine .... din pacate !

Dar, intr-adevar, acum functioneaza corect, fara blocaje.

 

Codul :

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <OneWire.h>
#include <DallasTemperature.h>

#define I2C_ADDRESS 0x3C
#define ONE_WIRE_BUS 2 // Pinul la care este conectat senzorul DS18B20

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;

SSD1306AsciiWire oled;

int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // resistance of R1 (100K)
float R2 =  10000.0; // resistance of R2 (10K) 
int value = 0;

double temp;

//------------------------------------------------------------------------------
void setup() {
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
//  oled.set2X();
  oled.setFont(fixed_bold10x15);
  oled.clear();
  
  pinMode(analogInput, INPUT);

  sensors.begin();
  sensors.setResolution(tempDeviceAddress, 12);
}

void loop() {
   // read the value at analog input
  value = analogRead(analogInput);
  vout = (value * 5.0) / 1024.0; // see text
  vin = vout / (R2/(R1+R2)); 
  if (vin<0.09) {
  vin=0.0;//statement to quash undesired reading !
  }
  
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0);
  if (tempC != DEVICE_DISCONNECTED_C)
  {
    temp=tempC;
  }
  else
  {
    temp= 99.9;  //aici mesajul de eroare senzor !!!!
  }
  oled.setCursor(24,0);
  oled.println("Temp C:");
  oled.setCursor(35,2);
  oled.println(tempC,1);
  oled.setCursor(26,4);
  oled.println("Volts:");
  oled.setCursor(35,6);
  oled.println(vin,1);
  delay(1000);
  }

 

 

Editat de fratello
Link spre comentariu

Am facut acum vreun an o sursa reglabila pentru un amic iar panelmetrul era cu Arduino NANO si Oled de 1.3".

Am afisat pe oled mult mai multe informatii, inclusiv elemente grafice, si a functionat fara probleme. Filmuletul de mai jos este tot ce mai am, recuperat dintr-o conversatie pe WhatsApp cu amicul meu. Am pierdut restul din pacate. Poate voi reconstitui cand voi avea timp si voi avea nevoie.

Nu inteleg cum un softulet ca cel scris de @fratello poate sa sufoce un uC Atmega328. NANO folosit de mine a fost tot clona China.

 

 

Link spre comentariu

Plecand de la ideea ca cineva a reusit totusi sa inghesuie in Arduino Nano un program atat de complicat (vezi exemplul de mai sus, cu statia de lipit), am luat la puricat acel cod si ....

Am reusit sa rescriu codul meu astfel incat am urmatoarele valori :

mem.thumb.jpg.b139eee454b7dec686c9d673eaafbcce.jpg

 

Din pacate, tot se blocheaza... Chiar nu mai stiu ce as putea face/incerca. Am folosit alta placa Arduino, alt senzor DS18B20, alimentarea e din USB.

 

Codul rescris :

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <U8glib.h>             // https://github.com/olikraus/u8glib
#define ONE_WIRE_BUS 2 //Pin DS al senzorului DS18B20

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;

 
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK);  


int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // resistance of R1 (100K)
float R2 =  10000.0; // resistance of R2 (10K) 
int value = 0;

double temp;

void setup() { 
  pinMode(analogInput, INPUT);
  sensors.begin();
  sensors.setResolution(tempDeviceAddress, 11);
}
 

void loop() {
   value = analogRead(analogInput);
   vout = (value * 5.0) / 1024.0; 
   vin = vout / (R2/(R1+R2)); 

if (vin<0.09) {
  vin=0.0;//statement to quash undesired reading !
  }
  
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0); 
  if (tempC != DEVICE_DISCONNECTED_C)
  {
    temp=tempC;
  }
  else
  {
    temp= 99.9;  //aici mesajul de eroare senzor !!!!
  }


  u8g.firstPage();
  do {
 u8g.setFont(u8g_font_helvB24r);
 u8g.drawRFrame(0, 30, 128, 32, 10);     // draws frame with rounded edges
  
if (vin>9.99) {
  u8g.setPrintPos(20,25);
 }
  else {
  u8g.setPrintPos(38,25); //rand copiat
 } 

  u8g.println(vin,1);                        //Prints the voltage
  u8g.setPrintPos(84,25); 
  u8g.println(" V");


if ((temp<0)&& (abs(temp)<9.9)){
  u8g.setPrintPos(28,60);  
  u8g.println(temp,1);                       //Prints the temperature
  u8g.drawCircle(87,40,4);
  u8g.drawCircle(87,40,3);
  u8g.println(" C ");  
 }
  else if (temp<0) {
  u8g.setPrintPos(10,60);   
 }
 else if (temp>9.99){
 u8g.setPrintPos(20,60);
 }
 else{
 u8g.setPrintPos(38,60);  
 }
 u8g.println(temp,1);                        //Prints the temperature
 u8g.drawCircle(88,40,4);
 u8g.drawCircle(88,40,3);
 u8g.println(" C");
 }
   while(u8g.nextPage());
}

 

Ce as mai putea face ??? Sa incerc cu alt display ? Sa incerc alt mod de alimentare a acestui display (ca in poza de mai jos) ? Chiar nu mai stiu ... am obosit.

oled.thumb.jpg.b65086a3935df742df74a16305081674.jpg

Link spre comentariu
Acum 15 ore, fratello a spus:

Plecand de la ideea ca cineva a reusit totusi sa inghesuie in Arduino Nano un program atat de complicat (vezi exemplul de mai sus, cu statia de lipit), am luat la puricat acel cod si ....

Am reusit sa rescriu codul meu astfel incat am urmatoarele valori :

mem.thumb.jpg.b139eee454b7dec686c9d673eaafbcce.jpg

 

Cu 15% DRAM ocupat nu are cum sa faca buffering la OLED. Asta e diferenta intre codul tau si cel original, in al tau nu se face pixel buffering in DRAM ci se scrie on the fly in controllerul de la OLED, fix cea ce face si libraria aia "Ascii". Merge si fara buffering treaba, e putin mai lent la afisari complete, nu prea merg fonturi custom, etc.. 

Editat de Bandi Szasz
Link spre comentariu

Salut,

Am incercat sa reproduc proiectul tau si functioneaza fara probleme de ceva timp.

Codul este asta:

#include "U8glib.h"            // U8glib library for the OLED
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
           
#define ONE_WIRE_BUS 2 //Pin DS al senzorului DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // Atentie! Afisajul este SSD1306, nu SSD1106!


const int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // resistance of R1 (100K)
float R2 =  10000.0; // resistance of R2 (10K) 
int value = 0;

double temp;



void setup()
{
  Serial.begin(38400);
  pinMode(analogInput, INPUT);
  sensors.begin();
  sensors.setResolution(tempDeviceAddress, 12);
}

void loop(){
   // read the value at analog input
   value = analogRead(analogInput);
   vout = (value * 5.0) / 1024.0; 
   vin = vout / (R2/(R1+R2)); 

if (vin<0.09) {
  vin=0.0;//statement to quash undesired reading !
  }
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0);
  if (tempC != DEVICE_DISCONNECTED_C)
  {
    temp=tempC;
  }
  else
  {
    temp= 99.9;  //aici mesajul de eroare senzor !!!!
  }

  u8g.firstPage();  
  do 
    {
     draw();      
    }
  while( u8g.nextPage() );
  Serial.println(tempC);
delay(500);
}

void draw(void) 
{
    u8g.setFont(u8g_font_helvB24r);         // select font
//  u8g.setFont(u8g_font_profont29r);        
//  u8g.setFont(u8g_font_fub20r);
//  u8g.setFont(u8g_font_fur20r);
    u8g.drawRFrame(0, 30, 128, 32, 10);     // draws frame with rounded edges


if (vin>9.99) {
  u8g.setPrintPos(20,25);
 }
  else {
  u8g.setPrintPos(38,25); 
 } 


  u8g.println(vin,1);                        //Prints the voltage
  u8g.setPrintPos(84,25); 
  u8g.println(" V");


if ((temp<0)&& (abs(temp)<9.9)){
  u8g.setPrintPos(28,60);  
  u8g.println(temp,1);                       //Prints the temperature
  u8g.drawCircle(87,40,4);
  u8g.drawCircle(87,40,3);
  u8g.println(" C ");  
 }
  else if (temp<0) {
  u8g.setPrintPos(10,60);   
 }
 else if (temp>9.99){
 u8g.setPrintPos(20,60);
 }
 else{
 u8g.setPrintPos(38,60);  
 }
 u8g.println(temp,1);                        
 u8g.drawCircle(88,40,4);
 u8g.drawCircle(88,40,3);
 u8g.println(" C");
 }

 

Si rezultatul este asta:

 

image.jpeg.68b785edc8f41b8614a931035a73a6e3.jpeg

 

Verifica fuse-bits inca odata si vezi daca sunt corecti. Senzorul este cumparat de la Co...ex. 

Am folosit Arduino IDE1.8.9

Link spre comentariu

Multumesc ! Voi incerca si eu cu displayul din dotare.

De curiozitate ... lasati montajul sa functioneze ; al meu s-a blocat peste noapte...

Fuse trebuie sa fie : low FF, high DA, ext FD ?

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări