ciao a tutti..sto facendo un software per una parabola motorizzata..il software funziona benissimo se non per il display..ogni tanto quando decide lui(come 30 secondi o 5 minuti) le scritte sul display spariscono,tutti i comandi funzionano però non compare niente sul display..spegnendo e riaccendendo oppure premendo il tasto "salva" (che ho impostato un soft reset) sul display compare tutto di nuovo...sapete darmi una delucidazione???
grazie e questo è il codice
// diplay 4x20 con rimappattura potenziometri fine corsa e velocità ridotta
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <avr/wdt.h>
#define Reset_AVR() wdt_enable(WDTO_30MS) // soft reset sistema
#define inCom A0 // pin in pulsanti
#define inPotElev A1 // pin in potenziometro elevazione
#define inPotRot A2 // pin in potenziometro rotazione
#define inMot 13 // pin motore acceso
#define motDa 9 // pin motore orientamento 1
#define motDb 10 // pin motore orientamento 2
#define motEa 11 // pin motore elevazione 1
#define motEb 12 // pin motore elevazione 2
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //inizializza libreria display
int dirIn = 0; // lettura bussola in gradi
float compass = 0; // valore orientamento (cmps03)
int manButton; //ingresso comandi manuali
int elevazione; //ingresso tensione elevazione
int rotazione; //ingresso tensione rotazione
const byte velRid = 100; // velocità ridotta motore elevazione
const byte velRotRid = 200; // velocità ridotta motore rotazione
int dirHB = EEPROM.read(0); // legge direzione HotBird
int elevHB = EEPROM.read(1); // legge elevazione HotBird
byte oldState = LOW; //imposta stato bistabile
byte dirLock = 0; // direzione ok
byte elevLock = 0; // elevazione ok
void setup() {
lcd.begin(20, 4);
pinMode(inPotRot, INPUT); // ingresso potenziometro rotazione
pinMode(inPotElev, INPUT); // ingresso potenziometro elevazione
pinMode(inCom, INPUT); //ingresso tastiera
pinMode(8, INPUT); // ingresso bussola
pinMode(motEa, OUTPUT); //motore elevazione
pinMode(motEb, OUTPUT);
pinMode(motDa, OUTPUT); //motore orientamento
pinMode(motDb, OUTPUT);
ferma(); // ferma i motori
// accensione
lcd.setCursor(2,0);
lcd.print("**** HOTBIRD ***");
lcd.setCursor(1,1); // mostra direzione impostata
lcd.print("direzione:");
lcd.print(dirHB, DEC);
lcd.setCursor(1,2);
lcd.print("elevazione:"); // mostra elevazione impostata
lcd.print(elevHB, DEC);
lcd.print(" ");
lcd.print(" ");
delay(5000); // attesa 5 secondi
lcd.clear();
}
void loop() {
int dirHB = EEPROM.read(0); // legge direzione dalla cella 0
int elevHB = EEPROM.read(1);// legge elevazione dalla cella 1
compass = pulseIn(8, HIGH); // lettura bussola
dirIn = (compass/1000-1)*10.15; //trasforma in gradi
manButton = analogRead(inCom); // valori comandi manuali immessi su A0
elevazione = map(analogRead(inPotElev),402,600,0,180); // valori elevazione immessi su A1
rotazione = map(analogRead(inPotRot),400,486,0,360); // valori rotazione immessi su A2
////// BISTABILE MAN/AUTO///////
if (manButton > 50 && manButton < 150){ // 100 manuale/auto
if (oldState == LOW) {
oldState = HIGH; // attiva comandi automatici
lcd.setCursor(5,3);
lcd.print("AUTOMATICO");
elevLock = 0;
dirLock = 0;
}else{
oldState = LOW; // attiva comandi manuali
lcd.setCursor(0,3);
lcd.print(" ");
}
delay(500); // pausa 1/2 secondo
}
if (oldState == LOW){ // COMANDI MANUALI
if (manButton < 50) ferma(); // arresta motori
if (manButton > 180 && manButton < 220) salva(); // 200 salva valori
if (manButton > 280 && manButton < 320) abbassa(); // 300 abassa antenna
if (manButton > 380 && manButton < 420) alza(); // 400 alza antenna
if (manButton > 480 && manButton < 520) antiorario(); // 500 rotazione antioraria
if (manButton > 580 && manButton < 620) orario(); // 600 rotazione oraria
}else{orienta();}
if (digitalRead(inMot) == HIGH) chiude(); // chiude a motore acceso
{
lcd.setCursor(0,0); // prima riga
lcd.print("Bussola ");
lcd.print(dirIn, DEC);
lcd.print(" ");
lcd.setCursor(14,0); // prima riga
lcd.print("gradi ");
lcd.setCursor(0,1); // seconda riga
lcd.print("Elevazione ");
lcd.print(elevazione, DEC);
lcd.print(" ");
lcd.setCursor(0,2); // terza riga
lcd.print("Rotazione ");
lcd.print(rotazione, DEC);
lcd.print(" ");
}
}
//********** FUNZIONI MOTORI **********/
void alza(){
digitalWrite(motEb, HIGH);
if (elevazione > 130){
digitalWrite(motEa, HIGH);
}else{
if (elevazione > 90){
analogWrite(motEa, velRid);
}else{
analogWrite(motEa, LOW);
digitalWrite(motDa, HIGH);
digitalWrite(motDb, HIGH);
}
}
}
//****************************
void abbassa(){
digitalWrite(motEa, HIGH);
if (elevazione < 1){
digitalWrite(motEb, HIGH);
}else{
digitalWrite(motEb, LOW);
digitalWrite(motDa, HIGH);
digitalWrite(motDb, HIGH);
}
}
//****************************
void orario(){
digitalWrite(motDb, HIGH);
if (rotazione > 360){
digitalWrite(motDa, HIGH);
}else{
if (dirIn > 130 && dirIn < 190){
analogWrite(motDa, velRotRid);
}else{
digitalWrite(motDa, LOW);
digitalWrite(motEb, HIGH);
digitalWrite(motEa, HIGH);
}
}
}
//****************************
void antiorario(){
digitalWrite(motDa, HIGH);
if (rotazione < 1){
digitalWrite(motDb, HIGH);
}else{
if (dirIn > 130 && dirIn < 190){
analogWrite(motDb, velRotRid);
}else{
digitalWrite(motDb, LOW);
digitalWrite(motEb, HIGH);
digitalWrite(motEa, HIGH);
}
}
}
//****************************
void ferma(){
digitalWrite(motDa, HIGH);
digitalWrite(motDb, HIGH);
digitalWrite(motEb, HIGH);
digitalWrite(motEa, HIGH);
}
//****************************
void salva(){ // salva valori in eprom
EEPROM.write(0, dirIn);
EEPROM.write(1, elevazione);
delay(500);
lcd.setCursor(1,3);
lcd.print("POSIZIONE SALVATA");
delay(3000);
Reset_AVR();
}
//****************************
void chiude(){ // chiude antenna motore acceso
}
//***************************
void orienta(){ // funzione automatico
if (elevazione < elevHB) alza(); // alza antenna
if (elevazione > elevHB) abbassa(); // abbassa antenna
if (elevazione == elevHB){
digitalWrite(motEb, HIGH); // ferma motori
digitalWrite(motEa, HIGH);
elevLock = 1; // elevazione ok
}
if (elevazione == elevHB){
orario();
if (dirIn == dirHB - 1){
digitalWrite(motDa, HIGH);
digitalWrite(motDb, HIGH);
dirLock = 1; // direzione ok
}
if ((elevLock == 1) && (dirLock == 1)){
ferma();
oldState = LOW;
lcd.setCursor(0,3);
lcd.print(" ");
}
}
}