Bonjour,
J’ai besoin de votre aide
Voici mon projet: Je souhaite gérer un gestionnaire de stock de matériel avec Arduino, lorsqu’on scanne le code barre d’un produit, on l’enlève (ou on ajoute) 1 sur fichier sur la carte SD, en parallèle il y a une application faites avec app inventor qui permet de voir en temps réel le stock (lire le fichier sur la carte SD) (image 1), cette appli permet aussi d’ajouter des produits qui n’y sont pas: code, nom, quantité (image 2). Mais également d’enlever des produits qu’on ne veut plus (image 3).
Dans ce but j’écris sur ma carte SD de la manière suivante: nom ; codebarre ; quantité…
Exemple:
coca ; 253361155 ; 2…
fanta ; 11225533 ; 5…
tournevis ; 122595445 ; 7…
banane ; 60225103 ; 3…
Et ainsi de suite.
Les … et les ; permettent naviguer dans le texte pour le modifier “facilement”.
La partie pour ajouter fonctionne très bien, celle pour retirer un produit aussi.
Cependant lorsque le stock commence à être important (plus de 5 lignes), des problèmes apparaissent pour la lecture de la carte SD, je suis quasi persuadé que c’est lié à la mémoire de l’Arduino qui sature. J’utilise 90% de l’espace de stockage de programme et 70% de la mémoire dynamique, je suis sur arduino uno.
Les problèmes sont les suivants: non envoi par le module bluetooth et lorsque je retire des produits, il y a un moment ou je dois supprimer le fichier et le rajouter juste après (sans la ligne supprimée), cependant ce qui s’enregistre n’est que très partiel (juste la fin du fichier ou partie).
J’aimerai avoir de l’aide pour résoudre ces problèmes: gagner de la place sur l’arduino, trouver un autre moyen de modifier le texte du fichier sans avoir à enregistrer tout le contenu dans une variable, envoyer le document ligne par ligne plutôt qu’en une seule fois.
Si l’un d’entre vous à du temps pour m’aider, ça serait génial ! Merci d’avance !
Voici mon programme:
#include <SoftwareSerial.h>
#include<SD.h>
#include<SPI.h>
#include <usbhid.h>
#include <hiduniversal.h>
#include <Usb.h>
#include <usbhub.h>
#include <hidboot.h>
USB Usb;
USBHub Hub(&Usb);
HIDUniversal Hid(&Usb);
String data = "";
class KbdRptParser : public KeyboardReportParser {
void PrintKey(uint8_t mod, uint8_t key);
protected:
virtual void OnKeyDown (uint8_t mod, uint8_t key);
virtual void OnKeyPressed(uint8_t key);
};
KbdRptParser Prs;
SoftwareSerial HC06 (7, 5);
File fichier;
byte buzz = 3;
byte cs = 6;
String messageRecu;
String messageEnvoye; //Lecture de carte sd
void setup() {
Serial.begin(9600);
Usb.Init();
delay(200);
Hid.SetReportParser(0, (HIDReportParser*)&Prs);
HC06.begin(9600);
pinMode(cs, OUTPUT);
pinMode(buzz, OUTPUT);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print(F("Initializing SD card..."));
if (!SD.begin(6)) {
Serial.println(F("initialization failed!"));
tone(buzz, 500, 200);
while (1);
}
Serial.println(F("Carte SD prête"));
buzzer();
lectureCarte();
delay(1000);
}
void loop() {
Usb.Task();
while (HC06.available())
{
char c = HC06.read();
delay(3);
messageRecu += c;
}
/*****************Si le message recu par bluetooth est "maj" on envoi le contenu du fichier par bluetooth*************/
if (messageRecu == "maj") {
lectureCarte();
HC06.print("Début \n" + messageEnvoye + "\n Fin");
}
/*****************Si le message recu commence par "ajo" on ajoute le suite du message au fichier*************/
if (messageRecu.substring(0, 3) == "ajo") {
fichier = SD.open("inv.txt", FILE_WRITE);
if (fichier) {
Serial.println(F("Écriture du fichier..."));
fichier.println(messageRecu.substring(4));
fichier.close();
Serial.println(F("Fait"));
}
fichier.close();
buzzer();
}
/*****************Si le message recu commence par "sup" on supprime le produit du fichier*************/
if (messageRecu.substring(0, 3) == "sup") {
lectureCarte();
messageEnvoye.toLowerCase(); //Pour le comparaison on met en minuscule
messageRecu.toLowerCase();
int i = messageEnvoye.indexOf(messageRecu.substring(4));
int j = i;
if (messageRecu.substring(4).length() > 2 && i > -1) {
while (messageEnvoye.substring(j, j + 3) != "...") {
j++;
Serial.println(messageEnvoye.substring(j, j + 3));
delay(50);
}
if (i - 1 < 0) {
i++;
}
else if (j + 5 >= messageEnvoye.length()) {
j--;
}
Serial.print(messageEnvoye.substring(i - 1, j + 5));
messageEnvoye.remove(i - 1, j - i + 5);
Serial.println(messageEnvoye);
messageEnvoye.remove(messageEnvoye.length() - 1);
SD.remove("inv.txt");
delay(1000);
fichier = SD.open("inv.txt", FILE_WRITE);
if (fichier) {
Serial.println(F("Écriture du fichier..."));
fichier.println(messageEnvoye);
delay(1000);
fichier.close();
Serial.println(F("Fait"));
buzzer();
}
}
}
messageEnvoye = "";
messageRecu = "";
}
void buzzer() {
tone(buzz, 4000, 100);
delay(200);
tone(buzz, 4000, 100);
}
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) {
uint8_t c = OemToAscii(mod, key);
if (c)
OnKeyPressed(c);
}
void KbdRptParser::OnKeyPressed(uint8_t key) {
char c = (char)key;
if (key == 19) {
String ret = data;
data = "";
barcodeCallback(ret);
} else {
data += c;
}
}
void barcodeCallback(String data) {
Serial.println(data);
}
void lectureCarte() {
messageEnvoye = "";
fichier = SD.open("inv.txt", FILE_READ);
if (fichier.available()) {
Serial.println(F("Lecture:"));
while (fichier.available()) {
messageEnvoye += char(fichier.read());
}
Serial.println(messageEnvoye);
fichier.close();
}
}