Sari la conținut
ELFORUM - Forumul electronistilor

Ajutor cu un volt-termometru cu display OLED


fratello

Postări Recomandate

Este vorba despre  modulul dc-dc din poza.

Dar nu, nu cred ca este vina lui ... Am incarcat softul original al voltmetrului si, la fel, se blocheaza ....

Ma dispera !!! Nu inteleg ce se intampla ... Oare displayul are o problema ???

dc-dc.jpg

Editat de fratello
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

Nu este o situatie similara, dar alimentam un ceas de la un modul (din ala care se pune pe placa de test). Ceasul se reseta la valorile initiale. De cand alimentez de la sursa de 12V prin intermediul unui CI 7805 nu mai am probleme.

Link spre comentariu

Sugestie: conecteaza NANO prin pinii ICSP la un programator USBASP si utilizeaza AVRDUDESS. In prima faza sunt curios daca detecteaza corect uC-ul de pe placa NANO. Apoi incercam sa scriem softul pe NANO stergand bootloaderul. Ulterior vom rescrie bootloaderul si softul tau. Vom vedea cum se comporta in cele doua situatii.

Link spre comentariu

1. Arduino il alimentez si eu prin 7805 (vezi schema in postul #1).

2.Voi incerca si cu AVRDUDESS

3.Am sters partea de termometru din softul "meu", am pastrat doar voltmetrul. Pana acum functioneaza OK (de vreo 1 ora)

// doar voltmetru
// Librarie grafica U8G2LIB !!!

#include "U8g2lib.h"  
#include <SPI.h>
#include <avr/wdt.h>
           
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

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;


void setup()
{
  u8g2.begin();
  pinMode(analogInput, INPUT);
  wdt_disable();
  wdt_enable(WDTO_2S); // set watchdog to 2 secs
}

void loop(){
   u8g2.clearBuffer();          // clear the internal memory
   // 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 !
  }
 

  wdt_reset();
  
  u8g2.setFont(u8g2_font_helvB24_tf);         // select font   
 
if (vin>9.99) {
  u8g2.setCursor(20,25);
 }
  else {
  u8g2.setCursor(38,25); 
 } 


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


  u8g2.updateDisplay();
 }

 

Link spre comentariu

Nu reusesc nici cu Avrdudess...

 

avrdudess err.jpg

 

 

 

 

LE : Am reusit urmand acest tutorial :

Prezenta condensatorului cred ca a facut diferenta.

bootloader_ok.jpg

Editat de fratello
Link spre comentariu

Rezumand, fiindca am amestecat rau lucrurile, imi cer iertare...

 

1.Am rezolvat cu rescrierea bootloaderului. Putem considera subiectul inchis.

2.Partea de voltmetru (scrisa de mine cu U8g2lib) functioneaza bine, nu s-a mai blocat Arduino.

3.Partea de termometru (scrisa de mine cu U8g2lib) cauzeaza blocarea Arduino !!!

 

// Doar termometru
// Librarie grafica U8G2LIB !!!

#include "U8g2lib.h"  
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <avr/wdt.h>
           
#define ONE_WIRE_BUS 2 //Pin DS al senzorului DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);


double temp;



void setup()
{
  u8g2.begin();
  sensors.begin();
  sensors.setResolution(tempDeviceAddress, 12);

  wdt_disable();
  wdt_enable(WDTO_2S); // set watchdog to 2 secs
}

void loop(){
  u8g2.clearBuffer();          // clear the internal memory

  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0); 
  if (tempC != DEVICE_DISCONNECTED_C)
  {
    temp=tempC;
  }
  else
  {
    temp= 99.9;  //aici mesajul de eroare senzor !!!!
  }

  wdt_reset();
  
  u8g2.setFont(u8g2_font_helvB24_tf);         // select font   
  u8g2.drawRFrame(0, 30, 128, 32, 10);        // draws frame with rounded edges



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

 u8g2.updateDisplay();
 }

 

Editat de fratello
Link spre comentariu

Am apelat la ChatGPT care mi-a scris urmatorul cod :

// Doar termometru - ChatGPT
// Librarie grafica U8G2LIB !!!

#include "U8g2lib.h"  
#include <OneWire.h>
#include <DallasTemperature.h>
           
#define ONE_WIRE_BUS 2 // Poate fi modificat în funcție de cum este conectat senzorul DS18B20

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

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

double temp;

void setup() {
  // Inițializăm afișajul OLED
  u8g2.begin();

  // Inițializăm comunicarea cu senzorul DS18B20
  sensors.begin();
}

void loop(){
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0); 
  
  if (tempC != DEVICE_DISCONNECTED_C)
  {
    temp=tempC;
  }
  else
  {
    temp= 99.9;  //aici mesajul de eroare senzor !!!!
  }

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_helvB24_tf);         // select font   
  u8g2.drawRFrame(0, 30, 128, 32, 10);        // draws frame with rounded edges
  u8g2.setCursor(20,60);
  u8g2.println(temp,1);                        
  u8g2.drawCircle(88,40,4);
  u8g2.drawCircle(88,40,3);
  u8g2.println(" C");
  u8g2.sendBuffer();
 delay,50;
 }

 

Din pacate .... acelasi comportament : dupa un timp se blocheaza functionarea. Nu se mai aprinde/clipeste ledul L si Arduino poate fi resetat din buton. Dar ce folos :( ....

Link spre comentariu

A. Cum spuneammai devreme, dar vorbeam de unul singur: verifica fusebits.

Trebuie sa arate asa:

nano.menu.cpu.atmega328.bootloader.low_fuses=0xFF
nano.menu.cpu.atmega328.bootloader.high_fuses=0xDA
nano.menu.cpu.atmega328.bootloader.extended_fuses=0x05

La tine nu arata asa!

B. Altfel ai depasit, in functionare cantitatea de RAM si s-a dus de suflet.

C. Schimba DS18B20 cu un alt senzor din acelasi tip, dar achizitionat din alta sursa decat de la chinezi si vezi daca face tot asa.

Link spre comentariu

A. Cum verific ? Cu Avrdudess ? Exista si alta posibilitate ?

B. Adica ? M-am gandit ca, la un moment dat, memoria "da pe afara", dar ce as putea face in acest sens ?

C. Voi incerca cu unul fara capsula metalica.

Multumesc mult !

Link spre comentariu

A. Da.

B. La co plilare, Arduino IDE iti da un mesaj referitor la cantitatea de Flash si Ram ocupate. In functionare, s-ar putea ca memoria Ram (aia dinamica) sa se umple si atunci uC se blocheaza.

Link spre comentariu
Acum 1 oră, fratello a spus:

Multumesc !

Fiindca nu am nimic de pierdut, voi incerca o "marire de memorie" :) .

 

N-am stat sincer sa ascult tot video dar din titlu reiese ca se face "marire" la flash, tu ai probleme cu DRAM nu Flash, la memoria flash ai ocupat doar 63% acolo n-ar fi o problema daca se ocupa chiar 100% pentru ca e memorie statica.

La un programel atat de simplu n-ai ce sa faci, OLED are nevoie de multa memorie RAM, ar mai fi o solutie daca vrei sa afisezi doar numere, era o librarie foarte minimalista pt OLED fara fonturi, iconite, etc... doar de afisat numere parca si ocupa foarte putin.

Editat de Bandi Szasz
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