De l'IDE Arduino à VSCode -AIDE-

Bonjour à tous,

Ca fais quelques semaines que j'ai mis les doigts dans le monde du code. Pour des projets perso "classique"
J'ai commencé en utilisant l'IDE Arduino ( car achat d'un Arduino Uno ) simple et efficace comme IDE,
j'ai un projet sur serveur où je dois utiliser VSCode ( pour la gestion des pages html, j'aurai d'ailleurs des questions la dessus ... plus tard dans un autre topic. )

J'abandonne l'IDE d'Arduino pour me focaliser entierement à VSCode ( qui comme vous le savez, est plus complexe mais bien plus puissant. ) en utilisant la platforme " PlatformIO "

Bref voici mon petit soucis. Simple.
J'ai 2 erreurs dans mon code sur VSCode ( que je n'avais pas sur l'IDE Arduino )
Me disant que les lignes ne sont pas include.
Je pense que cela doit venir d'un "placement" de ligne de code.
Pouvez vous me faire cette correction et m'expliquer le pourquoi, que je puisse comprendre d'où cela vient.

Projet : Timelaps de plante en serre : Le code a pour but :

  • prendre une photo tout les X temps
  • enregistrement sur carte SD
  • incrémentation des numéros photos pour éviter que celle presente sur la SD soit écraser lors d'un nouvelle prise de photo apèrs un Reset de la carte.
  • Réglages des photos (qualité)
  • Forçage de la LED Flash éteinte.

Matériel : ESP32 Cam Al Thinker

Bien sur si vous voyez des améliorations, des corrections ou autre, je suis bien sur preneur ! :slight_smile:

Merci une nouvelle fois pour votre aide.
J'ai peur que ce post soit Hors Sujet vu le titre de ce forum " Arduino" mais je ne trouve pas de forum aussi actif que celui ci pour trouver réponses à mes questions, si quelqu'un en connait, je prend :wink:

Mon code version VScode avec les 2 erreurs :

#include <Arduino.h>
#include "esp_camera.h"
#include "FS.h"                // SD Card ESP32
#include "SD_MMC.h"            // SD Card ESP32
#include "soc/soc.h"           // Disable brownout problems
#include "soc/rtc_cntl_reg.h"  // Disable brownout problems
#include "driver/rtc_io.h"
#include "SPI.h"

#define MINUTES_BETWEEN_PHOTOS 1

// Pin definition for CAMERA_MODEL_AI_THINKER
// Change pin definition if you're using another ESP32 with camera module
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27
#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22
#define BUILTIN_LED 4

// Keep track of number of pictures
unsigned int pictureNumber = 0;

//Stores the camera configuration parameters
camera_config_t config;

void setup() {

  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
 
  Serial.begin(115200);
  
  //Initialize the camera  
  Serial.print("Initializing the camera module...");
  configInitCamera();  /////////////////////////////////////////// ERREUR N°1 //////////////////////////////////
  Serial.println("Ok!");
 
  // Initialize the SD card
    if (!SD_MMC.begin("/sdcard", true)){
        Serial.println("Failed to mount SD card");
        return;
    }

    // Specify that LED pin
    pinMode(BUILTIN_LED, OUTPUT);
    digitalWrite(BUILTIN_LED, LOW);

    // Check for an SD card
    uint8_t cardType = SD_MMC.cardType();
    if (cardType == CARD_NONE){
        Serial.println("No SD card attached");
        return;
    }
}

void loop() {

  //Path where new picture will be saved in SD Card
  String path = "/picture" + String(pictureNumber) +".jpg";  
  Serial.printf("Picture file name: %s\n", path.c_str());

  //Take and Save Photo
  takeSavePhoto(path); /////////////////////////////////////////// ERREUR N°2 //////////////////////////////////
  pictureNumber++;
  delay(10000); 
  
}

void configInitCamera(){
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG; //YUV422,GRAYSCALE,RGB565,JPEG

  // Select lower framesize if the camera doesn't support PSRAM
  if(psramFound()){
    config.frame_size = FRAMESIZE_SXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
    config.jpeg_quality = 4; //10-63 lower number means higher quality
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  
  // Initialize the Camera
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  s->set_brightness(s, 0);     // -2 to 2
  s->set_contrast(s, 0);       // -2 to 2
  s->set_saturation(s, 0);     // -2 to 2
  s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
  s->set_whitebal(s, 1);       // 0 = disable , 1 = enable
  s->set_awb_gain(s, 1);       // 0 = disable , 1 = enable
  s->set_wb_mode(s, 0);        // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home)
  s->set_exposure_ctrl(s, 1);  // 0 = disable , 1 = enable
  s->set_aec2(s, 0);           // 0 = disable , 1 = enable
  s->set_ae_level(s, 0);       // -2 to 2
  s->set_aec_value(s, 300);    // 0 to 1200
  s->set_gain_ctrl(s, 1);      // 0 = disable , 1 = enable
  s->set_agc_gain(s, 0);       // 0 to 30
  s->set_gainceiling(s, (gainceiling_t)0);  // 0 to 6
  s->set_bpc(s, 0);            // 0 = disable , 1 = enable
  s->set_wpc(s, 1);            // 0 = disable , 1 = enable
  s->set_raw_gma(s, 1);        // 0 = disable , 1 = enable
  s->set_lenc(s, 1);           // 0 = disable , 1 = enable
  s->set_hmirror(s, 0);        // 0 = disable , 1 = enable
  s->set_vflip(s, 0);          // 0 = disable , 1 = enable
  s->set_dcw(s, 1);            // 0 = disable , 1 = enable
  s->set_colorbar(s, 0);       // 0 = disable , 1 = enable
}

void initMicroSDCard(){
  // Start Micro SD card
  Serial.println("Starting SD Card");
  if(!SD_MMC.begin()){
    Serial.println("SD Card Mount Failed");
    return;
  }
  uint8_t cardType = SD_MMC.cardType();
  if(cardType == CARD_NONE){
    Serial.println("No SD Card attached");
    return;
  }
}

void takeSavePhoto(String path){
  // Take Picture with Camera
  camera_fb_t  * fb = esp_camera_fb_get();

  
  if(!fb) {
    Serial.println("Camera capture failed");
    return;
  }

  // Save picture to microSD card
  fs::FS &fs = SD_MMC; 
  File file = fs.open(path.c_str(), FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file in writing mode");
  } 
  else {
    file.write(fb->buf, fb->len); // payload (image), payload length
    Serial.printf("Saved file to path: %s\n", path.c_str());
  }
  file.close();
  
  //return the frame buffer back to the driver for reuse
  esp_camera_fb_return(fb); 

  // Delay until the next photo

  delay(MINUTES_BETWEEN_PHOTOS * 1 * 1000);
  
}

recopiez le message d'erreur dans son intégralité

Mes excuses, c'est un oubli
Voici une capture d'écran :

c'est parce que l'IDE arduino génère des prototypes pour toutes les fonctions et rajoute cela en tête de fichier .ino, ce qui vous permet d'appeler une fonction qui est déclarée plus loin dans le code

VSCode ne le fait pas (avec raison), donc il faut respecter la norme C++ et déclarer les fonctions avant qu'elles ne soient appelées

par exemple rajoutez

// forward declarations
void configInitCamera();
void takeSavePhoto(String);

en début de fichier et le premier message d'erreur disparaîtra sans doute

Bonjour,
Il faut déclarer les prototypes de tes fonctions avant le setup()

//prototypes
void configInitCamera();
void initMicroSDCard();
void takeSavePhoto(String path);

@J-M-L a été plus rapide :wink:

Yes Merci les experts !!!
Je test ça ce soir. Merci pour l'explication.
J'avais réussi à supprimer les erreurs en les déplacant hors du setup et de la loop mais l'incrémentation des photos ne se faisaint plus. Je comprend mieux maintenant pourquoi.

Voilà pourquoi j'aime ce forum, vous êtes rapide et efficace !! A peine 5 vues et j'ai la solution,
J'ai posté ce même message sur un forum spécialement VsCode ... 50 vues et 0 réponses, pourtant le forum est fourni ... enfin bref ...
Ici il y a une section destiné pour VSCode ? Parce que je ne pense pas que mon post a lieu d'être sur ce site ...
Sinon des conseils où je peux trouver des forums aussi actifs que vous ? En tout cas VSCode ça a l'air vraiment top !!

Merci encore !!!

PS : Je vous est assez jeté de fleur, les chevilles ne gonflent pas trop
:joy: :pray:

pas vraiment, mais si c'est du code pour Arduino ou compatible, vous aurez sans doute des suggestions.

et si c'est trop hors sujet, on vous le dira sans fioritures aussi :slight_smile:

La question ne concerne pas vscode qui n’est qu’un éditeur de code.

La question concerne PlatformIO qui tourne sur differents editeur (vscode, Atom, eclipse, etc ).
Si tu fait une recherche sur ”platformIO” tu devrais trouver toute l’aide désirée.

1 Like

Si tu veux un environnement un peu plus sympa et ne pas changer tes habitudes tu peux essayer l'IDE Arduino V2.0

L'autocomplétion de la V2 n'est pas à la hauteur de PIO.

J'ai appercue brivement la V2 de l'IDE Arduino, ça ne m'a pas tellement emballer.
Pour la gestion du projet, des lib et autres dossiers, je trouve ça beaucoup plus pratique sur VSCode, même si un peu plus complexe.

On n'a rien sans faire un effort.

Au risque d'insister lourdement, vscode n'est qu'un éditeur de fichier qui accepte des plug-ins ou des add-on, enfin en français des modules complémentaires.

Celui que l'on utilise est platformIO.
La doc sur platformIO :

https://docs.platformio.org/en/stable//integration/ide/vscode.html

Tu as aussi les déclinaison par microcontroleur :
Exemple ESP32
https://docs.platformio.org/en/latest/platforms/espressif32.html

Exemple avr :
https://docs.platformio.org/en/latest/platforms/atmelavr.html

En général il suffit de sélectionner la carte et la bonne config arrive toute seule.

1 Like

D'autre part PlatforlmIO n'est pas la seule extension disponible pour 'faire de l'Arduino' avec VScode

Vscode et PlatformIO ne sont pas inséparables même si le succès (mérité de mon point de vue) ) de cette combinaison peut le laisser croire

(PlatormIO a commencé son existence comme extension d'Atom avant d'être associable à Vscode); Atom est en voie de disparition

+VSCodium existe (= Vscode sans le 'mouchard' de Microsoft) :wink:

Oui c'est bien ce que j'utilise pour le codage, PlateformeIO.
Ce n'est pas mal du tout, même si je comprends pas tout encore, loin de là.
Je continue de me baguarer quand je copier/coller de l'IDE Arduino et Plateforme IO, quelques lib qui ne s'accroche pas de la même manière. :hot_face: ou des declarations mal placées :sob:
Je galère un peu (pour ne pas dire beaucoup) mais ça permet d'apprendre.
Tout ça pour un simple code DHT serveur .... Mais j'y prend plaisir quand même.

C'est un problème courant lorsque l'on utilise un IDE et pas seulement un éditeur de fichier.
Après rien ne t'empêche d'utiliser VScode comme un simple éditeur, mais tu devra gérer toi même toutes la chaine de compilation.

Pourquoi fait tu des copier/coller entre les deux logiciels?

C'est parce que j'avais commencé mon code sur l'IDE Arduino, mais en voulant aller plus loin dans le projet ( mise sur serveur avec courbes historique des données (sur Firebase, d'ailleur je cherche une alternative gratuite à ce site) ) j'ai utilisé VS Code pour la page web (en suivant un tuto) et c'est là que je me suis dis pourquoi ne pas tout programmer sur VS Code via Platforme IO au lieu de l'IDE Arduino.

Oui effectivement les migrations d'IDE ne sont pas toujours simple.
Tu cherche une alternative à la base de donnée ou au service d'hébergement?
As tu pensé à héberger ta base de donnée en local, chez toi?

Une alternative à la base de données, si je comprend bien les therme :joy:
(désolé je m'y perd un peu)
Une base de donnée en local ? non, en faite je sais pas trop comment, les pour, les contres.

Dans la finalité du projet c'est simplement lire mes données DHT sur mon telephone (ou mac, de n'importe ou) lire en brut, et par courbes. En utilisant mon ESP32 Cam car il me sert aussi pour le TimeLaps et pour le wifi.
J'ai fais ça en suivant ces Tuto

Ok, alors tu veux une alternative à un service, qui comprend la base de donnée, le stockage et le rendu des données.

en gros la base de donnée est le logiciel, même si c'est finalement intimement lié au stockage.
Difficile d'utiliser un logiciel manipulant des données sans stockage :slight_smile:

Vu ce que tu veux faire, héberger le service chez toi, n'est pas forcément très opportun, car cela réclame un peu de savoir faire.

Moi pour ce genre de chose j'utilise le service mydevice, mais il y en a d'autre, je crois.
Tu crée un "device" sur leur plateforme et tu envois tes données via des requêtes MQTT.
Tu peux accéder à tes donnée, soit par leur site WEB, application mobile ou par leur API(je crois).
De ce que j'ai vu de Firebase, pour ce que tu fais c'est équivalent.

Pour développer un peu les contres d'une base de donnée en local.
Il faut une machine pour faire accueillir le logiciel(un rasberry par ex).
Il faut redirigé les flux entrants nécessaires par le service de ta box internet vers cette machine.
Il faut installer une application WEB pouvant permettre de visualiser tes données, sur cette machine(ou une autre).

1 Like

Effectivement pour la "version local" j'ai pas le materiel pour, et encore beaucoup trop novice pour me lancer dedans.
Exact je me souviens tu m'avais parlé de Cayenne dans un de mes post similaire, j'avais abandonné car il n'y avait plus l'app sur iphone, et je suis partie sur firebase, mais je vais retenter l'experience maintenant que je comprend un peu mieux le sujet. Et voir laquelle est la plus pratique.

Je vais essayer de terminer mon 1er projet ( et trouver cette foutu solution de mon souci de config cam ) après je ferai de nouveau test pour une nouvelle station méteo.