Go Down

Topic: Tester une future lampe/LED sans avoir de LED ? (Read 227 times) previous topic - next topic

Sosuk

Bonjour,
Je suis actuellement en stage dans une radio et je suis en train de configurer un arduino+Ethernet shield pour que en cas d'un appel téléphonique sur le standard, une lampe en studio clignote (pour signaler au chroniqueur que qqun passe un appel).

Je n'ai pas de problème pour modifier la valeur d'une variable avec un appel entrant(variable passe a 1) ou se termine(La variable retourne à 0 si appel répondu/manqué/terminé).

Il y a t-il sur l'ardruino un voyant vert comme celui avec marqué ON par exemple qui pourrait servir de test comme si cela représentait une LED ? Et donc de la faire clignoter lors d'un appel en cours ?

Mon tuteur n'a pas de led/résistance en stock et la lampe de studio en question nécessitera de balancer du 24V, donc je dois m'assurer que ça fonctionne avant qu'il s'occupe de toute l'installation :')

Je sais pas si c'est très clair dans mon explication.


dbrion06

LED_BUILTIN est faite pour ça (elle est soudée sur la carte)

kamill

J'ajoute qu'en général elle est marquée L sur les cartes arduino (au moins sur la UNO et MEGA)

J-M-L

#3
Apr 17, 2019, 05:44 pm Last Edit: Apr 17, 2019, 05:48 pm by J-M-L
le soucis c'est que le shield ethernet qui est sans doute enfiché sur le UNO va caché la LED intégrée - mais bon en regardant sur le coté on doit la voir clignoter :)

EDIT= j'ai rien dit, je viens de regarder sur mon shield et la LED est répétée aussi sur le shield ethernet (en rouge sur le mien, à côté de la pin AREF)

petit code de test:
Code: [Select]
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(200);
  digitalWrite(LED_BUILTIN, LOW);
  delay(100);
}
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Sosuk

#4
Apr 18, 2019, 10:09 am Last Edit: Apr 18, 2019, 10:39 am by Sosuk
Yes, merci de vos rep les gars c'est bien ce que je cherchais. :)

Cependant quand j'utilise juste le petit programme pour tester la LED elle fonctionne. Mais quand j'essaye de l'inclure à mon programme cela ne marche pas.

Voici le code du programme actuellement suite à l'inspiration du code de JML trouvé ici : https://forum.arduino.cc/index.php?topic=460333.0

Code: [Select]

#include <SPI.h>
#include <Ethernet.h>

const byte SDCARD_PIN = 4;

byte mac[] = {0xA8, 0x61, 0x0A, 0xAE, 0x0F, 0xA5};
const byte MaxCommand = 30;
char urlCommand[MaxCommand + 1]; // +1 for the trailing '\0'
IPAddress ip(192, 168, 0, 99);

const unsigned int SERVER_PORT = 44;
EthernetServer server(SERVER_PORT);

const char * labelsOfInterest[] = {"V", "W"};
const unsigned int maxLabelsOfInterest = sizeof(labelsOfInterest) / sizeof(char*);
long V = 0, W = 0;


void parseCommand()
{
  char * item;
  boolean labelFound;
  long int labelValue;
  int labelIndex;
  int commandLength = strlen(urlCommand);

  item = strtok(urlCommand, "=");

  while (item) {
    labelFound = false;
    for (int i = 0; i < maxLabelsOfInterest; ++i) {
      if (!strcmp(labelsOfInterest[i], item)) {
        item = strtok (NULL, ",");
        if (item != NULL) {
          labelFound = true;
          labelIndex = i;
          // then parse the value
          // we expect integers
          labelValue = atol(item);
          break; // ends the for loop as we found a label
        } // end if we had a value for the label
      } // end string compare
    } // end for

    if (labelFound) {
      switch (labelIndex) {
        case 0: // V
          V += labelValue;
          break;
        case 1: // W
          W += labelValue;
          break;
      }
   
    } else {
      item = strtok (NULL, ","); // skip this label value, not recognized
    }

    item = strtok (NULL, "="); // got to next one - will modify urlCommand
  }
}



void sendHTTPResponse(EthernetClient& client)
{
  // send a standard http response header
  client.println(F("HTTP/1.1 200 OK"));
  client.println(F("Content-Type: text/html"));
  client.println(F("Connection: close"));  // the connection will be closed after completion of the response
  // client.println(F("Refresh: 30"));  // refresh the page automatically every 30 sec
  client.println();
  client.println(F("<!DOCTYPE HTML>"));


  client.println(F("<html><head><style>body {text-align:center;}</style></head>")); // body will be centered
  client.println(F("<body bgcolor='#00979C'>")); // page backgroud color

  // V Value
  client.print(F("V=")); client.print(V); client.println(F("<br>"));
  client.print(F("<button onclick=\"location.href='/V=1'\" type='button'>V +1</button>"));
  client.print(F("<button onclick=\"location.href='/V=-1'\" type='button'>V -1</button>"));
  client.println(F("<br><br><br>"));

  // W Value
  client.print(F("W=")); client.print(W); client.println(F("<br>"));
  client.print(F("<button onclick=\"location.href='/W=5'\" type='button'>W +5</button>"));
  client.print(F("<button onclick=\"location.href='/W=-5'\" type='button'>W -5</button>"));
  client.println(F("<br><br><br>"));



  // Reset button
  client.println(F("<br><br><br>"));
  client.print(F("<button onclick=\"location.href='/V="));
  client.print(-V);
  client.print(F(",W="));
  client.print(-W);
  client.print(F("'\" type='button'>RESET</button>"));

  client.println(F("</center></body></html>"));
}



void handleCommand(EthernetClient& client)
{
  // the command is in urlCommand
  if (strlen(urlCommand) != 0) parseCommand();
  sendHTTPResponse(client);
}


void handleClient()
{
  boolean urlCommandFound = false;
  char httpHeader[MaxCommand + 1];
  byte httpHeaderIndex = 0;
  httpHeader[0] = '\0';
  urlCommand[0] = '\0';

  EthernetClient client = server.available();     // listen for incoming clients

  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // Serial.print(c); // if you want to see the HTTP request
        if (!urlCommandFound) {
          httpHeader[httpHeaderIndex++] = c;
          httpHeader[httpHeaderIndex] = '\0';
          if (httpHeaderIndex > MaxCommand - 1) httpHeaderIndex = MaxCommand - 1;
        }

        if (c == '\n' && currentLineIsBlank) {  // an http request ends with a blank line
          handleCommand(client);
          delay(5); // give the web browser time to receive the data
          client.stop(); // close the connection:
          break;
        }

        if (c == '\n') {
          currentLineIsBlank = true; // starting a new line
          if (!strncmp("GET / ", httpHeader, 5)) {
            strcpy(urlCommand, (httpHeader + 5)); // get rid of the "GET / "
            char * firstSpacePtr = strchr(urlCommand, ' ');
            if (firstSpacePtr) *firstSpacePtr = '\0'; // get rid of the " HTTP / 1.1 etc
            urlCommandFound = true;
          } else {
            httpHeaderIndex = 0;
            httpHeader[0] = '\0';
          }
        } else if (c != '\r') {
          currentLineIsBlank = false; // new character on the current line, ignore '\r'
        }
      }
    }
  }
}

void printServerAddress()
{
  Serial.print(F("connect to your arduino with http://"));
  Serial.print(Ethernet.localIP());
  if (SERVER_PORT != 44) { // 80 is the default port so not needed in the URL
    Serial.print(F(":"));
    Serial.println(SERVER_PORT);
  }
}

boolean renewDHCPLease()
{
  boolean ok = true;
  switch (Ethernet.maintain())
  {
    case 1:
      //renewed fail
      Serial.println(F("Error: renewed fail"));
      ok = false;
      break;

    case 2:
      //renewed success
      Serial.println(F("Renewed success"));
      printServerAddress();
     
      break;

    case 3:
      //rebind fail
      ok = false;
      Serial.println(F("Error: rebind fail"));
      break;

    case 4:
      //rebind success
      Serial.println(F("Rebind success"));
      printServerAddress();
      break;

    default:
      //nothing happened
      break;
  }
  return ok;
}

// -------------------------------------

void setup() {
  // You can use Ethernet.init(pin) to configure the CS pin
  //Ethernet.init(10);  // Most Arduino shields
  //Ethernet.init(5);   // MKR ETH shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
  //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet

  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Ethernet WebServer Example");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // start the server
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  pinMode(LED_BUILTIN, OUTPUT);
}


void loop() {
   if (renewDHCPLease()) { // we still have an IP address
    handleClient();
  }
  if (V == 1){
  digitalWrite(LED_BUILTIN, HIGH);
  delay(200);
  digitalWrite(LED_BUILTIN, LOW);
  delay(100);
  }
}


Donc en gros, actuellement quand le standard reçoit un appel il envoie l'URL V=1 ce qui fait passé la variable V à 1. Quand l'appel se termine, celui ci passe via l'url envoyé http://192.168.0.99:44/V=-1.

Du coup dans ma loop {} je tente de vérifier la valeur de V pour faire clignoter la lampe. ( j'ai placé pinMode(LED_BUILTIN, OUTPUT); après le start serveur mais je ne suis pas certain de sa place en fait)

Actuellement rien ne se passe quand V passe à 1.

Merci pour votre temps les gars :)


kamill

Mets ton code entre balises de code avant que ton post finisse dans le Bac-Ka-Poux-Bêle

Sosuk


J-M-L

#7
Apr 18, 2019, 10:52 am Last Edit: Apr 18, 2019, 10:56 am by J-M-L
Oui en fait c'est normal, c'est parce que votre carte Ethernet utilise le SPI et donc la pin 13 pour SCK qui sur un UNO est la même que LED_BUILTIN...

vous êtes coincé, faut trouver une LED ou un buzzer... en attendant pour montrer que ça fonctionne, vous pouvez toujours écrire dans la console série

ça fait plaisir de voir que les tutos servent de temps en temps :)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Sosuk

Okay donc je tournais en rond pour rien ahah

Yes encore merci pour ton tuto en tout cas, ça mâche bien le travail :D


Du coup dans l'idée, qu'est ce que vous conseillez pour faire clignoter la lampe 24V ?

- Envoyé une certaine tension dans un des ports (Sous forme de clignotement/delay comme avec une LED à clignoter) puis envoyé cette tension dans quelque chose qui envoie esnuite les 24V à la lampe ?

Les lampes studio sont de ce style la : https://i2.cdscdn.com/pdt2/9/9/0/1/700x700/sou0711331370990/rw/dc-24v-tour-industriel-lampe-led-rouge-vert-signal.jpg

Vous avez une idée du matériel à acheter ? résistances ? fils ? qui sont nécessaires ?

Merci :)

J-M-L

#9
Apr 18, 2019, 11:10 am Last Edit: Apr 18, 2019, 11:12 am by J-M-L
Un relai ou un MOSFET adapté par exemple

--> on trouve des relais 24V tout faits, c'est peut être le plus simple:


Un relai c'est comme un interrupteur piloté. vous avez une pin de commande sur votre Arduino, et quand vous l'activez ça ferme (ou ouvre suivant le câblage) l'interrupteur.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Sosuk

#10
Apr 18, 2019, 11:17 am Last Edit: Apr 18, 2019, 11:17 am by Sosuk
Du coup pour faire un clignotement, il faudrait ouvrir fermé avec un certain delay ou niveau du pin de commande? Y'a pas de risque à trop activer/désactiver le relais trop vite//trop longtemps?

J-M-L

#11
Apr 18, 2019, 11:23 am Last Edit: Apr 18, 2019, 11:29 am by J-M-L
oui pour le clignotement, de la même manière que vous allumez et éteignez la LED

il y a différent types de relais, celui sur l'image au dessus a une partie physique qui se met en mouvement (avec un électro-aimant) donc vous entendrez un petit bruit sec à chaque contact et oui ça s'use (mais quand même c'est prévu pour durer un certain temps).

il existe aussi des relais que l'on did "Solid State", ils n'ont pas de partie en mouvement et donc n'ont pas ce souci mécanique.

le relai servirait à piloter l'alimentation de votre transformateur 220V AC --> 24V DC

il faut regarder combien d'ampères votre lampe nécessite pour s'assurer que ce soit supporté par le relai
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up