Bienvenido, Invitado
Nombre de Usuario: Contraseña: Recordarme
  • Página:
  • 1
  • 2

TEMA:

Comunicacion Nextion to STM32 4 años 5 meses antes #1825

Hola, buenas tardes, estoy realizando un proyecto utilizando:
pantalla nextion 7"
Stm32f103
2 conversores ads1115
Para programar el STM uso el ide de Arduino.
La idea es no utilizar librerias para comunicarme con la pantalla nextion, por lo que tuve que surfear por el set de instrucciones varias veces para poder lograr cosas basicas jejej

El objetivo del proyecto seria leer 18 entradas analogicas y representarla en 5 paginas diferentes de la pantalla nextion
10 entradas del stm y 8 de los ads1115

Para comunicarle via serial a la pantalla solo los objetos que representa una pagina. uso un swtich con 5 casos. Uno caso por cada pagina.

La pantalla nextion tiene 5 botones donde cada uno esta programado para que te lleve a una pantalla y en el preinitialize de cada pagina esta programado lo que le comunico al micro para que entre a los case.
La programacion en nextion es:
Preinitialize:
Print “hA”
Delay=100
Print “hA”
Delay=200
Print “hA”
Lo mismo para el resto de las paginas pero enviado B, C, D, E

La pantalla nextion envia una trama de error si le estamos enviando objetos que no tiene en esa pagina
Aqui! surge el problema en la transición de pagina.
Mientras escribía esta consulta se me ocurrió una solución, pero no se si es la adecuada o mas profesional.
En un principio detectaba desde el micro el fin de la trama enviada, pero nextion me envia en la transición de pantalla muchos caracteres de error con lo que se me almacenaban y me bloqueaba el programa.
Luego hoy me di cuenta de que seria mejor detectar el comienzo de la trama “h”, la mejora no fue del todo buena hasta que le incorpore 3 mensajes de print con delay en cada pagina.
Ahora parece funcionar bien pero no estoy seguro de que sea lo correcto.
Si bien parece funcionar bien para el usuario, la trama de error en la transición se sigue enviando.
Otra solución que encontré, menos bonita, fue cargar en todas las pantallas de nextion todos los objetos y los que no son utilizados los puse en color blanco y los achique al máximo. De esta manera la trama de error via serie desaparecio. (aquí si se soluciono por completo)
Antes de esto intente muchas cosas que no funcionaron. No soy programador disculpen si estoy haciendo bestialidades jeje.
Copio el código del Stm32:


#include <Wire.h>
#include <Adafruit_ADS1015.h>

// Adafruit_ADS1115 ads; /* Use this for the 16-bit version */
Adafruit_ADS1015 ads; /* Use thi for the 12-bit version */

Adafruit_ADS1115 ads_A (0x49);
Adafruit_ADS1115 ads_B (0x48);
//
DECLARACION DE CONSTANTES

const int PIN_ENT_ANALOGICA[10]={PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PB0,PB1};

//
DECLARACION DE VARIABLES
//
char data[20]; //ARRAY PARA COMUNICACION SERIE
size_t dataIndex = 0;
//
int VALOR_ANALOGICO[20];
int16_t VALOR_ANALOGICO1[10]; // para puertos analogicos externos
int SUMANDO[20];
int16_t SUMANDO1[10]; // para puertos analogicos externos.
int PROMEDIO[20]={0};
int16_t PROMEDIO1[10]={0}; // para puertos analogicos externos.
int REPETICIONES=400; // VALOR DE REPETICIONES DEL PROMEDIO
float MULTIPLICADOR1[10]={0.05684402001,0.05684402001,0.05684402001,0.05684402001,0.05684402001,0.05684402001,0.05684402001,0.05684402001,0.05684402001,0.05684402001}; // multiplicador para puertos analogicos ext.
float MULTIPLICADOR[10]={0.24431957,0.24431957,0.24431957,0.24431957,0.24431957,0.24431957,0.24431957,0.24431957,0.24431957,0.24431957}; // MULTIPLICADOR PARA PUERTOS INTERNOS 0 A 1000
char character;
char DATA1;
int flag=0;

//


void setup() {

//
DECLARACION DE PINES COMO ENTRADAS ANALOGICAS
pinMode(PIN_ENT_ANALOGICA[0], INPUT_ANALOG);
pinMode(PIN_ENT_ANALOGICA[1], INPUT_ANALOG);
pinMode(PIN_ENT_ANALOGICA[2], INPUT_ANALOG);
pinMode(PIN_ENT_ANALOGICA[3], INPUT_ANALOG);
pinMode(PIN_ENT_ANALOGICA[4], INPUT_ANALOG);
pinMode(PIN_ENT_ANALOGICA[5], INPUT_ANALOG);
pinMode(PIN_ENT_ANALOGICA[6], INPUT_ANALOG);
pinMode(PIN_ENT_ANALOGICA[7], INPUT_ANALOG);
pinMode(PIN_ENT_ANALOGICA[8], INPUT_ANALOG);
pinMode(PIN_ENT_ANALOGICA[9], INPUT_ANALOG);

//

Serial.begin(9600); // INICIALIZACION DE PUERTO SERIE EN VEL. 9600

//

//
CONFIGURACION DE GANANCIA DE CONVERSOR EXTERNO ADS1115

ads_A.begin (); // ads1115 PLACA 1
ads_B.begin (); // ads1115 PLACA 2
// EXPANSIBLE HASTA 4
//



}

void loop() {

comunicacion();
if(flag==1)
{
flag=0;
}

switch(data[1])
{
case 'A': //PANTALLA MEDICIONES (n15,n16,n17) (j0,j1,j2) conversor externo.
//Serial.print("n15.val="+String(100)+"\xFF\xFF\xFF");
{

for(int I=1; I<=3;I++) // ciclo de n15 a n17 LEO PUERTOS ANALOG. EXTERNOS
{

ads_B.readADC_SingleEnded (I); //ads_A LEO PUERTOS DE LA PLACA 2 (0x48) DE 1 A 3
VALOR_ANALOGICO1[I+4]=ads_B.readADC_SingleEnded (I); // Y ASIGNO A VALOR_ANALOGICO[ DE 5 A 7]
}


for(int I=1; I<=3;I++) // ciclo de PROMEDIO ESCALADO DE 0 A 1000
{
VALOR_ANALOGICO1[I+4]=VALOR_ANALOGICO1[I+4]*MULTIPLICADOR1[I+4];
}

//CAMPO NUMERICO n15 A n17
for(int I=15; I<=17;I++)

{
Serial.print("n"+String(I)+".val="+String(VALOR_ANALOGICO1[I-10])+"\xFF\xFF\xFF");
}


//CAMPO SLIDER VA DE 0 100 % USO DE MULTIPLICADOR 0.1 LUEGO CORREGIR
for(int I=0; I<=2;I++)
{
Serial.print("j"+String(I)+".val="+String(int(VALOR_ANALOGICO1[I+5]*0.1))+"\xFF\xFF\xFF");
}

}

break;


case 'B': // PANTALLA UMBRALES ( n0 a n14) DE n0 a n9 conversor interno de n10 a n14 conv externo
//Serial.print("n0.val="+String(100)+"\xFF\xFF\xFF");
{

int A=1;
while( REPETICIONES>=A ) // MIENTRAS REPETICIONES SEA DISTINTO A 'A' SE MANTIENE DENTRO..
{ // LEO VALOR ANALOGICO LO ACUMULO EN SUMANDO[] E INCREMENTO EL VALOR DE A

for(int i=0; i<=9;i++) // ciclo de n0 a n9
{

analogRead(PIN_ENT_ANALOGICA);
VALOR_ANALOGICO=analogRead(PIN_ENT_ANALOGICA); // LEO VALOR ANALOGICO Y LO ASIGNO.

SUMANDO=SUMANDO+VALOR_ANALOGICO; // ACUMULO VALOR ANALOGICO EN SUMANDO[DE 0 A 9]

}

A=A+1; //INCREMENTO



}

for(int I=0; I<=3;I++) // ciclo de n10 a n13 LEO PUERTOS ANALOG. EXTERNOS
{
ads_A.readADC_SingleEnded (I); //ads_A LEO PUERTOS DE LA PLACA 1 (0x49)
VALOR_ANALOGICO1=ads_A.readADC_SingleEnded (I); // Y ASIGNO A VALOR_ANALOGICO[ DE 0 A 3]
}


ads_B.readADC_SingleEnded (0); // ads_B LEO PUERTO DE LA PLACA 2 (0x48)
VALOR_ANALOGICO1[4]=ads_B.readADC_SingleEnded (0); // Y ASIGNO A VALOR_ANALOGICO[4]
VALOR_ANALOGICO1[4]=VALOR_ANALOGICO1[4]*MULTIPLICADOR1[4];


for(int I=0; I<=9;I++) // ciclo de PROMEDIO DIVIDO EL ACUMULADO EN SUMANDO[] Y ASIGO A PROMEDIO[]
{
PROMEDIO=SUMANDO/REPETICIONES;
}



for(int I=0; I<=9;I++) // ciclo de PROMEDIO ESCALADO DE 0 A 1000
{
PROMEDIO=PROMEDIO*MULTIPLICADOR;
SUMANDO=0; // PONGO A CERO EL ACUMULADOR SUMANDO. PARA EL PROXIMO CICLO
}

for(int I=0; I<=3;I++) // ciclo de PROMEDIO ESCALADO DE 0 A 1000
{
VALOR_ANALOGICO1=VALOR_ANALOGICO1*MULTIPLICADOR1;
}
// CAMPO NUMERICO DE n0 A n9
for(int I=0; I<=9;I++)
{
Serial.print("n"+String(I)+".val="+String(PROMEDIO)+"\xFF\xFF\xFF");
}
// CAMPO NUMERICO DE n10 A n13
for(int I=10; I<=13;I++)
{

Serial.print("n"+String(I)+".val="+String(VALOR_ANALOGICO1[I-10])+"\xFF\xFF\xFF");

}
// CAMPO NUMERICO n14
Serial.print("n"+String(14)+".val="+String(VALOR_ANALOGICO1[4])+"\xFF\xFF\xFF");


}
break;

case 'C': // PANTALLA GRAFICA (s0) (n15) con posibilidad de n16

{
analogRead(PIN_ENT_ANALOGICA[15]);
VALOR_ANALOGICO1[4]=ads_B.readADC_SingleEnded (1); // LEO VALOR ANALOGICO Y LO ASIGNO
VALOR_ANALOGICO1[4]=VALOR_ANALOGICO1[4]*MULTIPLICADOR1[4];

//CAMPO NUMERICO
Serial.print("n15.val="+String(VALOR_ANALOGICO[4])+"\xFF\xFF\xFF"); // VER SI ES NECESARIO CONVERTIR A INT

//CAMPO GRAFICO // OBJETO 1, CANAL 0, VALOR DE 0 A 255
Serial.print("add 1,0,"+String(VALOR_ANALOGICO[4]*0.255)+"\xFF\xFF\xFF");


}
break;


case 'D': // PANTALLA PRUEBA (n0 a n17) (t0)
{
int A=1;
while( REPETICIONES>=A ) // MIENTRAS REPETICIONES SEA DISTINTO A 'A' SE MANTIENE DENTRO..
{ // LEO VALOR ANALOGICO LO ACUMULO EN SUMANDO[] E INCREMENTO EL VALOR DE A

for(int i=0; i<=9;i++) // ciclo de n0 a n9
{

analogRead(PIN_ENT_ANALOGICA);
VALOR_ANALOGICO=analogRead(PIN_ENT_ANALOGICA); // LEO VALOR ANALOGICO Y LO ASIGNO.

SUMANDO=SUMANDO+VALOR_ANALOGICO; // ACUMULO VALOR ANALOGICO EN SUMANDO[DE 0 A 9]

}

A=A+1; //INCREMENTO



}

for(int I=0; I<=3;I++) // ciclo de n10 a n17 LEO PUERTOS ANALOG. EXTERNOS
{
ads_A.readADC_SingleEnded (I); //ads_A LEO PUERTOS DE LA PLACA 1 (0x49)
VALOR_ANALOGICO1=ads_A.readADC_SingleEnded (I); // Y ASIGNO A VALOR_ANALOGICO[ DE 0 A 3]
ads_B.readADC_SingleEnded (I); //ads_A LEO PUERTOS DE LA PLACA 2 (0x48) DE 1 A 3
VALOR_ANALOGICO1[I+4]=ads_B.readADC_SingleEnded (I); // Y ASIGNO A VALOR_ANALOGICO[ DE 4 A 7]
}


for(int I=0; I<=9;I++) // ciclo de PROMEDIO DIVIDO EL ACUMULADO EN SUMANDO[] Y ASIGO A PROMEDIO[]
{
PROMEDIO=SUMANDO/REPETICIONES;
}

for(int I=0; I<=9;I++) // ciclo de PROMEDIO ESCALADO DE 0 A 1000
{
PROMEDIO=PROMEDIO*MULTIPLICADOR;
}
for(int I=0; I<=7;I++) // ciclo de PROMEDIO ESCALADO DE 0 A 1000
{
VALOR_ANALOGICO1=VALOR_ANALOGICO1*MULTIPLICADOR1;
}

// CAMPO NUMERICO DE n0 A n9
for(int I=0; I<=9;I++)
{
Serial.print("n"+String(I)+".val="+String(PROMEDIO)+"\xFF\xFF\xFF");
}
// CAMPO NUMERICO DE n10 A n13 y n14 a n17
for(int I=10; I<=13;I++)
{

Serial.print("n"+String(I)+".val="+String(VALOR_ANALOGICO1[I-10])+"\xFF\xFF\xFF");
Serial.print("n"+String(I+4)+".val="+String(VALOR_ANALOGICO1[I-6])+"\xFF\xFF\xFF");
}




}
break;


case 'E': //PANTALLA REFERENCIAS Por ahora se cargan desde la pantalla y almacenan ahi


break;

default:

break;



}






}


void comunicacion()
{
while (Serial.available())
{

char character = Serial.read();

if (character != 'h') // elegir separador
{
dataIndex = 0;
}
else
{

flag=1;

for(dataIndex=0;dataIndex<=3;dataIndex ++)
{
data[dataIndex] = character;
delay(100);
character = Serial.read();
}
}

}

}

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Comunicacion Nextion to STM32 4 años 5 meses antes #1835

Yo para entender mejor todo el proyecto, agradeceria que subieras en un fichero zip o rar, el fichero del arduino y el fichero de la nextion. Asi podria ver todo en conjunto.
Un saludo.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Comunicacion Nextion to STM32 4 años 5 meses antes #1836

Hola, buenas noches. envio los codigos. gracias

Archivo Adjunto:

Nombre del Archivo: v9_con_swi...n_OK.rar
Tamaño del Archivo:3 KB

Archivo Adjunto:

Nombre del Archivo: nextionmayo2020.rar
Tamaño del Archivo:1,120 KB
Adjuntos:

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Comunicacion Nextion to STM32 4 años 5 meses antes #1846

Bien, yo basicamente lo que haria es que la pantalla nextion no tomara ninguna decision ni mandara nada. Yo el control siempre se lo doy al arduino? Por que? por que si tu desde el arduino le mandas cambiar a la nextion de pantalla lo hara el 100% de las veces, pero si cambias de pantalla con la nextion y le mandas un codigo al arduino, tiende a no interpretar bien la trama muchas mas veces de lo que crees. Y entonces estaras en una pagina en la nextion y una diferente en el arduino.

que suelo hacer yo, es el arduino el que manda cambiar de pagina al a nextion. Como el arduino sabe en que pagina esta siempre, solo actualiza los datos que sabe que estan en esa pagina y no genera ningun mensaje de error.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Última Edición: por Jose Luis.

Comunicacion Nextion to STM32 4 años 5 meses antes #1847

Hola Jose Luis, muchas gracias por tu tiempo. Entiendo perfecto lo que me dices, voy a pensarlo de esa manera. Aunque me surge una duda, si la pantalla no se comunica con arduino, como hago para que sepa que tiene que cambiar de pagina? ya que en este caso el usuario iría cambiando de pagina con los botones de la pantalla.
Interpretando lo que me dices, tendría que enviar el estado del botón y que el cambio de pagina lo devuelva el arduino. estoy entendiendo bien ? Lo probare y comento luego

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Comunicacion Nextion to STM32 4 años 5 meses antes #1848

Pues cuando quiere cambiar de pagina, en vez de mandar la trama al arduino y cambiar de pagina desde la nextion ( haciendo un page 1 o page 2, etc), tu mandas la trama desde la nextion de que cambia de pantalla y es desde el arduino donde le mandas el comando para que cambie.
Si el arduino no identifica la trama desde la pantalla, tu te daras cuenta que no cambio y volveras a pulsar.

A mi hacerlo de esta forma me ha quitado muchos quebraderos de cabeza.
El siguiente usuario dijo gracias: MaxBuzz

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

  • Página:
  • 1
  • 2
Tiempo de carga de la página: 0.106 segundos
Gracias a Foro Kunena