Ciao a tutti, ho un problema con il codice seguente:
#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x98, 0xC3};
byte ip[] = {192, 168, 100, 100};
byte subnet[] = {255, 255, 255, 0};
File myFile;
int buttonstate = 0;
void setup() {
Ethernet.begin(mac, ip, subnet);
Serial.begin(9600);
while (!Serial) {
;
}
Serial.print("Inizializzo la SD card...");
if (!SD.begin(4)) {
Serial.println("Inizializzazione fallita!");
return;
}
Serial.println("Inizializzazione corretta.");
pinMode(13, INPUT);
pinMode(10, OUTPUT);
pinMode(4, OUTPUT);
}
void WriteOnSD() {
digitalWrite(4, HIGH);
myFile = SD.open("DATALOG.csv", FILE_WRITE);
if (myFile) {
Serial.print("Scrittura su DATALOG.csv...");
Serial.println("PULSANTE PREMUTO");
for (int c = 0; c < 10; c++) {
myFile.print(c);
myFile.println(" ,100,1010,1020");
}
// close the file:
myFile.close();
Serial.println("FATTO.");
delay(5000);
digitalWrite(4, LOW);
Serial.println("PULSANTE rilasciato");
} else {
Serial.println("Error apertura DATALOG.csv oppure il pulsante non attivo");
digitalWrite(4, LOW);
}
}
void loop() {
buttonstate = digitalRead(13);
if (buttonstate == HIGH) {
WriteOnSD();
}
}
Ho inserito una resistanza da 10k tra il pin d'ingresso e il GND, poi quando devo mandare su l'uscira gli do la 5v sull'ingresso. Ora tutto questo non corrisponde. Non corrisponde, perché salta subito all'else, non ho più idea del perchè. Da come si vede dal codice voglio scrivere sulla SDCard. La sdcard di trova sulla shield ethernet.
Ad occhio, nel setup richiami SD.begin(4), ma il pin 4 non l'hai ancora dichiarato.
Prova ad inserire la dichiarazione del pin 4 output, all'inizio del setup.
Vedi tu, non è plug&play ...
Hai provato a fare come ti ho suggerito ?
Magari non cambia nulla, ma a rigor di logica prima di utilizzare un pin devi dichiarare se è in o out.
Visto che hai modificato il primo post, ti consiglio di modificare anche il titolo della discussione, in quanto non hai un problema con i pulsanti, ma con la SDShield.
I pulsanti funzionano, visto che riesci correttamente ad eseguire la sub WriteOnSD.
Ora sta a capire perchè non ti apre il file.
Il digitalwrite, mi serve per fare vdere che sto scrivendo, è solo per visualizzare. Dopo un pò di codice lo elimino, perché non mi servirà più
Comunque adesso ho il codice un pò modificato; ho pure creato il file. Ma il problema è nel loop. Infatti, quando sposto il tutto nel setup, funziona perfettamente e anche se il file non esiste lo crea.
Secondo me ad arduino non gli va giù gli ingressi e il codice fatto così. Posto il nuovo codice:
#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
#include "stdio.h"
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x98, 0xC3};
byte ip[] = {192, 168, 100, 100};
byte subnet[] = {255, 255, 255, 0};
File myFile;
int buttonstate = 0;
bool m = false;
void setup() {
pinMode(4, OUTPUT);
Ethernet.begin(mac, ip, subnet);
Serial.begin(9600);
while (!Serial) {
;
}
Serial.print("Inizializzo la SD card...");
if (!SD.begin(4)) {
Serial.println("Inizializzazione fallita!");
return;
}
Serial.println("Inizializzazione corretta.");
pinMode(5, OUTPUT);
pinMode(13, INPUT);
pinMode(10, OUTPUT);
}
void WriteOnSD() {
digitalWrite(5, HIGH);
myFile = SD.open("DATALOG.csv", FILE_WRITE);
if (myFile) {
Serial.println(m);
Serial.print("Scrittura su DATALOG.csv...");
for (int c = 0; c < 10; c++) {
myFile.print(c);
myFile.println(" ,100,1010,1020");
}
// close the file:
myFile.close();
Serial.println("FATTO.");
delay(5000);
digitalWrite(5, LOW);
Serial.println("PULSANTE rilasciato");
m = false;
} else {
Serial.println("Error apertura DATALOG.csv oppure il pulsante non attivo");
digitalWrite(5, LOW);
m = false;
Serial.println(m);
}
}
void loop() {
buttonstate = digitalRead(13);
if ((buttonstate == HIGH) && (m == false)) {
Serial.println("PULSANTE PREMUTO");
WriteOnSD();
m = true;
Serial.println(m);
}
}
Metti il void loop() subito sotto al setup(), di solito le sub che creiamo noi si mettono in fondo al listato.
Secondo: prova a cambiare pin di ingresso; metti il 12, o qualunque altro libero tranne 0 e 1.
Brado:
prova a cambiare pin di ingresso; metti il 12, o qualunque altro libero tranne 0 e 1.
Ha ragione Brando: i pin 13 (CLK), 12 (MISO), 11 (MOSI) e 4(CS) sono usati dalla SD.
Il pin 4 lo puoi cambiare, gli altri sono fissi quindi devi usare un pin diverso per l'ingresso.
Grazie a tutti e due. Vi posto il codice modificato e funzionante:
#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
#include "stdio.h"
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x98, 0xC3};
byte ip[] = {192, 168, 100, 100};
byte subnet[] = {255, 255, 255, 0};
int buttonstate = 0;
bool m = false;
File myFile;
void setup() {
pinMode(4, OUTPUT);
Ethernet.begin(mac, ip, subnet);
Serial.begin(9600);
while (!Serial) {
;
}
Serial.print("Inizializzo la SD card...");
if (!SD.begin(4)) {
Serial.println("Inizializzazione fallita!");
return;
}
Serial.println("Inizializzazione corretta.");
pinMode(8, INPUT);
}
void loop() {
buttonstate = digitalRead(8);
if ((buttonstate == HIGH) && (m == false)) {
Serial.println("PULSANTE PREMUTO");
m = true;
Serial.println(m);
myFile = SD.open("datalog.csv", FILE_WRITE);
if (myFile) {
Serial.println(m);
Serial.print("Scrittura su datalog.csv...");
for (int c = 0; c < 10; c++) {
myFile.print(c);
myFile.println(" ,100,1010,1020");
}
// close the file:
myFile.close();
Serial.println("FATTO.");
delay(5000);
m = false;
Serial.println(m);
} else {
Serial.println("Error apertura DATALOG.csv oppure il pulsante non attivo");
m = false;
Serial.println(m);
}
}
}
Prima ho usato l'ingresso 10, non funzionava. Ho usato l'8, però dando un ritardo di 5 sec, per evitarmi una nuova lettura e capire tutto il funzionamento. Quindi era sì una congiunzione di di diverse cose: usare i pin giusti.
Ok, scriverò le mie conoscenze di elettronica. Ma non conoscevo la scheda in particolare e sono andato a occhi chiusi pensando che utilizzando la shield ethernet posta sopra la scheda principale, liberavo i pin da cui si era scatenato il problema.
Beh se una scheda di tipo arduino, pone questi problemi, significa che ha livelli di utilizzo limitati alla domotica, come è scritto in lungo e largo. Cioè quindi non può essere utilizzata in ambito industriale, se no per fare piccoli web server.
L'altro post, si riferiva alla prima mia verifica su arduino..quindi dovrei tornare nell'altro post. Oppure chiedere al moderatore di chiuderlo.
Beh se una scheda di tipo arduino, pone questi problemi, significa che ha livelli di utilizzo limitati alla domotica, come è scritto in lungo e largo.
Quali problemi, scusa?
Il protocollo SPI prevede espressamente un pin CS (Chip Select) che serve a selezionare con quale dispositivo vuoi dialogare. Siccome sullo shield ethern ci sono 2 dispositivi che dialogano via SPI, la scheda SD ed il chip Wiznet, devi scegliere con quale dialogare. E lo fai con quel pin impostato in un certo modo.
Cioè quindi non può essere utilizzata in ambito industriale, se no per fare piccoli web server.
Nessuna scheda Arduino è certificata per l'uso industriale. In teoria non potresti neanche farci dispositivi domestici collegati alla rete elettrica. Le schede Arduino sono schede di prototipazione per uso generico, sono buone a tutto ma per nulla nello specifico.