Go Down

Topic: Problema Assurdo...SKetch lavora solo dopo aver aperto il monitor seriale (Read 1 time) previous topic - next topic

bruco1987

Ciao ragazzi... Come da titolo una cosa mai successa in tanti anni. Ho un arduino mega con uno sketch che funzionava perfettamente fino a qualche gg fa. Da ieri, dopo un stacca e attacca dell'alimentazione, lo sketch funziona solo se apro il monitor seriale oppure dopo l'upload dello sketch stesso... Ma se stacco e riattacco l'alimentazione, NULLA!!! il vuoto più assoluto, non parte fino a che non riapro il seriale. ci tengo a riprecisare che lo sketch ha funzionato per mesi fino a qualche gg fa.Qualche suggerimento? ecco qui:
Code: [Select]

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h>
#include <MegunoLink.h>
#include <CommandHandler.h>
#include <CircularBuffer.h>
#include <Filter.h>
#include <SPI.h>         // needed for Arduino versions later than 0018
#include <ArduinoTimer.h>
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008

ArduinoTimer HeartBeatTimer;

////////////////////udp/////////////////////////
IPAddress ComputerIPAddress(192, 168, 1, 122);
int RecPort = 8889; //Port on the megunolink machine for receiving

byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02
};

IPAddress ip(192, 168, 1, 117);

unsigned int localPort = 8888;      // local port to listen on
////////////////////udp/////////////////////////



#define SENSOR_PIN 2 // Do not use digital pins 0 or 1 since those conflict with the use of Serial.
OneWire oneWire(SENSOR_PIN);
DallasTemperature sensors(&oneWire);

//SerialCommandHandler.AddVariable(F("pulsantetemp1"), tempSensor1);

DeviceAddress tempSensor5 = {0x28, 0x62, 0x17, 0x27, 0x00, 0x00, 0x80, 0xE4};
DeviceAddress tempSensor6 = {0x28, 0x72, 0xB6, 0x26, 0x00, 0x00, 0x80, 0xCE};
DeviceAddress tempSensor7 = {0x28, 0xB1, 0x10, 0x27, 0x00, 0x00, 0x80, 0x28};


CommandHandler<> SerialCommandHandler;


////////////////udp//////////////////
EthernetUDP Udp;
InterfacePanel MyInterfacePanel("controllo", Udp);
CommandHandler<> SerialCommandHandler1(Udp, '!', '\r');
//////////////////udp//////////////////


void setup() {
  Serial.begin(9600);


  // Using the Ethernet Shield, pin 10 (SS) should be output,
  //and pin 4 and pin 10 are used for chip select. Disable both.
 // pinMode( 10, OUTPUT);
  //digitalWrite( 10, HIGH);     // disable this chip select
  //pinMode( 4, OUTPUT);
  //digitalWrite( 4, HIGH);      // disable this chip select

  Serial.println(F( "\nStarting Ethernet..."));

  // Ethernet.begin without 'ip' parameteir starts the DHCP
  if ( Ethernet.begin(mac) == 0)
  {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    while (true);
  }

  // print your local IP address.
  Serial.println(F( "Ethernet started."));
  Serial.print(F( "Local IP = "));
  Serial.println( Ethernet.localIP());
  delay(500);

  ////////////////udp//////////////////
  // start the Ethernet and UDP:
  Ethernet.begin(mac,ip); //Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  ////////////////udp//////////////////




  ///////////sensori e login////////////////////////
  sensors.begin();
  //////////////////////////////////////////////////
  ///////////lcd////////////////////////////////////
  lcd.begin(16, 2);
  lcd.backlight();
  pinMode(8, OUTPUT);
  digitalWrite(8, LOW);
  //////////////////////////////////////////////////

}

void loop() {



  /////////////////////////udp/////////////////////////////
  int packetSize = Udp.parsePacket(); //I think for the udp stuff to work this needs to be called
  /////////////////////////udp/////////////////////////////


  SerialCommandHandler.Process();
  if (HeartBeatTimer.TimePassed_Milliseconds(20000))
  {

    ///////////controllo temperature e stampa su seriale e sd///////////////////////
    sensors.requestTemperatures();

    float temperatura5 = sensors.getTempC(tempSensor5);
    float temperatura6 = sensors.getTempC(tempSensor6);
    float temperatura7 = sensors.getTempC(tempSensor7);


    Serial.print("stato= ");
    Serial.println(stato);


    ////////////////////STAMPO A VIDEO LE TEMPERATURE////////////////////


    Serial.print("05 Murale Cassa=");
    Serial.print(temperatura5);
    Serial.println("}");
    Serial.print("06 Murale Lato Salumeria=");
    Serial.print(temperatura6);
    Serial.println("}");
    Serial.print("07 Banco Gastronomia=");
    Serial.print(temperatura7);
    Serial.println("}");

    ///////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /////////////////////////////////////////////////////////////////
    Udp.beginPacket(ComputerIPAddress, RecPort);
    Udp.print("{UI:controllo|SET|DynamicLabel5.Text=");
    Udp.print(temperatura5);
    Udp.println("}");
    Udp.write("{TIMEPLOT|data|05 Murale Cassa|T|");
    Udp.print(temperatura5);
    Udp.write("}\n");
    Udp.endPacket();
    /////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////
    Udp.beginPacket(ComputerIPAddress, RecPort);
    Udp.print("{UI:controllo|SET|DynamicLabel6.Text=");
    Udp.print(temperatura6);
    Udp.println("}");
    Udp.write("{TIMEPLOT|data|06 Murale Salumeria|T|");
    Udp.print(temperatura6);
    Udp.write("}\n");
    Udp.endPacket();
    /////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////
    Udp.beginPacket(ComputerIPAddress, RecPort);
    Udp.print("{UI:controllo|SET|DynamicLabel7.Text=");
    Udp.print(temperatura7);
    Udp.println("}");
    Udp.write("{TIMEPLOT|data|07 Banco Gastronomia|T|");
    Udp.print(temperatura7);
    Udp.write("}\n");
    Udp.endPacket();
    /////////////////////////////////////////////
 

  }


  ////////////////fine loop/////////////////////////////////
}


Lollo82

E se dopo aver alimentato l'arduino schiacci il tasto reset parte?

docdoc

Da ieri, dopo un stacca e attacca dell'alimentazione, lo sketch funziona solo se apro il monitor seriale oppure dopo l'upload dello sketch stesso... Ma se stacco e riattacco l'alimentazione, NULLA!!! il vuoto più assoluto, non parte fino a che non riapro il seriale.
Scusa la domanda banale, ma se non apri il seriale come fai a dire che non funziona affatto (e non che magari fa il setup() e poi si "pianta" da qualche parte)?
Ad esempio lo schermo cosa indica? Perché all'inizio del setup non metti una scritta "Loading..." che poi togli alla fine del setup()? E poi nel loop fai blinkare il led onboard quando entri nella if()?

Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

bruco1987

E se dopo aver alimentato l'arduino schiacci il tasto reset parte?
questa prova la sto per fare...ti faccio sapere
Scusa la domanda banale, ma se non apri il seriale come fai a dire che non funziona affatto (e non che magari fa il setup() e poi si "pianta" da qualche parte)?
Ad esempio lo schermo cosa indica? Perché all'inizio del setup non metti una scritta "Loading..." che poi togli alla fine del setup()? E poi nel loop fai blinkare il led onboard quando entri nella if()?
perchè non ce ne bisogno in quanto appena parte il loop mi manda via UDP le temperature dei sensori in un altro pc... questo avviene "sempre" con la seriale aperta, mentre con la seriale chiusa no... quindi non vedo per quale motivo di debba inceppare con la seriale chiusa. inoltre come gia scritto, non ce nemmeno bisogno di aprire la seriale se ho appena caricato lo sketch parte fino a che no stacco e riattacco l'alimentazione, a quel punto devo per forza aprire la seriale e non va...

nid69ita

Usi diverse librerie a me poco note. megunolink e CommandHandler.   Cosa fanno ? 
Non è che quelle lib impongono avere la seriale connessa ??
my name is IGOR, not AIGOR

zoomx

Per me il colpevole è questo

CommandHandler<> SerialCommandHandler;

bruco1987

Usi diverse librerie a me poco note. megunolink e CommandHandler.   Cosa fanno ?
Non è che quelle lib impongono avere la seriale connessa ??
megunolink e Commandhandler servono ad comunicare con il software appunto megunolink, una sorta di interfaccia grafica per pc, che vi cisiglio di provare...


ripeto fino a poco fa andava tutto senza problemi.. Non penso siano le librerie il problema
Per me il colpevole è questo

CommandHandler<> SerialCommandHandler;
perchè lo pensi?

nid69ita

Lo conosco solo di fama. Non l'ho provato bene.
Mi pare non spieghi bene la situazione. Non abbiamo la sfera di cristallo.
Se non dai un pò di spiegazioni, non hai un programma standard e semplice da capire, visto che usa librerie "particolari"

Il tuo programma comunica con un PC via udp sfruttando le librerie meguno ? Sul pc chi riceve è il sw meguno ? 
Andava tutto senza aprire il monitor seriale di Arduino IDE mentre ora lo devi aprire ? 

my name is IGOR, not AIGOR

bruco1987

Lo conosco solo di fama. Non l'ho provato bene.
Mi pare non spieghi bene la situazione. Non abbiamo la sfera di cristallo.
Se non dai un pò di spiegazioni, non hai un programma standard e semplice da capire, visto che usa librerie "particolari"

Il tuo programma comunica con un PC via udp sfruttando le librerie meguno ? Sul pc chi riceve è il sw meguno ?
Andava tutto senza aprire il monitor seriale di Arduino IDE mentre ora lo devi aprire ?


Spego meglio... Arduino comunica via udp con un pc connesso nella stessa rete wifi. Sul pc con ip fisso ricevo i pacchetti udp e scrivo le temperature in un grafico con Megunolink.
Il tutto funzionava senza aprire nessun monitor seriale...
Aggiungo una ina info che ho appena verificato. Se premo il tasto fisico Reset su arduino il tutto torna a funzionare senza problemi ovviamente fino alla prossima mancanza di alimentazione. A quel punto si ripresenta il problema e per far partire lo sketch devo o aprire la seriale o premere il tasto reset.

nid69ita

my name is IGOR, not AIGOR

zoomx

perchè lo pensi?
Perché sospetto che quella libreria blocchi il programma in attesa di comandi dalla seriale. Però l'Arduino con Atmega328 non dovrebbe accorgersi se la porta viene aperta o meno, questo potrebbe capitare solo con la Leonardo e le schede con CPU con USB nativa.

Lollo82

Il problema non è che potrebbe essere nel bootloader??? Per me la seriale non centra nulla, per quello gli ho chiesto di verificare se dopo aver alimentato premendo il tasto reset tutto iniziasse a funzionare. Quando si apre la seriale alla fine accade quello, l'arduino si resetta.

zoomx

Se non lo hai modificato mi sembra vewramente strano ma se lo hai modificato potrebbe anche essere.
Il bootloader, a che so io, aspetta un segnale dalla seriale in un certo tempo e, senon lo riceve, salta direttamente in una locazione di memoria dove dovrebbe esserci il programma.

A me quello che succede a te mi succede solamente se uso una scheda con MCU con USB nativa (La Leonardo, la Due, le STM32 e tante altre) e nello sketch metto le istruzioni che attendono che la seriale sia aperta. Con la UNO non dovrebbe succedere.

ORSO2001

Ciao,

A me succedeva una cosa simile con una MEGA clone...dal principio la scheda era funzionante...poi all'improvviso...dall'avvio dovevo aspettare una ventina di secondi prima che il programma iniziasse a ciclare...se collegavo USB o premevo il pulsante di reset partiva subito...il fornitore mi ha inviato scheda nuova...problema risolto...quindi...hai provato con altra scheda?

bruco1987

Ciao,

A me succedeva una cosa simile con una MEGA clone...dal principio la scheda era funzionante...poi all'improvviso...dall'avvio dovevo aspettare una ventina di secondi prima che il programma iniziasse a ciclare...se collegavo USB o premevo il pulsante di reset partiva subito...il fornitore mi ha inviato scheda nuova...problema risolto...quindi...hai provato con altra scheda?
proverò sicuramente nei prossimi gg... speriamo bene.

Go Up