Errori:<include avr/pgmspace>; srw_atomic_write_low

Chiedo scusa,sono un principiante e anche pensionato, arduino mi serve per diletto e a tenermi impegnato.Di programmazione ne so poco.Andiamo ai problemi:avevo scaricato tanti sketch dai vari siti tutti funzionanti e con nessun problema.Adesso che devo attuare il progetto, quando li compilo alcuni mi dicono:include avr/pgsmspace..,altri srw_atomic_write_low.Ripeto funzionavano alla grande.Ho pure disistallato 2 volte arduino e riestallandoli dalla cartella dovevo fu salvato quando lo installai.Uso la versione 1.8.4 e win 10.Come posso risolvere il problema?Non ho toccato nulla e arduino mi serve per tenermi su. Uso un clone di arduino.Grazie molte .

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Potresti mettere un esempio di programma che ti da il problema così cerchiamo di capire ? Se è un qualche cosa che hai copiato da qualche parte, basta che metti il link di dove possiamo prenderlo …

Guglielmo

uno dei tanti sketch:

#include <Wire.h>


#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>



#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>


#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <TimeLib.h> //http://playground.arduino.cc/Code/Time (presente in gestione
// librerie, ma da installare – already present in ide library managere, but not yet installed
#include <Wire.h> //http://arduino.cc/en/Reference/Wire (vedi sopra – see above)
#include <LiquidCrystal_I2C.h> // libreria di gestione del display lcd
//--------------------addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//
time_t t;
tmElements_t tm;
//
float temperatura = 0; // zona di memorizzazione della temperatura fornito da DS3231
float temp1 = 0; // zona di memorizzazione della temperatura in gradi celsius
int digits = 0; // zona di memorizzazione dei minuti e dei secondi da esporre
// sul display lcd
char tabmesi [37] = "genfebmaraprmaggiulugagosetottnovdic"; // tabella descrizione mesi
// above: italian month description, on three digits
int mese = 0; // zona di memorizzazione del mese corrente
int lavoro = 0; // zona di lavoro, utilizzata per calcoli intermedi
//
//********* routine di esposizione di data, ora e temperatura sul display lcd
//*************** time and temperature on lcd display **********************
//
void esponidati(void)
{
// esposizione dei dati rilevati sul timer di arduino
lcd.clear();
lcd.print(" ");
lcd.print(day());
lcd.print(' ');
//Arduino: modulo RTC DS3231 orologio digitale – digital clock
// doppio utilizzo SDA SCL, Real Time Clock, I2C, lcd 1620, orologio digitale, digital clock
mese = month(); // memorizza il mese
mese = mese - 1; // diminuisce di 1 il valore del mese poiche'
// la descrizione del primo mese (gen) inizia
// all'indirizzo zero della tabella mesi
lcd.print (tabmesi [(mese * 3)]); // espone la prima lettera del mese
lcd.print (tabmesi [(mese * 3 + 1)]); // espone la seconda lettera del mese
lcd.print (tabmesi [(mese * 3 + 2)]); // espone la terza lettera del mese
lcd.print(' ');
lcd.print(year());
lcd.setCursor(0, 1);
lcd.print(hour());
digits = (minute());
printDigits(); // routine esposizione zeri non significativi
digits = (second());
printDigits(); // routine esposizione zeri non significativi
lcd.print (" t:");
lcd.print (temp1);
}
//
//****routine visualizzazione minuti e secondi comprensivi di zeri non significativi*****
// ************* displays minutes and seconds, including non significant zeroes ***********
//
void printDigits()
{
lcd.print(':');
if (digits < 10)
lcd.print('0');
lcd.print(digits);
}
void setup(void)
{
Serial.begin (9600); // inizializza il monitor seriale
lcd.begin(16, 2); // inizializza il display e accende
lcd.backlight(); // lo sfondo
lcd.print (" buongiorno"); // goodday
delay (1500);
lcd.clear ();
setSyncProvider(RTC.get); // sincronizza il timer di Arduino con i dati presenti
// sul modulo RTC
lcd. clear ();
if (timeStatus() != timeSet) // verifica se la sincronizzazione e' ok
lcd.print(" orologio non"); // “clock not”
else
lcd.print(" orologio"); // “clock”
lcd.setCursor (0, 1);
lcd.print (" sincronizzato"); // “ syncronized”
delay (1500);

temperatura = RTC.temperature(); // rileva per la prima volta

}

void loop(void)
{
if (Serial.available() == 17) // controlla se e' in arrivo una stringa da 17
// caratteri (aa,mm,gg,hh,mm,ss)
{ // acquisisce la stringa con data ed ora
int y = Serial.parseInt();
tm.Year = y2kYearToTm(y);
tm.Month = Serial.parseInt();
tm.Day = Serial.parseInt();
tm.Hour = Serial.parseInt();
tm.Minute = Serial.parseInt();
tm.Second = Serial.parseInt();
t = makeTime(tm);
RTC.set(t); // aggiorna (setta) il modulo RTC
setTime(t); // aggiorna (setta) il modulo RTC
} 


// fine del ciclo di acquisizione data ed ora
digits = (second()); // verifica se sono passati 10 secondi dal precedente
// rilevamento della temperatura
lavoro = digits % 10; // calcola il resto del secondo corrente diviso 10
if (lavoro == 9) // se si e' al nono secondo di ogni decade di minuto (se si e'
// al secondo 9, 19, 29, 39, 49 o 59 di ogni minuto)
// if we are at the 9,19,29... secondo of each minutes,
temperatura = RTC.temperature(); // rileva la temperatura – catch temperature
temp1 = temperatura / 4.0; // trasforma la temperatura in gradi celsius
esponidati(); // lancia la routine di esposizione dei dati
//Arduino: modulo RTC DS3231 orologio digitale – digital clock
// doppio utilizzo SDA SCL, Real Time Clock, I2C, lcd 1620, orologio digitale, digital clock
delay (1000); // aspetta un secondo prima di andare ad esporre
// nuovi dati, al fine di consentire al display
// una visualizzazione stabile
}

L’altro e’ questo:

#include <Wire.h>
#include "TSL2561.h"
#define relePin 5 //Pin collegamento relè

TSL2561 tsl(TSL2561_ADDR_FLOAT);

void setup(void) {
  Serial.begin(9600);       // Impostazione porta per monitor seriale
  pinMode(relePin, OUTPUT); // Impostazione della porta come uscita
  if (tsl.begin()) {
    Serial.println("Trovato Sensore");
  } else {
    Serial.println("Sensore assente?");
    while (1);
  }
  tsl.setGain(TSL2561_GAIN_0X);                // Nessun guadagno
  tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); // Tempo di integrazione per luce luminosa.
}

void loop(void) {
  // Lettura del sensore luce visibile
  uint16_t x = tsl.getLuminosity(TSL2561_VISIBLE);
  Serial.println(x, DEC);
  uint32_t lum = tsl.getFullLuminosity();
  uint16_t ir, full;
  ir = lum >> 16;
  full = lum & 0xFFFF;
  //Stampa valori su monitor seriale
  Serial.print("Valore IR      : "); Serial.print(ir);   Serial.print("\t\t");
  Serial.print("Valore totale  : "); Serial.print(full);   Serial.print("\t");
  Serial.print("Valore visibile: "); Serial.print(full - ir);   Serial.print("\t");
  Serial.print("Valore in Lux  : "); Serial.print(tsl.calculateLux(full, ir)); Serial.print("\t");

  // Controllo attivazione del relè in base al valore di luminosità letto
  int luxSense = tsl.calculateLux(full, ir);
  if (luxSense < 200)
  {
    digitalWrite(relePin, HIGH); //Attiva l'uscita che eccita il relè
    Serial.println("ATTIVO USCITA RELE'");
  } else {
    digitalWrite(relePin, LOW); //Disattiva l'uscita che diseccita il relè
    Serial.println("DISATTIVO USCITA RELE'");
  }
  delay(1000); //Pausa tra le letture del sensore
}

Beh, nel primo … hai un’infinità di #include duplicati e alcuni triplicati …

Pulendo un po’ il codice :

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <TimeLib.h> //http://playground.arduino.cc/Code/Time (presente in gestione
// librerie, ma da installare - already present in ide library managere, but not yet installed
//--------------------addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//
time_t t;
tmElements_t tm;
//
float temperatura = 0; // zona di memorizzazione della temperatura fornito da DS3231
float temp1 = 0; // zona di memorizzazione della temperatura in gradi celsius
int digits = 0; // zona di memorizzazione dei minuti e dei secondi da esporre
// sul display lcd
char tabmesi [37] = "genfebmaraprmaggiulugagosetottnovdic"; // tabella descrizione mesi
// above: italian month description, on three digits
int mese = 0; // zona di memorizzazione del mese corrente
int lavoro = 0; // zona di lavoro, utilizzata per calcoli intermedi
//
//********* routine di esposizione di data, ora e temperatura sul display lcd
//*************** time and temperature on lcd display **********************
//
void esponidati(void)
{
   // esposizione dei dati rilevati sul timer di arduino
   lcd.clear();
   lcd.print(" ");
   lcd.print(day());
   lcd.print(' ');
   //Arduino: modulo RTC DS3231 orologio digitale - digital clock
   // doppio utilizzo SDA SCL, Real Time Clock, I2C, lcd 1620, orologio digitale, digital clock
   mese = month(); // memorizza il mese
   mese = mese - 1; // diminuisce di 1 il valore del mese poiche'
   // la descrizione del primo mese (gen) inizia
   // all'indirizzo zero della tabella mesi
   lcd.print (tabmesi [(mese * 3)]); // espone la prima lettera del mese
   lcd.print (tabmesi [(mese * 3 + 1)]); // espone la seconda lettera del mese
   lcd.print (tabmesi [(mese * 3 + 2)]); // espone la terza lettera del mese
   lcd.print(' ');
   lcd.print(year());
   lcd.setCursor(0, 1);
   lcd.print(hour());
   digits = (minute());
   printDigits(); // routine esposizione zeri non significativi
   digits = (second());
   printDigits(); // routine esposizione zeri non significativi
   lcd.print (" t:");
   lcd.print (temp1);
}
//
//****routine visualizzazione minuti e secondi comprensivi di zeri non significativi*****
// ************* displays minutes and seconds, including non significant zeroes ***********
//
void printDigits()
{
   lcd.print(':');
   if (digits < 10)
      lcd.print('0');
   lcd.print(digits);
}
void setup(void)
{
   Serial.begin (9600); // inizializza il monitor seriale
   lcd.begin(16, 2); // inizializza il display e accende
   lcd.backlight(); // lo sfondo
   lcd.print (" buongiorno"); // goodday
   delay (1500);
   lcd.clear ();
   setSyncProvider(RTC.get); // sincronizza il timer di Arduino con i dati presenti
   // sul modulo RTC
   lcd. clear ();
   if (timeStatus() != timeSet) // verifica se la sincronizzazione e' ok
      lcd.print(" orologio non"); // "clock not"
   else
      lcd.print(" orologio"); // "clock"
   lcd.setCursor (0, 1);
   lcd.print (" sincronizzato"); // " syncronized"
   delay (1500);

   temperatura = RTC.temperature(); // rileva per la prima volta

}

void loop(void)
{
   if (Serial.available() == 17) // controlla se e' in arrivo una stringa da 17
      // caratteri (aa,mm,gg,hh,mm,ss)
   {  // acquisisce la stringa con data ed ora
      int y = Serial.parseInt();
      tm.Year = y2kYearToTm(y);
      tm.Month = Serial.parseInt();
      tm.Day = Serial.parseInt();
      tm.Hour = Serial.parseInt();
      tm.Minute = Serial.parseInt();
      tm.Second = Serial.parseInt();
      t = makeTime(tm);
      RTC.set(t); // aggiorna (setta) il modulo RTC
      setTime(t); // aggiorna (setta) il modulo RTC
   }


   // fine del ciclo di acquisizione data ed ora
   digits = (second()); // verifica se sono passati 10 secondi dal precedente
   // rilevamento della temperatura
   lavoro = digits % 10; // calcola il resto del secondo corrente diviso 10
   if (lavoro == 9) // se si e' al nono secondo di ogni decade di minuto (se si e'
      // al secondo 9, 19, 29, 39, 49 o 59 di ogni minuto)
      // if we are at the 9,19,29... secondo of each minutes,
      temperatura = RTC.temperature(); // rileva la temperatura - catch temperature
   temp1 = temperatura / 4.0; // trasforma la temperatura in gradi celsius
   esponidati(); // lancia la routine di esposizione dei dati
   //Arduino: modulo RTC DS3231 orologio digitale - digital clock
   // doppio utilizzo SDA SCL, Real Time Clock, I2C, lcd 1620, orologio digitale, digital clock
   delay (1000); // aspetta un secondo prima di andare ad esporre
   // nuovi dati, al fine di consentire al display
   // una visualizzazione stabile
}

a me, con l’IDE 1.8.5, compila senza alcun errore.

Guglielmo

Del secondo esempi, NON ho la libreria TSL2561 e non ha messo quale stai usando ... ma immagino che non mi darebbe alcun problema neanche quello ... ::slight_smile:

Guglielmo

Ho il sospetto che tu abbia fatto una serie di installazioni di Arduino che hanno creato dei problemi ...

  1. disinstalla TUTTO quello che hai installato e cancella eventuali directory temporanee

  2. scarica la versione di Arduino 1.8.5 in formato .zip ... NON usare la versione .exe che si installa da sola.

  3. scompatta lo .zip in una cartella dove puoi leggere/scrivere ... es, la tua home

  4. per sicurezza, nella cartella di Arduino, crea una cartella di nome "portable". In questo modo avari creato una versione "isolata" dal tutto il resto (sandboxed) dove tutte le librerie ed i "core" saranno contenuti in detta cartella e non verranno creati files all'esterno.

  5. lancia questa versione dell'IDE, installa le librerie dal "Library Manager" (... così sei sicuro che sono all'ultima versione) e riprova.

Guglielmo

grazie provero' e vi faro' sapere

Ho provato il primo sketch ed e’ venuto fuori:Define SR1W_Write_high(reg,mask);atomic block (atomic_Restorate)(*reg|=mask).Ripeto ancora che alcuni giorni or sono giravano benissimo.

Hai fatto quanto al mio post #7 ? ? ?

Guglielmo

non ancora

Ok tutto risolto.Grazie per il vostro aiuto