Central de pagos o kiosko autoservicio

Hola compañeros del foro. Llevamos un tiempo trabajando sobre la idea de crear un sistema de pago desatendido, para locales autoservicio.

En principio queremos hacer dos modelos, uno, totalmente independiente, y otro, comunicado con un PLC que ya existe en la instalacion.

Las principales partes que queremos integrar son:

  • Aceptador de monedas, nos da varios pulsos dependiendo de la moneda introducida.
  • Aceptador de billetes, tambien nos da pulsos dependiendo del billete introducido.
  • Hooper de monedas, para devolver el cambio, por ahora no disponemos de ninguno, pero no tenemos problema para manejarlo, por tension o por copmunicacion cctalk.
  • TPV para tarjetas de credito, en principio fisicamente esta integrado en el kiosko, pero toda la gestion del mismo es autonoma y no afecta al sistema que queremos fabricar, como mucho, podemos sacar por su RS232 el estado del mismo.
  • Pantalla tactil DWIN de 7”.

Es en este punto que nos encontramos parados, en la pantalla DWIN. Hemos conseguido programar varias pantallas, pero llegados a esta pantalla que os muestro, queremos que el botón siguiente (para saltar a otra pagina) solo se active, si el valor de la variable 0x1000 es diferente de 0.

Los botones de lavadoras y secadoras, escriben en la variable 0x1000. Para pasar a la siguiente pantalla, es obligatorio seleccionar una de las maquinas.

Cualquiera de las maquinas que elijamos, modifica el valor de la variable.

En DGUS no encontramos la forma de hacerlo, queriamos contactar con personas del foro que puedan ayudarnos, o colaborar en este proyecto.

Leíste lo que has escrito, dime como alguien que no tiene acceso a todo lo que indicas puede si quiera responderte?

La variable 0x1000 esta en MODBUS? Estoy suponiendo las cosas, porque luce como una dirección modbus y si es el caso, por ahi esta la solución.
Lee las normas del foro y mejora el contexto de tu problema aportando manuales, link, códigos (segun corresponde usando etiquetas).

Hola Surbyte, gracias por tu respuesta.

He pasado muy por encima explicando el proyecto, porque es algo bastante extenso.

Aclaro un poco el bloqueo que tenemos por no saber como afrontarlo. La variable 0x1000, es de la propia pantalla.

La pantalla la programamos con su software DGUS II, no tiene, o no encontramos demasiadas opciones. En el punto que estamos parados, queremos que se active (que solo se pueda utilizar o pulsar) el botón de “siguiente”, cuando esa variable sea diferente de 0.

Por ahora no pensamos en la comunicacion, ni en la gestion del resto de perifericos. En un modelo lo haremos con un arduino, y en otro modelo de maquina lo haremos con un PLC a traves de modbus.

Con cualquiera de los controladores leeremos y escribiremos las variables que necesitemos para ejecutar el resto de funciones.

En la pantalla hemos probado diferentes botones, pero en ninguno de ellos hemos encontrado la opcion de que solo funcione cuando la variable 0x1000 sea diferente de 0.

Un saludo

Coloca un enlace a este software, o manuales, algo para guiarte. Sigues sin entender como explicar lo que del otro lado se requiere para darte un buen consejo.
Te lo pido una vez mas, lee de nuevo tus dos posteos y si con lo que has informado alguien puede ayudarte (alguien que no conoce y ha trabajado con tu software) me lo explicas.
Yo ahora buscaré que puedo hallar pero no es la idea.

AL margen de esto:
No tienes ejemplos del software con Arduino?

EDITO: Encontré este tutorial y creo que es muy descriptivo.

En el min 10:38 justamente seleccionan un boton touch 0x1000.
Sigo viendo y te comento.

Lo que no he encontrado hasta ahora es como esa comunicación que supongo va por Serial se puede interpretar en el arduino, que creo es tu consulta inicial.

Acá esta como se hace

min 17:37

En el min 21:08 hay una interfaz con Arduino y muestra como con un simple programa accionar un led, creo que te será de ayuda.

Este es el código que usa

//https://www.youtube.com/watch?v=UIH0ghxAj4Q
unsigned char Buffer[9];
byte onled[]={0x5A,0xA5,0x05,0x82,0x50,0x00,0x00,0x01};
byte offled[]={0x5A,0xA5,0x05,0x82,0x50,0x00,0x00,0x00};
int led=10;
void setup() 
{
  Serial.begin(115200);
  pinMode(led, OUTPUT);
  digitalWrite(led,LOW);
  Serial.println("Touch 1 on DWIN to ON LED , 0 to OFF....");
}

void loop() 
{
 if(Serial.available())
  {
    for(int i=0;i<=8;i++)   //TO store whole frame in buffer array. 0X5A A5 06 83 55 00 01 00 01 For ON
    {
    Buffer[i]= Serial.read();
    }
    
    if(Buffer[0]==0X5A)
      {
        switch(Buffer[4])
        {
       
          case 0x55:  //for led
            if(Buffer[8]==1)
            { digitalWrite(led,HIGH);
              Serial.println("led on");
              Serial.write(onled,8); }
            else
            {digitalWrite(led,LOW);
              Serial.println("led off");
              Serial.write(offled,8);
              }
            break;
            
      
          default:
           Serial.println("No Data");
           break;
        }
    }
  }
delay(10);
}

En este caso la direccón es 0x5000 que se ve en el array en los bytes 0x50,0x00
Deberías seguir los pasos del video, colocar los bytes en uno y con tu array, tendrás algo con qué trabajar. Creo que sería

byte onled[]={0x5A,0xA5,0x05,0x82,0x10,0x00,0x00,0x01};
byte offled[]={0x5A,0xA5,0x05,0x82,0x10,0x00,0x00,0x00};

Dime si no entiendes como seguir!

Gracias Surbyte, esto lo habia probado con una mini pantalla que tengo de otra marca y me funciono bien.

He conseguido resolver, utilizando otra estructura de pantalla diferente a la que originalmente pensabamos, una gran parte de los problemas que teniamos.

En breve seguire con el proyecto, por ahora tengo que aparcarlo.

Gracias