• Aucun résultat trouvé

COURS : CONTROLER UN PIC PAR UNE PAGE HTML (XMLHTTPREQUEST)

N/A
N/A
Protected

Academic year: 2022

Partager "COURS : CONTROLER UN PIC PAR UNE PAGE HTML (XMLHTTPREQUEST)"

Copied!
8
0
0

Texte intégral

(1)

HTML (XMLHTTPREQUEST)

Objectifs : Etre capable de contrôler un système à microcontroleur (PIC) grâce à une page HTML

1. EXERCICE

1.1. Matériel requis : Platine PICV2

Module ESP8266 avec adaptateur PICV2

1.2. Démarche à suivre :

1. Créer une page HTML utilisant une requête XmlHttpRequest().

2. Créer le programme C recevant la requête

1.3. Cahier des charges

On souhaite allumer une LED présente sur la carte de test PICV2 par l'intermédiaire d'une page Web.

La carte PICV2 est connecté par l'intermédiaire d'un module ESP8266 un réseau Wifi.

1.4. Travaux à faire

Créer une page Web contenant 2 boutons : ON et OFF

L'appui sur les boutons envoie une requête XmlHttpRequest() (voir l'aide sur http://www.w3schools.com)

Remarque : on utilisera une requête GET

Créer le programme en C de réception de la requête et commander la LED en fonction de la valeur reçue.

Remarque : la valeur reçue sera LED1 ou LED0 pour allumer ou éteindre la

LED.

(2)

2. CORRECTION

2.1. Page HTML Remarque :

Le CSS dela page utilise la librairy metro.css et metro-icons.css disponible à : http://metroui.org.ua/

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<link href="css/metro.css" rel="stylesheet">

<link href="css/metro-icons.css" rel="stylesheet">

<script>

function EnvoiHttpRequestGET(addrHttp,val){

//envoi une requete http à l'adresse ip de l'élément //val = 0 ou val =1

var xhr_object = null;

var datahttp = null;

xhr_object = new XMLHttpRequest();

alert("GET /?ETAT=LED"+val+" vers "+addrHttp+" parti : ");

xhr_object.open("GET",addrHttp+"/?ETAT=LED"+val);//ouvre une requete GET vers URL xhr_object.send(null);

alert("GET vers "+addrHttp+" parti : ");

}

</script>

</head>

<body>

<div class="container" align="center">

<H1>ESSAI<br> Commande LED<br> avec style ModernUI </H1>

<button id="boutonON" class="shortcut-button bg-yellow bg-active-red fg-white"

onclick='EnvoiHttpRequestGET("192.168.1.44","1")'>

<span class="icon mif-lamp"></span>

<span class="title">ON</span>

<span id ="IPON" class="badge">192.168.1.44</span>

</button>

<button id ="boutonOFF" class="shortcut-button bg-gray bg-active-red fg-white" onclick='alert("OFF")'

>

<span class="icon mif-lamp"></span>

(3)

<span class="title">OFF</span>

<span id="IPOFF" class="badge">192.168.1.44</span>

</button>

</div>

</body>

</html>

La page Web est :

2.2. Programme en C

Remarque : Le programme contient des fonctions non utlisées dans cet exercice.

/*

Mode serveur

Attente d'une requete GET /?ETAT=LED1 ou /?ETAT=LED0 pour allumer 1 ou eteindre la LED

La requete GET est envoyé depuis une page html hébergée sur un servuer web

*/

/*

La procedure a suivre pour créer un serveur web avec envoi d'une donnée : Configuration de l'esp8266 :

il faut que l'esp soit en mode AT+STA et connaitre l'adresse IP (IPscan32) ou utilisation du soft ESPconfig.exe pour le placer dans le bon mode.

envoyer les commandes AT pour configurer le module ESP A. Construire un Web server

1. Accepter les connections multiples : envoyer "AT+CIPMUX=1\r\n"

2. Configurer en mode server à l'adresse 80 (80 car http sur port80)

(4)

envoyer "AT+CIPSERVER=1,80\r\n"

3. Avec un navigateur web aller à l'adresse IP du module Wifi port80 192.168.0.13:80 (chez moi)

4. Réception dune GET du module avec +IPD,0 ... avec 0 comme canal 5. Envoyer une réponse avec le canal et la taille des données en octet envoyer "AT+CIPSEND=channel,nboctet

Attention : finir l'envoi du html avec printf("\r\n\r\n"); le nb d'octet ne tient pas compte de ce final.

6. Il faut fermer la connection

*/

#include <16F876A.h>

#device adc=8

#FUSES NOWDT //No Watch Dog Timer

#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)

#FUSES NOPUT //No Power Up Timer

#FUSES NOPROTECT //Code not protected from reading

#FUSES NOBROWNOUT //No brownout reset

#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#FUSES NOCPD //No EE protection

#FUSES NOWRT //Program memory not write protected

#FUSES NODEBUG //No Debug mode for ICD

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,ERRORS)

#use rs232(baud=9600,parity=N,xmit=PIN_C5,rcv=PIN_C0,bits=8,stream=DEBUG,ERRORS)

#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)

#include <PCF2119_Driver_LCDI2C.c>

#include <stdlib.h>

#define allume_LEDVERTE output_high(PIN_C2);

#define KEYHIT_DELAY 500 // in milliseconds

#define LEDROUGE PIN_C0

#define LEDJAUNE PIN_C1

#define LEDVERTE PIN_C2 const int8 TailleBufferIn=30;

char DataBuffer[TailleBufferIn] ; //buffer d'entree char HTML[30];

int8 valcan0;//valeur acquise sur canal0

int16 nboctet = 549;//attention nbctet doit etre exacte et inferieur à 1024 boolean LEDROUGEON=true;//indicateur de LEDROUGE à ON ou off

#int_RDA

void RDA_isr(void) {

int8 li;

(5)

int8 lchar;

// disable_interrupts(GLOBAL); // all interrupts OFF // disable_interrupts(INT_RDA); // RS232 OF

// enable_interrupts(GLOBAL); // all interrupts OFF // enable_interrupts(INT_RDA); // RS232 OFF }

/*****************************************************************************/

boolean testOK(){

int8 i;

//attente OK

while(getc()!='O') {};

while(getc()!='K'){return(true);};

//fin attente OK }//fin testOK

/*****************************************************************************/

/***************************************/

// initialisation du CAN void initCAN(){

// initialise le CAN//

setup_port_a( RA0_RA1_RA3_ANALOG );

setup_adc( ADC_CLOCK_DIV_32 );

}

/***************************************/

// fonction d'acquisition : la valeur retournée est la valeur convertie du canal0 int8 acquerirCAN(int lcanal){

int lvaquire;

set_adc_channel( lcanal );

delay_us(100);

lvaquire=read_adc();

return lvaquire;

}

/***************************************/

int8 recupCanal(){

/*

détermine le canal à partir de la requete reçu du navigateur la requete est +IPD,0,307:GET / HTTP/1.1\0D

*/

int8 lnumcanal;

while(getc()!='+'){};

while(getc()!='I'){};

while(getc()!='P'){};

while(getc()!='D'){};

while(getc()!=','){};lnumcanal = atoi(getc());

(6)

return(lnumcanal);

}//fin recupCanal

/*****************************************************************************/

void main() {

int8 i=0;

int8 channel=0;

char strbuffer[20];

int8 lchar;

int8 valCAN;

setup_adc_ports(AN0_AN1_AN3);

setup_adc(ADC_CLOCK_INTERNAL);

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

setup_timer_1(T1_DISABLED);

setup_timer_2(T2_DISABLED,0,1);

set_tris_a(0b00111111);

set_tris_b(0b11111111);

set_tris_c(0b10010000);

initCAN();//initialise le CAN

Init_Ecran();//initialise l'écran LCD Efface_Ecran();

allume_LEDVERTE;

printf(Affiche_caractere,"WIFI SERVEUR\n\r");

delay_ms(2000);

//envoi command AT vers Wifi

fputs("AT+RST"); //testOK() ; //reset le module ESP8266 fprintf(DEBUG,"DEBUG ATRST\r\n"); delay_ms(1000);

//lecture de l'adresse IP du module ESP8266 fputs("AT+CIFSR");

for(i=0;i<20;i++) {

DataBuffer[i]=getc(); //detecte l'arrivee d'un K de OK pour finir l'enregistrement des données if (DataBuffer[i] == 'K') break;

}//for

Efface_Ecran();printf(Affiche_caractere,"%s ",DataBuffer);

do{

delay_ms(1000);

fputs("AT+CIPMUX=1"); testOK(); delay_ms(1000); //configure en multi connexion Efface_Ecran();printf(Affiche_caractere,"CIPMUX=OK"); delay_ms(1000);

fputs("AT+CIPSERVER=1,80"); testOK(); delay_ms(1000);//active (1) le module en mode server sur port 80 Efface_Ecran();printf(Affiche_caractere,"Attente reqHTTP");

//attente du GET /?LED1 ou /?LED0 en provenance d'un client while(getc()!='L') {};

while(getc()!='E') {};

while(getc()!='D') {};

(7)

if(getc()=='1') //ok testé {

output_high(LEDROUGE);

LEDROUGEON=true;

}//if

else //sinon RDIOLR=0 alors eteindre ledrouge et memoriser l'info {

output_low(LEDROUGE);

LEDROUGEON=false;

}//else

Efface_Ecran();printf(Affiche_caractere,"GET RECU"); delay_ms(10000);

puts("AT+CIPCLOSE=0"); // delay_ms(1000); //fermeture de la connection

}while(1);

}//main

(8)

V

Références

Documents relatifs

Trop souvent, l'intégration d 'une nouvelle technologie est vue comme un but en soi, et non comme une manière de créer de la valeur pour les différents acteurs qui vont

microscopique d’agitation des molécules d’eau augmente : l’énergie interne de l’eau

[r]

Les deux représentations données sont, pour le milieu extérieur au dipôle, équivalentes. On pourra toujours, selon les conditions, passer d'un modèle à l'autre. Applications :

Renvoie toutes les lignes ramenées par les deux requêtes, y compris les doublons.

Or pour Marx, ce qui échappe à Aristote, c’est l’élément commun car, par définition, ces deux valeurs d’usage sont disparates, pour devenir valeur d’usage, leur

Remarque : Plusieurs ordres de grandeurs sont possibles pour un même résultat..  On effectue ensuite la multiplication avec

exp est continue et dérivable sur R et sa dérivée est la fonction