Arduino-Uno per un Alimentatore variabile 2 Oled e controlli vari

Post 11

Certo che ti da errore
Perché "secondario" e "ventola" li hai dichiarati int invece che string

Di farlo te lo ha già detto datman alcuni post fa

E io te ne ho spiegato l'importanza, poi

    MA

Se non metti in pratica i suggerimenti...

La cosa mi meraviglia:

Legge una volta
Poi 5 in ciclo
A casa mia fa sei letture
Ma diviso solo per 5

Qui legge una volta in una variabile
Poi somma 100 volte la variabile E una nuova lettura
A casa mia fa 201
Ma divide per 100

Se quel programma va è solo per un caso puramente incidentale

Riciao, ho fatto alcune modifiche suggerite da bravi maestri, appena la mia bimba lo permetterà pubbicherò il tutto, alcune cose, per il funzionamento del programma ho dovuto lasciarle come sono, altrimenti mi danno dati strani.
Buona serata.


//-------------------------Alimentatore PWM---------------------------\\

#include <Arduino.h>
#include <AVR/io.h>
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1309_128X64_NONAME0_1_HW_I2C oled1(U8G2_R0, U8X8_PIN_NONE);
U8G2_SSD1309_128X64_NONAME0_1_HW_I2C oled2(U8G2_R0, U8X8_PIN_NONE);

  int  Volts = A0;//input volt
  int Amps = A1;//input amp
  
  int LM35_pin = A2;//temperatura
  float tempC = 0;
  float temp = 0;
  float temp1 = 0;
  float milliVolt = 0;

  int potPin = A3;//input potenziometro A3
  float potPinRead = 0; //da 0 a 1023
  float dutyCycle = 0; //da 0 a 1 (1 è 100%)
  
  float VoltsADC = 0.0;
  int Volt = 0;
  float R1 = 27000.64; // resistance of R1
  float R2 = 4780.0; // resistance of R2
  float V = 5.12; // Arduino supply
  float vIn = 0.0;
  float vout = 0.0;

  float AmpsADC = 0.0;
  float Amps1 = 0.0;
  int amp = 0;
  float amper = 0.0;

float Watt = 0.0;

uint8_t secondario=0 ;
uint8_t ventola ;

 void setup() {
  
   Wire.begin();  

  oled1.begin();//  oled1.setI2CAddress(0x3C * 2)
  oled2.begin();//  oled2.setI2CAddress(0x3D * 2) 
  
  cli();//clear interrupts flag   
   DDRC &= ~(1 << PC0);//Pin A0 Porta C input Volt
   DDRC &= ~(1 << PC1);//Pin A1 Porta C input Amper 
     
   DDRC &= ~(1 << PC2);//Pin A2 Porta C input temperatura
   DDRC &= ~(1 << PC3);//Pin A3 Porta C input potenziometro PWM 
         
   DDRD |= (1 << PD2);// Pin 2 Porta D output //ventola on/off   
   DDRD |= (1 << PD7);// Pin 7 Porta D output //rele scambio avvolgimenti0/12
  
   DDRB = _BV(PB1);// Pin 9 Porta B output PWM           
  TCCR1A = _BV(COM1A1) | _BV(WGM11);//non-inverting PWM 
  TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // prescaler 1       
  ICR1 = 800;      //800=20Khz, 350=45.83Khz, 650=24.59Khz, 600=26.66Khz
  sei();//set interrupts flag  
  OCR1A = (int) (ICR1 * 0.99999);        
 }

float fmap(float x, float in_min, float in_max, float out_min, float out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

void loop() {
  
//Regolazione PWM

potPinRead = analogRead(potPin);
dutyCycle = potPinRead / 1023.0;
OCR1A = (int) (ICR1 * dutyCycle);// regola Duty

    //Leggi i volt

Volt=analogRead(PC0);
  for (int i = 0; i < 15; i++) {
    Volts = Volts + analogRead(PC0);
  }
  VoltsADC = Volts / 15;  //
  vout = (VoltsADC * V) / 1023;
  vIn = vout / (R2 / (R1 + R2));
   
  // Lettura Amper 
    
   amp = analogRead(PC1);
   for (int e =0; e < 15; e++){
    AmpsADC = AmpsADC + analogRead(PC1);
   }
  Amps1 = AmpsADC / 15 ;
  amper = fabs(fmap(Amps1, 508, 703.0, 0.0, 5.0))*2;
  if (amper < 0) amper = 0.0;
     
  // Gestione secondari

    if (vIn <= 14){
      PORTD &= ~(1<<PD7);      //Pin 7(PD7) LOW rele scambio avvolgimenti 0/12 +led verde 
   String secondario = "0/12 V";      
    }

    if (vIn > 14){
      PORTD |= (1<<PD7); //Pin 7(PD7) HIGH rele +led rosso      
    String secondario = "12/24 V";
  }

    //Calcolo Watt
  
  Watt = (amper * vIn);

  // temperatura sensore LM35

  temp = analogRead(LM35_pin);
  for (int e = 0; e < 100; e++) {
    temp1 = temp1 + analogRead(LM35_pin);
  }
  temp1 = temp1 / 100;
  milliVolt = (( temp1 * (V / 1023)) / 10) * 1000;
  tempC = milliVolt ;
  
  if (tempC > 50) {
      PORTD |= (1<<PD2); //Pin 2(PD2) HIGH Ventola on +led rosso         
    ventola = "On "; 
  }
  else {
          PORTD &= ~(1<<PD2);//Pin 2(PD2) LOW ventola off + led verde
    ventola = "Off";
  }
        
  // print OLED 1 e 2

  oled1.firstPage();
  do {
    oled1.setFontMode(0);
    oled1.setFont(u8g2_font_TimesNewPixel_tr);
    oled1.drawStr(5, 20, "Volt -");
    oled1.drawStr(3, 47, "Amp.-");
    oled1.drawRFrame(0, 0, 127, 63, 3);
    oled1.setFont(u8g2_font_osb21_tn);
    oled1.drawStr(50, 28, String(vIn).c_str());
    oled1.drawStr(50, 56, String(amper).c_str());
  } while (oled1.nextPage());
      
  oled2.firstPage();
  do {
    oled2.drawRFrame(0, 0, 127, 63, 3);
    oled2.setFont(u8g2_font_9x15_t_symbols);
    oled2.drawGlyph(100, 13, 8451); //Simbolo °C
    oled2.setFont(u8g2_font_ncenB08_tr);
    oled2.drawStr(65, 12, String(tempC).c_str());    
    oled2.drawStr(65, 23, (secondario));
    oled2.drawStr(65, 34, (ventola));
    oled2.drawStr(65, 45, String(Watt).c_str());
    oled2.setFont(u8g2_font_ncenR08_tr);
    oled2.drawStr(3, 12,"Tr. Finale");
    oled2.drawStr(3, 23, "Secondario");
    oled2.drawStr(3, 34, "Ventola");
    oled2.drawStr(3, 45, "Watt");
  } while (oled2.nextPage());
  delay(10);
}digita o incolla il codice qui

rivisto tutto, credo vada bene.

Come si usa dire:
Contento tu contenti tutti

Mio lavoro convincerti non è

Io credo che non sia questione di convinzione,ho imparato che la teoria va abbinata alla pratica ,quindi prima di affermare qualcosa faccio la verifica per capire se funziona o no o se nel tempo puo dare preblemi, nel mio caso è obbligatorio instaurare l'hardware e lanciare il piccolo programmino che ho fatto, solo allora si capirà dove è giusto o sbagliato.
Certo che non sono perfetto, so fare benissimo da solo tanti errori ma come detto sono qui per imparare, ho sempre voluto fare l'alunno non l'insegnate.
Grazie a tutti.

Ciao, caricato il programmino con le modifiche suggerite e non funziona piu.
i display sono andati in confusione, i dati facevano quello che volevano.
pontificare senza verificare, brutta cosa.
Comunque ringrazio ugualmente per l'impegno. GRAZIE

Devi studiare le basi del linguaggio che è fortemente tipizzato.
Hai due variabili con lo stesso nome ma tipi differenti:

// variabile globale di tipo intero senza segno (1 byte)
uint8_t secondario=0 ;

Mentre qui la variabile è locale e cessa di esistere fuori dal blocco
di codice in cui è dichiarata. Il blocco di codice è { tuo codice }.

if (vIn > 14){
      PORTD |= (1<<PD7); //Pin 7(PD7) HIGH rele +led rosso      
    String secondario = "12/24 V";
  }

Come vedi qui dichiari secondario di tipo String, ma come detto
questa volta è in ambito locale. Tutte le variabili locali esistono solo
all'interno del blocco di codice in cui sono dichiarate.

Studia:

  • l'ambito di visibilità delle variabili, globale, locale.
  • I tipi di variabile.

Secondo me basta dichiarare globale: String secondario; e poi:

if (vIn > 14){
      PORTD |= (1<<PD7); //Pin 7(PD7) HIGH rele +led rosso      
      secondario = "12/24 V";

Ciao.

Ciao, Maurotec, ho provato a dichiare String secondario, ma mi da errore
e dice: no matching funtion for call to 'U8G2_SSD1309_128X64_NONAME0_1_HW_I2C:drawStr(int,int,String'

Se invece dichiaro: int secondario, non da errore e esegue correttamente la sua funzione.
Mettendo uint8_t secondario, non da errore, devo verificare che il display scriva il termine giusto.
Secondo me sono le librerie che uso, hanno bisogno della sintassi appropriata.

Ovviamente devi stampare così:

oled2.drawStr(65, 23, secondario.c_str());

Ciao.

Ma quante volte ti si deve dire di studiare?

Non puoi usare un int come fosse una stringa o viceversa
Ne confondere int con puntatori

Ma se non studi non ne esci
Come infatti sta accadendo

Voglio chiedere se è possibile cancellare tutto l'argomento che ho fatto, io devo studiare e loro sbagliano, ma non ne posso piu, basta.

NO, le discussioni non si cancellano, perché comunque possono contenere spunti utili per altre persone che le leggono.

Sul fatto che tu debba studiare ...
...mi permetto di dire che, purtroppo, contrariamente a quanto si dice in giro, se non si STUDIA SERIAMENTE, su Arduino la massimo di fa lampeggiare un LED o poco più; per tutto il resto occorre pazienza,impegno, e TANTO STUDIO :roll_eyes:

Guglielmo

Si tutto vero ma ho imparato che prima di dichiare qualcosa va confutata non si puo dire che qualcosa va fatta in un certo modo e alla verifica ti da errore,io le competenze le cerco e le approfondisco, certo ci possono essere errori, ma se tu interlocutore vieni interrogato in un determinato argomento penso che tu sappia di cosa si parla e ne abbia le competenze.
se la libreria U8g2lib mi dice che una funzione è sbagliata, chi ha ragione la libreria o l'interlocutore che mi ha detto di scrivere una funzione che non funziona.

Buona serata

Ma datman ti ha detto esattamente cosa fare

E te lo ha detto giusto

Adesso fai tanto la vittima
Ma non sei stato capace né di leggere né di fare

Ma studiatevi le librerie U8g2lib e poi ne parliamo, vittima di che, Mha!
Forse imparerete qualcosa che ancora non sapete.