void setup(){
Serial.begin(9600);//inicializar puerto serie a 9600
}
void loop(){
byte i;
i=0;// lo pongo así porque no estoy seguro de que se vaya a reiniciar en cada loop
char texto[100];// la variable en la que voy a almacenar la cadena de texto
while (Serial.available()){//Serial.available devuelve el numero de caracteres que tiene en el buffer. Si no hay nada estará a cero y no se cumplirá la condición
texto[i++]=Serial.read();//si entra, puesto que i en el inicio vale cero irá almacenando los caracteres del buffer en el array de caracteres, que se auto-post-incrementa (i++)
}
byte j;//utilizo una segunda variable para ir recorriendo el array de caracteres
if (i) rota(texto, i);
for (j=0;j<i;j++) Serial.print(texto[j]);//imprimo todos los caracteres(el último no se imprime porque es [NULL]=0x00
if (i) Serial.println("");//Si ha habido impresión i será distinto a 0 e imprimo un salto de línea
}
void rota (char* cadena, byte tamano){
for (byte i=0;i<tamano;i++){
if (cadena[i]>='A' && cadena[i]<='Z') cadena[i]=r13(cadena[i], 'A', 'Z');
else if (cadena[i]>='a' && cadena[i]<='z') cadena[i]=r13(cadena[i], 'a', 'z');
}
}
char r13(unsigned char car, char menor, char mayor){//hago car de tipo unsigned porque puede superar el 0xEF y lo considera negativo
car+=13;
if (car>mayor) car=menor+(car-mayor)-1;
return car;
}
domingo, 23 de diciembre de 2018
Comunicaciones a través del puerto serie. En este caso con la terminal.
Tiene comentarios.
void setup(){
Serial.begin(9600);//inicializar puerto serie a 9600
}
void loop(){
byte i;
i=0;// lo pongo así porque no estoy seguro de que se vaya a reiniciar en cada loop
char texto[100];// la variable en la que voy a almacenar la cadena de texto
while (Serial.available()){//Serial.available devuelve el numero de caracteres que tiene en el buffer. Si no hay nada estará a cero y no se cumplirá la condición
texto[i++]=Serial.read();//si entra, puesto que i en el inicio vale cero irá almacenando los caracteres del buffer en el array de caracteres, que se autoincrementa (i++)
}
byte j;//utilizo una segunda variable para ir recorriendo el array de caracteres
for (j=0;j<i;j++) Serial.print(texto[j]);//imprimo todos los caracteres(el último no se imprime porque es [NULL]=0x00
if (i) Serial.println("");//Si ha habido impresión i será distinto a 0 e imprimo un salto de línea
}
domingo, 2 de diciembre de 2018
Servidor http con ESP32 (8 bits)
Falta depurar el código, limpiar comentarios y activar las correspondientes salidas, pero ya funciona.
No olvidar poner el nombre de la red y el password.
Código:
#include <WiFi.h>
// Replace with your network credentials
const char* ssid = "ssid";
const char* password = "password";//he habilitado el acceso a la red de área local
//ya funciona con inbita2
WiFiServer server(80);
const int led = 2; // the number of the LED pin
// Client variables
char linebuf[80];
int charcount = 0;
int estado=0;//byte con información de las 8 salidas
void setup()
{
estado=0;
// initialize the LED as an output:
//pinMode(led, OUTPUT);
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial) {
}
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// attempt to connect to Wifi network:
while (WiFi.status() != WL_CONNECTED)
{
// Connect to WPA/WPA2 network.
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
Serial.print("Estado: ");
Serial.println(WiFi.status());
}
void loop()
{
delay(1000);
// listen for incoming clients
WiFiClient client = server.available();
if (client)
{
Serial.println("New client");
memset(linebuf, 0, sizeof(linebuf));
charcount = 0;
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected())
{
if (client.available())
{
char c = client.read();
Serial.write(c);
//read char by char HTTP request
linebuf[charcount] = c;
if (charcount < sizeof(linebuf) - 1) charcount++;
if (c == '\n' && currentLineIsBlank)
{
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println();
client.println("<!DOCTYPE HTML><html><head>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>");
client.println("<h1>ESP32 - Web Server example</h1>");
client.println("<p>LED <a href=\"01\"><button>ON</button></a> <a href=\"00\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"11\"><button>ON</button></a> <a href=\"10\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"21\"><button>ON</button></a> <a href=\"20\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"31\"><button>ON</button></a> <a href=\"30\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"41\"><button>ON</button></a> <a href=\"40\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"51\"><button>ON</button></a> <a href=\"50\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"61\"><button>ON</button></a> <a href=\"60\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"71\"><button>ON</button></a> <a href=\"70\"><button>OFF</button></a></p>");
client.println("<table>");
client.println("<tr>");
client.println("<td align=\"center\">0</td>");
client.println("<td align=\"center\">1</td>");
client.println("<td align=\"center\">2</td>");
client.println("<td align=\"center\">3</td>");
client.println("<td align=\"center\">4</td>");
client.println("<td align=\"center\">5</td>");
client.println("<td align=\"center\">6</td>");
client.println("<td align=\"center\">7</td>");
client.println("</tr>");
client.println("<tr>");
client.print("<td align=\"center\">");
if (estado & 0x80) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x40) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x20) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x10) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x08) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x04) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x02) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x01) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("</tr>");
client.print("</table>");
client.println("</html>");
break;
}
if (c == '\n')
{
// you're starting a new line
currentLineIsBlank = true;
if (strstr(linebuf, "GET /00") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 0 ON");
estado &= 0x7F; //AND CON 0111 1111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /01") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 0 OFF");
estado |= 0x80; //OR CON 1000 0000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /10") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 1 ON");
estado &= 0xBF; //AND CON 1011 1111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /11") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 1 OFF");
estado |= 0x40; //OR CON 0100 0000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /20") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 2 ON");
estado &= 0xDF; //AND CON 1101 1111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /21") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 2 OFF");
estado |= 0x20; //OR CON 0010 0000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /30") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 3 ON");
estado &= 0xEF; //AND CON 1110 1111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /31") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 3 OFF");
estado |= 0x10; //OR CON 0001 0000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /40") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 4 ON");
estado &= 0xF7; //AND CON 1111 0111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /41") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 4 OFF");
estado |= 0x08; //OR CON 0000 1000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /50") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 5 ON");
estado &= 0xFB; //AND CON 1111 1011
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /51") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 5 OFF");
estado |= 0x04; //OR CON 0000 0100
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /60") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 6 ON");
estado &= 0xFD; //AND CON 1111 1101
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /61") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 6 OFF");
estado |= 0x02; //OR CON 0000 0010;
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /70") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 7 ON");
estado &= 0xFE; //AND CON 1111 1110;
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /71") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 7 OFF");
estado |= 0x01; //OR CON 0000 0001
//digitalWrite(led, LOW);
}
// you're starting a new line
currentLineIsBlank = true;
memset(linebuf, 0, sizeof(linebuf));
charcount = 0;
}
else if (c != '\r')
{
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
Serial.print("Estado de las salidas: ");
Serial.println(estado, HEX);
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disconnected");
}
}
No olvidar poner el nombre de la red y el password.
Código:
#include <WiFi.h>
// Replace with your network credentials
const char* ssid = "ssid";
const char* password = "password";//he habilitado el acceso a la red de área local
//ya funciona con inbita2
WiFiServer server(80);
const int led = 2; // the number of the LED pin
// Client variables
char linebuf[80];
int charcount = 0;
int estado=0;//byte con información de las 8 salidas
void setup()
{
estado=0;
// initialize the LED as an output:
//pinMode(led, OUTPUT);
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial) {
}
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// attempt to connect to Wifi network:
while (WiFi.status() != WL_CONNECTED)
{
// Connect to WPA/WPA2 network.
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
Serial.print("Estado: ");
Serial.println(WiFi.status());
}
void loop()
{
delay(1000);
// listen for incoming clients
WiFiClient client = server.available();
if (client)
{
Serial.println("New client");
memset(linebuf, 0, sizeof(linebuf));
charcount = 0;
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected())
{
if (client.available())
{
char c = client.read();
Serial.write(c);
//read char by char HTTP request
linebuf[charcount] = c;
if (charcount < sizeof(linebuf) - 1) charcount++;
if (c == '\n' && currentLineIsBlank)
{
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println();
client.println("<!DOCTYPE HTML><html><head>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>");
client.println("<h1>ESP32 - Web Server example</h1>");
client.println("<p>LED <a href=\"01\"><button>ON</button></a> <a href=\"00\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"11\"><button>ON</button></a> <a href=\"10\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"21\"><button>ON</button></a> <a href=\"20\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"31\"><button>ON</button></a> <a href=\"30\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"41\"><button>ON</button></a> <a href=\"40\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"51\"><button>ON</button></a> <a href=\"50\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"61\"><button>ON</button></a> <a href=\"60\"><button>OFF</button></a></p>");
client.println("<p>LED <a href=\"71\"><button>ON</button></a> <a href=\"70\"><button>OFF</button></a></p>");
client.println("<table>");
client.println("<tr>");
client.println("<td align=\"center\">0</td>");
client.println("<td align=\"center\">1</td>");
client.println("<td align=\"center\">2</td>");
client.println("<td align=\"center\">3</td>");
client.println("<td align=\"center\">4</td>");
client.println("<td align=\"center\">5</td>");
client.println("<td align=\"center\">6</td>");
client.println("<td align=\"center\">7</td>");
client.println("</tr>");
client.println("<tr>");
client.print("<td align=\"center\">");
if (estado & 0x80) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x40) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x20) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x10) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x08) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x04) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x02) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("<td align=\"center\">");
if (estado & 0x01) {
client.print("<div style=\"width: 100px; height: 100px; background: #00ff00;\"></div>");
}
else {
client.print("<div style=\"width: 100px; height: 100px; background: #ff0000;\"></div>");
}
client.print("</td>");
client.print("</tr>");
client.print("</table>");
client.println("</html>");
break;
}
if (c == '\n')
{
// you're starting a new line
currentLineIsBlank = true;
if (strstr(linebuf, "GET /00") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 0 ON");
estado &= 0x7F; //AND CON 0111 1111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /01") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 0 OFF");
estado |= 0x80; //OR CON 1000 0000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /10") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 1 ON");
estado &= 0xBF; //AND CON 1011 1111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /11") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 1 OFF");
estado |= 0x40; //OR CON 0100 0000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /20") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 2 ON");
estado &= 0xDF; //AND CON 1101 1111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /21") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 2 OFF");
estado |= 0x20; //OR CON 0010 0000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /30") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 3 ON");
estado &= 0xEF; //AND CON 1110 1111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /31") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 3 OFF");
estado |= 0x10; //OR CON 0001 0000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /40") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 4 ON");
estado &= 0xF7; //AND CON 1111 0111
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /41") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 4 OFF");
estado |= 0x08; //OR CON 0000 1000
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /50") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 5 ON");
estado &= 0xFB; //AND CON 1111 1011
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /51") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 5 OFF");
estado |= 0x04; //OR CON 0000 0100
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /60") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 6 ON");
estado &= 0xFD; //AND CON 1111 1101
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /61") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 6 OFF");
estado |= 0x02; //OR CON 0000 0010;
//digitalWrite(led, LOW);
}
if (strstr(linebuf, "GET /70") > 0)
{
//Serial.println("LED ON");
Serial.println("LED 7 ON");
estado &= 0xFE; //AND CON 1111 1110;
//digitalWrite(led, HIGH);
}
else if (strstr(linebuf, "GET /71") > 0)
{
//Serial.println("LED OFF");
Serial.println("LED 7 OFF");
estado |= 0x01; //OR CON 0000 0001
//digitalWrite(led, LOW);
}
// you're starting a new line
currentLineIsBlank = true;
memset(linebuf, 0, sizeof(linebuf));
charcount = 0;
}
else if (c != '\r')
{
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
Serial.print("Estado de las salidas: ");
Serial.println(estado, HEX);
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disconnected");
}
}
viernes, 30 de noviembre de 2018
Medir distancia mediante ESP32 y enviar al puerto serie
int EchoPin = 13;
int TriggerPin = 12;
void setup() {
Serial.begin(115200);
pinMode(TriggerPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop() {
int cm = ping(TriggerPin, EchoPin);
Serial.print("Distancia: ");
Serial.println(cm);
delay(1000);
}
int ping(int TriggerPin, int EchoPin) {
long duration, distanceCm;
digitalWrite(TriggerPin, LOW); //para generar un pulso limpio ponemos a LOW 4us
delayMicroseconds(4);
digitalWrite(TriggerPin, HIGH); //generamos Trigger (disparo) de 10us
delayMicroseconds(10);
digitalWrite(TriggerPin, LOW);
duration = pulseIn(EchoPin, HIGH); //medimos el tiempo entre pulsos, en microsegundos
distanceCm = duration * 10 / 292/ 2; //convertimos a distancia, en cm
return distanceCm;
}
ESP32 con matriz 16x16 dos imagenes que cambian usando millis() con un retardo de 1000 ms
//salidas que se van a utilizar
#define dataPin 13
#define clockPin 12
#define latchPin 14
uint16_t dato1[] = {
0xFFFF,
0x8001,
0xBFFD,
0xA005,
0xAFF5,
0xA815,
0xABD5,
0xAA55,
0xAA55,
0xABD5,
0xA815,
0xAFF5,
0xA005,
0xBFFD,
0x8001,
0xFFFF
};
uint16_t dato2[] = {
0x0000,
0x7FFE,
0x4002,
0x5FFA,
0x500A,
0x57EA,
0x542A,
0x55AA,
0x55AA,
0x542A,
0x57EA,
0x500A,
0x5FFA,
0x4002,
0x7FFE,
0x0000
};
byte i, j;
byte fi_L, fi_H;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
for (i = 0; i < 16; i++) dato1[i] ^= 0xFFFF;
for (i = 0; i < 16; i++) dato2[i] ^= 0xFFFF;
}
void loop() {
muestra (dato1);
//delay(1000);
muestra (dato2);
//delay(1000);
}
void muestra (uint16_t *matriz) {
double t_inicio;
unsigned int retardo=1000;
uint16_t aux;
byte enviar;
uint16_t n_fila;
int n;
t_inicio = millis();
while (millis()<(t_inicio+retardo)) {
n_fila = 1;
for (i = 0; i < 16; i++, n_fila <<= 1) {
fi_L = n_fila & 0xFF;
fi_H = (n_fila >> 8) & 0xFF;
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, LSBFIRST, fi_L);
shiftOut(dataPin, clockPin, LSBFIRST, fi_H);
aux = matriz[i];
enviar = aux & 0x00ff;
shiftOut(dataPin, clockPin, LSBFIRST, enviar);
enviar = (aux >> 8) & 0x00ff;
shiftOut(dataPin, clockPin, LSBFIRST, enviar);
digitalWrite(latchPin, 1);
}
}
}
jueves, 29 de noviembre de 2018
ESP32 con la matriz de 16x16. Mensaje HOLA.
//salidas que se van a utilizar
//pongo las 5 seguidas para que sea más sencillo conectarlas
//VCC
//GND
#define dataPin 13
#define clockPin 12
#define latchPin 14
/*
* poniendo el array en uint16_t y colocando la información en columnas en vez de en filas sería más facil crear mensajes largos
*/
//array en el que se va a contener toda la informacin de filas
uint32_t dato[] = {
0xCC7183F0,
0xCCF983F0,
0xCDDD8330,
0xCD8D8330,
0xCD8D8330,
0xCD8D8330,
0xCD8D8330,
0xFD8D83F0,
0xFD8D83F0,
0xCD8D8330,
0xCD8D8330,
0xCD8D8330,
0xCD8D8330,
0xCDDD8330,
0xCCF9FB36,
0xCC71FB36
};//informacion de las columnas
byte i, j;
byte fi_L, fi_H;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
for (i = 0; i < 16; i++) dato[i] ^= 0xFFFFFFFF; //invierto todos los bits porque las columnas van a los cátodos.
//si se cambia por uint16_t habría que cambiar esto de la inversión
}
void loop() {
muestra (dato,32,1000);//(matriz, ancho de la matriz, numero de repeticiones) cuanto mayor sea el numero de repeticiones más tardará en pasar a la siguiente columna.
uint32_t limpia[16];
for (int i=0;i<16;i++){
limpia[i]=0xFFFFFFFF;
}
muestra(limpia,32,10);
delay(1000);
}
void muestra (uint32_t *matriz, int ancho, unsigned int numero_rep) {//puesto que es una variable global podría usar dato[]
double t_inicio;
uint32_t aux;
byte enviar;
uint16_t n_fila;
//unsigned int n;
for (j = 0; j < ancho - 16; j++) {//empiezo en 32 porque es la anchura total (para empezar por el extremo izquierdo termino en 32-16 porque la anchura de la matriz de puntos es 16
for (int n = 0; n < numero_rep; n++) {//es una espera (va a repetir la información hasta saltar a la siguiente columna. Por eso no se hace nada con n.
//se posiciona la variable que indica el numero de fila en la primera fila (como es de 16 bits, se carga en una variable uint16_n)
n_fila = 1;
//como tiene 16 filas se van a enviar de una en una
for (i = 0; i < 16; i++, n_fila <<= 1) {//lo de rotar 1 bit a la izquierda es para que pase a la siguiente columna
//se extraen los bytes de menor y menor peso
//el de menor peso mediante una AND con 0000 0000 1111 1111
fi_L = n_fila & 0xFF;
//el de mayor peso mediante la misma AND pero con la variable n_fila desplazada 1 byte hacia la derecha
fi_H = (n_fila >> 8) & 0xFF;
//se prepara para recibir datos
digitalWrite(latchPin, 0);
//se envía la información de la fila (lógica positiva, una fila de cada vez)
shiftOut(dataPin, clockPin, LSBFIRST, fi_L);
shiftOut(dataPin, clockPin, LSBFIRST, fi_H);
//se envía la información de la columna (lógica negativa, por eso se invierte la matriz en setup()
//se posiciona en el primer bit desplazando el ancho total - 16 - i (que va a variar) y se carga en una variable de tipo uint32_n (como la matriz)
aux = matriz[i] >> (ancho - 16 - j);
//se cogen el byte de menor peso (operación AND con 0000 0000 1111 1111)
enviar = aux & 0x00ff;
//se envía el byte de menor peso que se había extraido
shiftOut(dataPin, clockPin, LSBFIRST, enviar);
//se extrae el segundo byte porque el dato se va a desplazar 1 byte a la derecha (el resto es como el anterior)
enviar = (aux >> 8) & 0x00ff;
shiftOut(dataPin, clockPin, LSBFIRST, enviar);
//se desactiva la recepción de datos y por lo tanto los va a mostrar
digitalWrite(latchPin, 1);
}
}//cuando ha repetido el numero de veces seleccionado, se pasa a la siguiente columna.
}
}
//pongo las 5 seguidas para que sea más sencillo conectarlas
//VCC
//GND
#define dataPin 13
#define clockPin 12
#define latchPin 14
/*
* poniendo el array en uint16_t y colocando la información en columnas en vez de en filas sería más facil crear mensajes largos
*/
//array en el que se va a contener toda la informacin de filas
uint32_t dato[] = {
0xCC7183F0,
0xCCF983F0,
0xCDDD8330,
0xCD8D8330,
0xCD8D8330,
0xCD8D8330,
0xCD8D8330,
0xFD8D83F0,
0xFD8D83F0,
0xCD8D8330,
0xCD8D8330,
0xCD8D8330,
0xCD8D8330,
0xCDDD8330,
0xCCF9FB36,
0xCC71FB36
};//informacion de las columnas
byte i, j;
byte fi_L, fi_H;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
for (i = 0; i < 16; i++) dato[i] ^= 0xFFFFFFFF; //invierto todos los bits porque las columnas van a los cátodos.
//si se cambia por uint16_t habría que cambiar esto de la inversión
}
void loop() {
muestra (dato,32,1000);//(matriz, ancho de la matriz, numero de repeticiones) cuanto mayor sea el numero de repeticiones más tardará en pasar a la siguiente columna.
uint32_t limpia[16];
for (int i=0;i<16;i++){
limpia[i]=0xFFFFFFFF;
}
muestra(limpia,32,10);
delay(1000);
}
void muestra (uint32_t *matriz, int ancho, unsigned int numero_rep) {//puesto que es una variable global podría usar dato[]
double t_inicio;
uint32_t aux;
byte enviar;
uint16_t n_fila;
//unsigned int n;
for (j = 0; j < ancho - 16; j++) {//empiezo en 32 porque es la anchura total (para empezar por el extremo izquierdo termino en 32-16 porque la anchura de la matriz de puntos es 16
for (int n = 0; n < numero_rep; n++) {//es una espera (va a repetir la información hasta saltar a la siguiente columna. Por eso no se hace nada con n.
//se posiciona la variable que indica el numero de fila en la primera fila (como es de 16 bits, se carga en una variable uint16_n)
n_fila = 1;
//como tiene 16 filas se van a enviar de una en una
for (i = 0; i < 16; i++, n_fila <<= 1) {//lo de rotar 1 bit a la izquierda es para que pase a la siguiente columna
//se extraen los bytes de menor y menor peso
//el de menor peso mediante una AND con 0000 0000 1111 1111
fi_L = n_fila & 0xFF;
//el de mayor peso mediante la misma AND pero con la variable n_fila desplazada 1 byte hacia la derecha
fi_H = (n_fila >> 8) & 0xFF;
//se prepara para recibir datos
digitalWrite(latchPin, 0);
//se envía la información de la fila (lógica positiva, una fila de cada vez)
shiftOut(dataPin, clockPin, LSBFIRST, fi_L);
shiftOut(dataPin, clockPin, LSBFIRST, fi_H);
//se envía la información de la columna (lógica negativa, por eso se invierte la matriz en setup()
//se posiciona en el primer bit desplazando el ancho total - 16 - i (que va a variar) y se carga en una variable de tipo uint32_n (como la matriz)
aux = matriz[i] >> (ancho - 16 - j);
//se cogen el byte de menor peso (operación AND con 0000 0000 1111 1111)
enviar = aux & 0x00ff;
//se envía el byte de menor peso que se había extraido
shiftOut(dataPin, clockPin, LSBFIRST, enviar);
//se extrae el segundo byte porque el dato se va a desplazar 1 byte a la derecha (el resto es como el anterior)
enviar = (aux >> 8) & 0x00ff;
shiftOut(dataPin, clockPin, LSBFIRST, enviar);
//se desactiva la recepción de datos y por lo tanto los va a mostrar
digitalWrite(latchPin, 1);
}
}//cuando ha repetido el numero de veces seleccionado, se pasa a la siguiente columna.
}
}
Suscribirse a:
Entradas (Atom)