Aiuto Scrittura Codice

Ragazzi mi serve un grosso aiuto!
Ho comperato su Amazon dei sensori e moduli Arduino per fare un progetto con dei miei soci solo che ora quando l'ho completato sono andato nel panico perché il programma occupa quasi tutto lo spazio disponibile e mi dice che Arduino non lavora in modo stabile. Questo progetto è urgente ma nonostante le mie correzioni(non sono "ancora"un genio con Arduino)mi sono reso conto che non va bene perché non mi legge nessun sensore,mentre se provo un sensore uno ad uno funzionano tutti.

Io ho collegato:

DHT22(umidità e temperatura)GND --> GND
VCC --> 5V
DAT ---> PIN A0

BMP180(altezza) VIN --> 5V
GND --> GND
SCL --> PIN A5
SDA --> A4

MICRO SD MODULE(scrivere dati) GND --> GND
VCC --> 5V
MISO --> PIN12
MOSI --> PIN11
SCK --> PIN13
CS --> PIN4

DS18B20(Temperatura) GND --> GND
VCC --> 5V
DAT --> PIN10

BOTTONE PIN5

LED ROSSO PIN6

LED VERDE PIN7

In pratica io ho scritto che quando inizia il programma si accende il led rosso e rimane acceso finchè non si preme il bottone. Quando poi si preme il bottone inizia a lampeggiare ogni secondo il led verde e ogni 5 secondi deve prendere i dati dai vari sensori e scriverli su micro sd.

Solo che con mio codice non lampeggiano nemmeno i led... figurarsi se scrive dati su sd... è come se si fosse impallato...

Se non vi chiedo troppo potreste scrivermi voi, che siete sicuramente migliori di me, un codice che possa far funzionare questo ambaradan?
Vi ringrazio già in anticipo e speri che questo vostro aiuto mi serva da lezione una volta per tutte u.u

Andrea.

Ciao Andrea2000,

presentati nell’apposita sezione QUI.
poi se pubblichi il tuo sketch magari capiamo meglio…mi raccomando includilo tra i tag code (pulsante </> sopra le faccine).

Scusa, ti rispondo domani mattina, ora devo dormire, visto jetlag u.u!

>Andrea2000: NON avendolo tu ancora fatto, 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.

Guglielmo

ORSO2001:
Ciao Andrea2000,

presentati nell’apposita sezione QUI.
poi se pubblichi il tuo sketch magari capiamo meglio…mi raccomando includilo tra i tag code (pulsante </> sopra le faccine).

Ecco il codice che ho scritto:


                                                 //Inizializzazione DS18B20
#include <OneWire.h>
OneWire  ds(10);
void setup(void) {

                                                  //Inizializzazione Micro SD
#include <SPI.h>
#include <SD.h>
File myFile;

                                                  //Inizializzazione Timer
int num = 0;
                                                  
                                                  //Inizializazione BMP180              
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

                                                   //Inizializzazione Bottone
int switchState = 0;
int provaNo = 1;
int provaSi = 0;

                                                   //Inizializzazione DHT22
#include "DHT.h"
#define DHTPIN A0
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
                                                   //Inizio Setup BMP180
void displaySensorDetails()
{
 sensor_t sensor;
 bmp.getSensor(&sensor);
 Serial.println("------------------------------------");
 Serial.print  ("Sensor:       "); Serial.println(sensor.name);
 Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
 Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
 Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" hPa");
 Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" hPa");
 Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" hPa");  
 Serial.println("------------------------------------");
 Serial.println("");
 delay(500);
}


void setup() {
                                                    //Setup Bottone
pinMode(5, INPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
Serial.begin(9600);

                                                    //Setup DHT22
                                                    
 Serial.println("DHTxx test!");
 dht.begin();


                                                    //Setup BMP180

 Serial.println("Pressure Sensor Test"); Serial.println("");
 

 if(!bmp.begin())
 {

   Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
   while(1);
 }
   displaySensorDetails();
 
                                                    //Setup Micro SD
 while (!Serial) {
 }
 Serial.println("Initializing SD card...");

 if (!SD.begin(4)) {
   Serial.println("Initialization failed!");
   return;
 }
 Serial.println("Initialization done!");

 if(SD.remove("datalog.txt")) {
   Serial.println("File removed!");   
 }
 else {
   Serial.println("Micro SD Empty!");
 }
 
 myFile = SD.open("datalog.txt", FILE_WRITE);

 myFile.println("Initialization...");
 myFile.println("...");
 myFile.println("...");
 myFile.println("DHT22 Initialization...");
 myFile.println("...");
 myFile.println("Done!");
 myFile.println("...");
 myFile.println("BMP180 Initialization...");
 myFile.println("...");
 myFile.println("Done!");
 myFile.println("...");
 myFile.println("DS18B20 Initialization...");
 myFile.println("...");
 myFile.println("Done!");
 myFile.println("...");
 myFile.println("...");
 myFile.println("...");
 myFile.println("Initialization done!");
 myFile.println("Micro SD is ready to write data!");
 myFile.close();



}


void loop() {
                                                    //Loop DS18B20
byte i;
 byte present = 0;
 byte type_s;
 byte data[12];
 byte addr[8];
 float celsius, fahrenheit;
 
 if ( !ds.search(addr)) {
   Serial.println("No more addresses.");
   Serial.println();
   ds.reset_search();
   delay(250);
   return;
 }
 
 Serial.print("ROM =");
 for( i = 0; i < 8; i++) {
   Serial.write(' ');
   Serial.print(addr[i], HEX);
 }

 if (OneWire::crc8(addr, 7) != addr[7]) {
     Serial.println("CRC is not valid!");
     return;
 }
 Serial.println();


 switch (addr[0]) {
   case 0x10:
     Serial.println("  Chip = DS18S20");
     type_s = 1;
     break;
   case 0x28:
     Serial.println("  Chip = DS18B20");
     type_s = 0;
     break;
   case 0x22:
     Serial.println("  Chip = DS1822");
     type_s = 0;
     break;
   default:
     Serial.println("Device is not a DS18x20 family device.");
     return;
 } 

 ds.reset();
 ds.select(addr);
 ds.write(0x44, 1);
 
 delay(1000);


 present = ds.reset();
 ds.select(addr);    
 ds.write(0xBE);         // Read Scratchpad

 Serial.print("  Data = ");
 Serial.print(present, HEX);
 Serial.print(" ");
 for ( i = 0; i < 9; i++) {           // we need 9 bytes
   data[i] = ds.read();
   Serial.print(data[i], HEX);
   Serial.print(" ");
 }
 Serial.print(" CRC=");
 Serial.print(OneWire::crc8(data, 8), HEX);
 Serial.println();

 int16_t raw = (data[1] << 8) | data[0];
 if (type_s) {
   raw = raw << 3;
   if (data[7] == 0x10) {

     raw = (raw & 0xFFF0) + 12 - data[6];
   }
 } else {
   byte cfg = (data[4] & 0x60);

   if (cfg == 0x00) raw = raw & ~7;
   else if (cfg == 0x20) raw = raw & ~3;
   else if (cfg == 0x40) raw = raw & ~1;

 }
 celsius = (float)raw / 16.0;
 fahrenheit = celsius * 1.8 + 32.0;
                                                    //Loop Timer
num = num + 6;

                                                    //Loop Bottone
 
switchState = digitalRead(5);

if(switchState == LOW){

}
else{
 provaSi = provaSi + 1;

}

if(provaSi == provaNo){
 digitalWrite(7, HIGH);
 digitalWrite(6, LOW);

 delay(1000);

 digitalWrite(7, LOW);
 digitalWrite(6, LOW);

 delay(1000);

 digitalWrite(7, HIGH);
 digitalWrite(6, LOW);

 delay(1000);

 digitalWrite(7, LOW);
 digitalWrite(6, LOW);

 delay(1000);

 digitalWrite(7, HIGH);
 digitalWrite(6, LOW);

 delay(1000);

 digitalWrite(7, LOW);
 digitalWrite(6, LOW);


                                                          //Loop DHT22

   Serial.println("DHTxx test!");

   dht.begin();

       if (isnan(t) || isnan(h)) 
   {
       Serial.println("Failed to read from DHT");
   } 
   else 
   {
       Serial.print("Humidity: "); 
       Serial.print(h);
       Serial.print(" %\t");
       Serial.print("Temperature: "); 
       Serial.print(t);
       Serial.println(" *C");
   }
                                                        //Loop BMP180
 sensors_event_t event;
 bmp.getEvent(&event);


 if (event.pressure)
 {

   Serial.print("Pressure:    ");
   Serial.print(event.pressure);
   Serial.println(" hPa");

   float temperature;
   bmp.getTemperature(&temperature);
   Serial.print("Temperature: ");
   Serial.print(temperature);
   Serial.println(" C");


 }
 else
 {
   Serial.println("Sensor error");
 }         
 
 float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
 myFile = SD.open("datalog.txt", FILE_WRITE);
 myFile.print("Altezza: ");
 myFile.print(bmp.pressureToAltitude(seaLevelPressure,event.pressure));               
 myFile.print(F(" m      "));
 myFile.print(F("Pressione: "));
 myFile.print(F(event.pressure));
 myFile.print(F(" hPa      "));
 myFile.print(F("Umidità: "));
 myFile.print(F(h));
 myFile.print(F(" %      "));
 myFile.print(F("Temp. Esterna: "));
 myFile.print(F(celsius));
 myFile.print(F(" °C      "));
 myFile.print(F("Temp. Interna: "));
 myFile.print(F(t));
 myFile.println(F(" °C"));
 myFile.close();


if(provaSi > 1){
 provaSi = provaSi - provaSi;
}
else{
}
 delay(1000);

}
else{
 digitalWrite(7, LOW);
 digitalWrite(6, HIGH);
}
}

Più di così non so cosa fare… occupa troppo spazio… potete provare a ottimizzarlo?
Grazie!
Andrea.

>Andrea2000: ... guardando il tuo codice è più che evidente che a te mancano proprio le BASI della programmazione in 'C' e della programmazione di Arduino e che hai solo fatto un bel po' di copia/incolla di pezzi di programma probabilmente presi qui e la (... basta vedere che ci sono DUE funzioni setup(), funzioni dichiarate dentro altre funzioni, parentesi mancanti, ecc. ecc.) ...

Il consiglio, se vuoi combinare qualche cosa, è cominciare con studiare QUESTO proseguire con QUESTO e/o acquistare e studiare qualche buon libro (es. QUESTO) ... verdai che poi molte cose ti si chiariranno e ti avvicinerai sicuramente più produttivo al tuo programma.

Facendo copia/incolla senza capire quello che si fa ... non si va da nessuna parte ... ::slight_smile:

Guglielmo

P.S.: Quel codice, così come lo hai riportato, neanche compila ... ci sono un bel po' di errori ...

Se usi la funzione F() in tutti i serial.print riesci a riudurre il peso del programma.
La funzione F() può essere usata solo per le costanti e non per le variabili.

Lo sketch usa 23188 byte (71%) dello spazio disponibile per i programmi. Il massimo è 32256 byte.
Le variabili globali usano 1222 byte (59%) di memoria dinamica, lasciando altri 826 byte liberi per le variabili locali. Il massimo è 2048 byte.

Inoltre ti sei dimenticato di leggere l'umidità e la temperatura dal sensore DHT.
La parte di inizializzazione dei sensori la puoi fare solo una volta nel setup() e non a ogni ciclo loop.

Mah, intanto a riga 4 va tolto "void setup(void) {", poi il "while (!Serial)" è da togliere, poi tutti quei delay() in ordine sparso...

Come ha detto Guglielmo, è chiaro che hai fatto vari copia/incolla, ma non è il Lego... Ogni parte di codice va CAPITA ed ADATTATA al proprio progetto. Fai UNA COSA PER VOLTA, prima sperimenta con uno sketch che fa una cosa, poi ne fai un altro che ne fa un'altra, e poi quando tutto ti torna, inizia a mettere insieme questi test.

Altrimenti non ne vieni a capo, e neanche noi...