Servo che non sta fermo

salve a tutti,

qualche tempo mi si è rotto il frigo, nel senso che si è rotta la sonda della temperatura e quindi restava sempre acceso tanto da ghiacciarmi un bel pezzo di formaggio mandandomi letteralmente su tutte le furie....

secondo il tecnico è, ovviamente, da cambiare a meno che " non gli faccio io na modifica..... "(dice lui...) e non vi dico il prezzo che mi ha sparato perche è un insulto all'intelligenza

la modifica l'ho realizzata da solo, sfruttando l'intercapedine del frigo: una sonda ds18b20 e un servo che agisce direttamente sulla manopola del frigo ruotandola fino a farlo spegnere quando arriva ad una certa temperatura.....

per qualche mese ha funzionato bene( discretamente bene) ma al ritorno dalle ferie ho notato un'anomalia: la posizione del servo "fluttua" fino ad accenderlo quando non dovrebbe... il dato ancora piu strano e che se resetto arduino, per qualche minuto torna a funzionare "bene" poi si stara di nuovo.....

qualcuna sa spiegarmi perche ?

grazie in anticipo

Non dico niente sulla soluzione per riparare il frigo, non sono un elettronico o un riparatore di elettrodomestici, quindi se esiste una soluzione standar e economica io non la conosco :slight_smile:

Per quanto riguarda il problema di arduino e servo non ti si può dire niente senza esaminare il codice e o lo schema elettrico.

Per la parte software un servo cambia posizione se si danno nuovi valori alla servo.write(), ipotizzando che il servo funzioni correttamente, si potrebbe muovere perché viene inviato un nuovo valore con servo.write(). Questo potrebbe avvenire per diversi motivi, un programma che come progettato lo faccia, o per un problema elettronico, il sensore di temperatura per qualche motivo da valori sbagliati e di conseguenza viene mosso il servo anche se per la temperatura effettiva non dovrebbe farlo.

Poi su temperature di 10 gradi non dovrebbero esserci problemi di funzionamento di arduino, ma temperature molto basse non so se diano problemi di funzionamento.

anzitutto grazie per la risposta...

per quanto riguarda i valori acquisiti, questi sono costanti( almeno il display cosi dice)

per il vero io pensavo a qualche problema con l'alimetazione.. (un caricabatterie da 5v/700 mA reciclato per l'occasione....)

cmq questo è il codice che sto usando....

#include <Servo.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 LiquidCrystal_I2C lcd(0x3F, 16, 2);
#define ONE_WIRE_BUS 8    //pin  sonda


 Servo myservo;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
float Timp = 4;

void setup(void) {
  Wire.begin();
  Serial.begin(115200);
  sensors.begin();
  myservo.attach(9);
  lcd.init();
   lcd.backlight();
   lcd.print(" BENVENUTO.. ");
   
  myservo.write(170);
  delay(2000);
   pinMode(10, INPUT_PULLUP);// tasti per alzare o abbassare la T impostata
   pinMode(11, INPUT_PULLUP);
   pinMode(7 , OUTPUT);// led di stato
   lcd.clear();
}


void loop(void) {
 if (digitalRead(10) == LOW){
                             Timp += 0.5;
                             if (Timp >12){
                              Timp = 1;}
                             }
   if (digitalRead(11) == LOW){
                             Timp -= 0.5;
                             if (Timp < 1 ){
                              Timp = 12;}
                             }
  sensors.requestTemperatures();
 float  tempC = sensors.getTempCByIndex(0);  
 
           lcd.setCursor(0,0);
           lcd.print("Temp: ");
           lcd.print(tempC,1 );
           lcd.print ((char)223);
           lcd.setCursor(6,1);
           lcd.print(Timp,1);
        

if (tempC >= Timp){
                myservo.write(10);
                 digitalWrite(7, HIGH);
                   }
    else {
          myservo.write(170); 
          digitalWrite(7, LOW);
          } 
 
 
  
                   
     Serial.println(Timp);                  
             
   delay(15000);
}

Ma il led sul pin 7 commutazione assieme al movimento del servo?

Non so se il problema è questo ma è un problema di logica di funzionamento che ti voglio esporre.
Il servo da tuo codice si potrebbe muovere ogni 15 secondi dalla pausa del delay().

Un regolatore di temperatura molto semplice è il regolatore on-off, accendo valore minimo e spengo al valore massimo, ma questi due valori devono avere un intervallo abbastanza grande in maniera da trovarsi in un intervallo di temperatura in cui non agire.

Nel tuo caso dici, se la temperatura è questa accendi, altrimenti spegni, di conseguenza a una piccola variazione di temperatura il servo agisce.

Esempio

Se temperatura >= 1000
accendi
altrimenti
spegni

Questo pseudocodice accenderà a 1000 e se la temperatura arriva a 999 spegne, per poi riaccendere, e cosi molto frequentemente.

On off corretto

se temperatura >=1000
accendi

altrimenti se temperatura <=500
spegni

In questo pseudocodice tra temperatura 1000 e temperatura 500 il regolatore non interviene, nel tuo caso non muove il servo.

C1P8:
Ma il led sul pin 7 commutazione assieme al movimento del servo?

il led si accende quando il frigo è acceso e viceversa;

@torn24:

il problema che hai sollevato e la causa di quel delay(15000); un po ha risolto, specie di notte quando il frigo rimane chiuso ma in definitiva sapevo che non era la soluzione "migliore", la tua è certamente meglio....

cmq i due fatti non sono collegati.. ripeto per un paio di mesi ha funzionato(meglio di quanto credessi per il vero) e se resetto arduino togliendo l'alimentazione i servo riprende a funzionare come dovrebbe.. dopo qualche minuto è come se si starasse, possibile ?

mixmax122:
per qualche mese ha funzionato bene( discretamente bene) ma al ritorno dalle ferie ho notato un'anomalia: la posizione del servo "fluttua" fino ad accenderlo quando non dovrebbe... il dato ancora piu strano e che se resetto arduino, per qualche minuto torna a funzionare "bene" poi si stara di nuovo.....

Mah, tu il servo lo posizioni a 10 e 170 gradi fissi quindi escluderei che si possa trattare del problema del tremore "parkinsoniano" di certi servo economici come i classici SG90. Escludendo poi il sensore di temperatura, che dici di aver verificato che funziona, devo supporre che sia comunque qualcosa legato al servo.

Comunque io proverei ad evitare di reimpostare inutilmente il servo se già era posizionato (a 10 o 170), non credo che sia questo realmente il problema, ma lascerei in pace il servo in questo modo (tra l'altro ti consiglio di indentare meglio il codice, fallo fare almeno all'IDE con Ctrl-T, così diventa più leggibile):

#include <Servo.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);

#define ONE_WIRE_BUS 8    //pin  sonda

Servo myservo;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
float Timp = 4;

// Flag per indicare l'attuale stato
int curStatus = -1;

void setup(void) {
  Wire.begin();
  Serial.begin(115200);
  sensors.begin();
  myservo.attach(9);
  lcd.init();
   lcd.backlight();
   lcd.print(" BENVENUTO.. ");
   
  myservo.write(170);
  delay(2000);
   pinMode(10, INPUT_PULLUP);// tasti per alzare o abbassare la T impostata
   pinMode(11, INPUT_PULLUP);
   pinMode(7 , OUTPUT);// led di stato
   lcd.clear();
}

void loop(void) 
{
  if (digitalRead(10) == LOW)
  {
    Timp += 0.5;
    if (Timp >12)
      Timp = 1;
  }
  if (digitalRead(11) == LOW)
  {
    Timp -= 0.5;
    if (Timp < 1 )
      Timp = 12;
  }

  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0); 

  lcd.setCursor(0,0);
  lcd.print("Temp: ");
  lcd.print(tempC,1 );
  lcd.print ((char)223);
  lcd.setCursor(6,1);
  lcd.print(Timp,1);

  // Imposto la nuova posizione del servo solamente quando necessario
  if (tempC >= Timp && (curStatus == 0 || curStatus == -1) ){
    myservo.write(10);
    digitalWrite(7, HIGH);
    curStatus = 1;
  }
  if (tempC < Timp && (curStatus == 1 || curStatus == -1) )
  {
    myservo.write(170);
    digitalWrite(7, LOW);
    curStatus = 0;
  }

  Serial.println(Timp);                 

  delay(15000);
}

In ogni caso verifica bene i cablaggi e soprattutto cambia servo, se ne hai un altro, per vedere se è quello ad essere difettoso.

anzitutto grazie per le risposte, a tutti....

alla fine credo che il tutto dipenda da un servo di bassa qualità(era stato preso per durare poco e cosi è stato)

Benche creda di essere andato contro il regolamento( e per questo chiedo scusa...) ho comunque imparato 2 cose;
la faccenda puo considerarsi conclusa...(con l'acquisto di un altro frigo :slight_smile: )

mixmax122:
Benche creda di essere andato contro il regolamento( e per questo chiedo scusa...)

Non preoccuparti, non vedo cose contrarie al regolamento, stavi chiedendo come mai un servo stesse "tremando".

ho comunque imparato 2 cose;
la faccenda puo considerarsi conclusa...(con l'acquisto di un altro frigo :slight_smile: )

Allora è una cosa! :smiley:

Scherzi a parte, i consigli valgono comunque per i prossimi tuoi progetti (es. usare Ctrl-T per indentare bene il codice e poi cercare di mantenerlo indentato, non impostare un servo con la stessa posizione che già ha, non serve :wink: ).

Ciao!