Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#441
Buenos días Señor:

Estuve haciendo pruenas a mi manera, la de poner un número y luego pulsa Enter. Hace cosas raras todavía. Lo raro que hace es almacenar información que viene de Arduino. Lo ideal sería, que si viene algo desde Arduino, se muestre en pantalla de C++, luego se borre, preparado para que llegue otro nuevo mensaje. El truco de las teclas, todavía no me sale.
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "SerialClass.h"
using namespace std;

void main()
{
SetConsoleTitle("Control Led 13 de Arduino UNO y saludos.");

Serial* Puerto = new Serial("COM4");

while (Puerto -> IsConnected())
{

// Comandos para Arduino.
char L_ON[] = "Led13_ON";
char L_OFF[] = "Led13_OFF";
char Saludar[] = "Hola";
char Luz_ON[] = "Luz_ON";
char Luz_OFF[] = "Luz_OFF";
char lectura[50] = "\0";

int opc;

cout << endl;
cout << "Introduzca la opcion deseada: " << endl << endl;

cin >> opc;

switch (opc)
{
case 1:
cout << "caso 1\n";
// Enviar encender Led.
cout << "Enviando: " << L_ON << endl;
Puerto -> WriteData(L_ON, sizeof(L_ON) - 1);
break;

case 2:
cout << "caso 2\n";
// Enviar apagar Led.
cout << "Enviando: " << L_OFF << endl;
Puerto -> WriteData(L_OFF, sizeof(L_OFF) - 1);
break;

case 3:
cout << "caso 3\n";
// Mensaje saludar.
cout << "Enviando: " << Saludar << endl;
Puerto -> WriteData(Saludar, sizeof(Saludar) - 1);
break;

case 4:
cout << "caso 4\n";
// Mensaje saludar.
cout << "Enviando: " << Luz_ON << endl;
Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);
break;

case 5:
cout << "caso 5\n";
// Mensaje saludar.
cout << "Enviando: " << Luz_OFF << endl;
Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
break;

default:
cout << "Puse del 1 al 5.";
}

cout << endl;
Puerto->ReadData(lectura, 50);
cout << "Recibido: " << lectura << endl;
lectura[0] = 0; // Limpiar.
cout << "-------------------" << endl;

//system("PAUSE");
}
}


Código de Arduino perfectamente funcional con su LCD Keypad Shield incluido.
#include <LiquidCrystal.h>

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);

// Pin 10 para saber que es luz de fondo.
const byte LuzFondo = 10;

bool estadoActual = false, estadoUltimo = false, contador = false;
const byte pinLed = 13;   // Declaramos la variable pin del Led.
const byte boton = 2;
char caracter;
String comando;

void setup()
{
  pinMode(pinLed, OUTPUT);  // Inicializa el pin del LED como salida:
  pinMode(boton, INPUT);    // Pulsador del pin 2.
  Serial.begin(115200);     // Puerto serie 115200 baudios.
  lcd.begin(16, 2);         // Formato de pantalla.
  //digitalWrite(LuzFondo, HIGH);
  lcd.setCursor(0, 0);      // Posición en la pantalla.
  lcd.print("    Arduino     ");
  delay(1000);
}

void loop()
{
  /* Leyendo carácter a carácter lo que se resive por el canal del puerto serie
    y los voy concatenando uno tras otro en una cedena. */
  while (Serial.available() > 0)
  {
    caracter = Serial.read();
    comando.concat(caracter);
    delay(10);
  }

  estadoActual = digitalRead(boton); // Guarda el estado del pulsador.
  delay(50); // Retardo de 50 mili segundos par evitar antirebotes.

  // ¿Pulsador y estadoActual y negación del estadoUltimo es verdadero?
  if (estadoActual && !estadoUltimo)
  {
    contador = !contador;   // Cambio el estado tipo boleano.

    if (contador)
    {
      digitalWrite(LuzFondo, HIGH);
      Serial.write("ON");
      lcd.setCursor(15, 0);
      lcd.print("1");
    }
    else
    {
      digitalWrite(LuzFondo, LOW);
      Serial.write("OFF");
      lcd.setCursor(15, 0);
      lcd.print("0");
    }
  }

  // Pasa del estadoActual a estadoUltimo.
  estadoUltimo = estadoActual;

  // Si los carácteres es recibido y verdadero.
  if (comando.equals("Led13_ON") == true)
  {
    digitalWrite(pinLed, HIGH); // Enciende el Led.
    Serial.write("Led 13 encendido.");
    lcd.setCursor(0, 1);
    lcd.print("Led 13 encendido");
  }

  // Si los carácteres es recibido y verdadero.
  if (comando.equals("Led13_OFF") == true)
  {
    digitalWrite(pinLed, LOW); // Apaga el Led.
    Serial.write("Led 13 apagado  ");
    lcd.setCursor(0, 1);
    lcd.print("Led 13 apagado. ");
  }

  // Mensaje de saludo.
  if (comando.equals("Hola") == true)
  {
    Serial.write("Hola C++ de Win32. Saludos desde Arduino.");
    lcd.setCursor(0, 1);
    lcd.print("Hola C++ de Win32. Saludos desde Arduino.");
  }

  if (comando.equals("Luz_ON") == true)
  {
    digitalWrite(LuzFondo, HIGH); // Apaga el Led.
    Serial.write("Luz ON.");
    lcd.setCursor(0, 1);
    lcd.print("Luz ON.         ");
  }


  if (comando.equals("Luz_OFF") == true)
  {
    digitalWrite(LuzFondo, LOW); // Apaga el Led.
    Serial.write("Luz OFF.");
    lcd.setCursor(0, 1);
    lcd.print("Luz OFF.        ");
  }

  // Limpiamos la cadena para volver a recibir el siguiente comando.
  comando = "";
}


Si tengo la ventana de C++, pulso el botón desde Arduino, me tiene que llegar un mensaje, solo llega un ON o un OFF. No muestra nada en C#, solo se acumula en la variable lenguaje, que si envío algo, se suma el ON o OFF más otros mensajes.

Si no entiendes a lo que hablo, me lo dices y lo explico de otra manera.

Saludos.
#442
Hola:

Tengo el Proteus 7. Quiero el Proteus 8.5 o el 8.6. Me da igual si es portable o no. Cada vez que descargo uno, o son cosas porno, o tienen virus por todas partes.

¿Saben algún enlace seguro?

Otros muchos enlaces están caducados.

;)
#443
Hola Señor:

He hecho el proyecto desde el principio. Como me lía en C++ de Win32, jajajajajja. Y eso que me lo recomendaron mucha gente para aprenerlo, ni viniendo de C#. ;) A lo que íabmos.

La parte donde pone if (GetAsyncKeyState('A') & 0x8000) , precisamente 0x8000 no lo entiendo y no lo pone aquí.

Con este código me aparece el mensaje en pantalla pero no es capaz de enviar algo a Arduino o datos al puerto serie.
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "SerialClass.h"
using namespace std;

void main()
{
// Título de la ventana.
SetConsoleTitle("Control Led 13 de Arduino UNO y saludos.");

// Nombre del puerto selecconado.
Serial* Puerto = new Serial("COM4");

// Variables. Comandos para enviar a Arduino por puerto serie.
char L_ON[] = "Led13_ON";
char L_OFF[] = "Led13_OFF";
char Saludar[] = "Hola Arduino. Saludos desde el PC con C++ bajo  Win32.";
char Luz_ON[] = "Luz_ON";
char Luz_OFF[] = "Luz_OFF";

// Para almacenar datos desde el puerto serie.
char lectura[50];

// Mostrar texto en pantalla.
cout << "Pulse letra 'A' para endender Led y 'B' para apagar: " << endl;

while (Puerto->IsConnected())
{
// Tecla 'A' pulsada
if (GetAsyncKeyState('A') & 0x8000)
{
cout << "Enviando: " << Luz_ON << endl;
Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);
}

// Tecla 'B' pulsada
if (GetAsyncKeyState('B') & 0x8000)
{
cout << "Enviando: " << Luz_OFF << endl;
Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
}
}

system("PAUSE");
}


Parece ser que ignora esta instrucción.
Código (cpp) [Seleccionar]
Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);

Aquí una captura cuando pulsa solo la B o la A. Se repite muchas veces. (Si es posible hacer el tamaño de la ventana en la programación de C++, mejor que mejor).


Lo de recibir comandos desde el peurto serie o Arduino es este el que me refería:
Código (cpp) [Seleccionar]
Puerto -> ReadData(lectura, 50);
cout << "Recibido: " << lectura << endl;


Que este programa al mismo tiempo que envía comandos, también los puede recibir. Si el programa C++ no le hago nada, solo lo dejo arrancado, desde el puerto serie puede venir cualquier dato y C++ debe leerlo sin problemas.

Saludos.
#444
Hola:

Muchas gracias. Si te digo la verdad, no entiendo ni papa. Jajaajjajajaja. Soy de C# y este C de Win32 o en WinAPI.

Lo que tiene que hacer el programa es enviar este comando que lo hace bien.
Código (cpp) [Seleccionar]
cout << "Enviando: " << L_ON << endl;
Puerto -> WriteData(L_ON, sizeof(L_ON) - 1);


Arduino lo detecta.

Luego recibir este comando que no se si lo hace bien. Cuando Arduino le envía mensajes a C++ del PC.
Código (cpp) [Seleccionar]
Puerto -> ReadData(lectura, 50);
cout << "Recibido: " << lectura << endl;


Para los que me respondieron en privado lo pongo en público.
CitarSi hay que usar el Dev C++.


Pues a suarlo.
https://sourceforge.net/projects/orwelldevcpp/

Otros con el Code Blocks, que no se ponen de acuerdo. Para mi solo son IDE y me quedo con Visual studio 2017 que me gusta más. ;)

¿Alguna ayuda?

Saludos.
#445
Buenas:

Tengo un programa aquí que no está bien hecho del todo.

Envía datos al puerto seria, concretamente llega a Arduino. Los datos llegan bien, al recibir, ya no tanto.

Si pulsas la tecla, por ejemplo 5, primero se ve reflejado y luego tengo que pulsar Enter. Lo que quiero lograr es que si pulse el número 5, automáticamente ejecuta la instruacción del case 5 del Switch.

Otra cosa, es que no me llegan los datos desde Arduino cuando le pulso un botón. C++ tiene que ser capaz, desde que le llegue algún dato, reflejarlo en pantalla.

La librería a usar es esta.

https://github.com/Gmatarrubia/LibreriasTutoriales

El código de C++ es:
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "SerialClass.h"
using namespace std;

void main()
{
SetConsoleTitle("Control Led 13 de Arduino UNO y saludos.");

Serial* Puerto = new Serial("COM4");

while (Puerto -> IsConnected())
{

// Comandos para Arduino.
char L_ON[] = "Led13_ON";
char L_OFF[] = "Led13_OFF";
char Saludar[] = "Hola Arduino. Saludos desde el PC con C++ bajo  Win32.";
char Luz_ON[] = "Luz_ON";
char Luz_OFF[] = "Luz_OFF";
char lectura[50];

int opc;

cout << "Introduzca la opcion deseada: ";

cin >> opc;

switch (opc)
{
case 1:
cout << "caso 1\n";
// Enviar encender Led.
cout << "Enviando: " << L_ON << endl;
Puerto -> WriteData(L_ON, sizeof(L_ON) - 1);
break;

case 2:
cout << "caso 2\n";
// Enviar apagar Led.
cout << "Enviando: " << L_OFF << endl;
Puerto -> WriteData(L_OFF, sizeof(L_OFF) - 1);
break;

case 3:
cout << "caso 3\n";
// Mensaje saludar.
cout << "Enviando: " << Saludar << endl;
Puerto -> WriteData(Saludar, sizeof(Saludar) - 1);
break;

case 4:
cout << "caso 4\n";
// Mensaje saludar.
cout << "Enviando: " << Luz_ON << endl;
Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);
break;

case 5:
cout << "caso 5\n";
// Mensaje saludar.
cout << "Enviando: " << Luz_OFF << endl;
Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
break;

default:
cout << "Puse del 1 al 5.";
}

Puerto -> ReadData(lectura, 50);
cout << "Recibido: " << lectura << endl;

cout << "-------------------" << endl;

// system("PAUSE");
}
}


¿Alguna ayuda?

Un cordial saludo.

PD: Uso Visual Studio Community 2017, lenguaje C++ bajo Win32.
#446
Resuelto:

El primer problema, las librerías SerialClass.ccp y SerialClass.h, mejor ponerlas directamente en las capeta del proyecto. Borras las demás que te crea solo el compilador.

A parte de esto da otros errores.

Gravedad    Código    Descripción    Proyecto    Archivo    Línea    Estado suprimido
Error (activo)    E0167    un argumento de tipo "char *" no es compatible con un parámetro de tipo "LPCWSTR"    Cpp_Win32_Consola_Arduino    c:\Users\Usuario\Documents\Visual Studio 2017\Projects\Cpp_Win32_Consola_Arduino\Cpp_Win32_Consola_Arduino\SerialClass.cpp    9   

Se soluciona aquí.

Hay que ir arriba en la barra. Proyecto --> Propiedades. Se abre una ventana que dice: "Páginas de propiedades". En la pestaña General --> Juego de caracteres --> """"Utilizar juego de caracteres multibyte"""".

Los dejo aquí por si lo necesitan. ;)
#447
Hola:

Quiero usar e instalar esta librería para Visual C++, concretamente Visual Studio Community 2017.
https://github.com/Gmatarrubia/LibreriasTutoriales

Su código es este:
Código (cpp) [Seleccionar]
#include
#include
#include "SerialClass.h"
using namespace std;

void main () {
    Serial* Arduino = new Serial("COM7");


    while( Arduino->IsConnected() ){
        char palabra[] = "PalabraDelMundo";

        cout<<"Arduino conectado"<<endl;
       
        cout<<"Enviando :"<<palabra<<endl;
        Arduino->WriteData(palabra,sizeof(palabra)-1);

        Sleep(500);

        Arduino->ReadData(palabra,sizeof(palabra)-1);
        cout<<"Recibido: "<<palabra<<endl;
   
        cout<<"-------------------"<<endl;
        Sleep(1000);
    }


Creo un proyecto nuevo.




Me crea este código.


Añado las librerías com indica abajo.


Lo mismo para la hora y lo refleja, tanto en cpp como en h indicado abajo.


Como que no detecta la librería.


¿En que fallo?

Un cordial saludo.
#448
Hola:

No sabía ni me imaginaba un convertidos de C# a Java. He intslado ya las librerías del puerto RxTx, espero que lo haya hecho bien y funcione.

Cada vez que hago un ejemplo en Java, me aparece en NetBeans, esperaba ver un hola mundo como si fuera un CMD de Windows, es decir, la consola negra.

Hay que activarlo en Administrador, Java, en esta opción, activar consola.


Lo que tengo que descubrir.

Voy haber si hay otro convertidos y sino, paso a paso como se traduce. ;)

Saludos.
#449
Hola:

Quiero pasar este código de C# a Java con NetBeans.



Instalar Java actualizado:
https://www.java.com/es/download/

Compilador NetBeans (En español), Java SE:
https://netbeans.org/downloads/index.html

Tutorial sobre instalación del NetBeans y las librerías RxTx para controlar el puerto serie de Arduino:
https://es.slideshare.net/Metaconta2/interfaz-java-y-arduino

Librería oficial RxTx solo para 32 bits:
http://rxtx.qbang.org/wiki/index.php/Download

Librería alternativa RxTx de 32 y de 64 bits. Usaremos 64 bits. (Recomendado):
http://jlog.org/rxtx-win.html

El código de C# es este aquí abajo.
Código (csharp) [Seleccionar]
using System;
using System.Text;
using System.IO.Ports;
using System.IO;
using System.Diagnostics;
using System.Threading;

namespace Recibir_archivo_desde_Arduino_consola_06
{
    class Program
    {
        static int cantidadBytes;
        static StringBuilder sb = new StringBuilder();

        static void Main(string[] args)
        {
            string COM = "";
            // Título de la ventana.
            Console.Title = "Recoger foto desde Arduino y crearlo en el disco duro";

            // Tamaño ventana consola.
            Console.WindowWidth = 55; // X. Ancho.
            Console.WindowHeight = 18; // Y. Alto.
           

            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
            SerialPort Puerto_serie = new SerialPort();

            // Configuración.
            Console.Write(@"
Introduzca un número para seleccionar puerto COM.
Por ejemplo el 4, sería COM4.

Puerto: ");
            COM = Console.ReadLine(); // Escribir el número del puerto.
            Console.Clear();

            Puerto_serie.PortName = "COM" + COM; // Número del puerto serie.


            Puerto_serie.BaudRate = 115200; // Baudios. 115200.
            Puerto_serie.Parity = Parity.None; // Paridad.
            Puerto_serie.DataBits = 8; // Bits de datos.
            Puerto_serie.StopBits = StopBits.One; // Bits de parada.
            Puerto_serie.Handshake = Handshake.None; // Control de flujo.

            // Establecer la lectura / escritura de los tiempos de espera.
            Puerto_serie.ReadTimeout = -1; // 500.
            Puerto_serie.WriteTimeout = -1; // 500.

            try
            {
                Puerto_serie.Open(); // Abrir el puerto serie.
            }

            catch (IOException)
            {
                Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo.
                Console.CursorVisible = false;
                Console.SetCursorPosition(16, 6);
                Console.WriteLine(@"El puerto " + Puerto_serie.PortName + @" no existe
                o no lo encuentra.");
                Console.ReadKey(); // Pulse cualquier tecla para salir.
            }

            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine(e);
            }
            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            Console.WriteLine("Esperando datos desde Arduino... \n");
            Console.ReadKey();
            Puerto_serie.Close(); // Cerrar puerto.
        }

        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                SerialPort sp = (SerialPort)sender;
                string indata = sp.ReadExisting();
                string[] data = indata.Split('A');
                cantidadBytes = int.Parse(data[0]);


                switch (data[1].ToString())
                {
                    case "1":
                        Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes.");
                        Console.WriteLine("Foto: " + data[1] + ". Tipo de archivo: JPG");
                        break;

                    case "2":
                        Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes.");
                        Console.WriteLine("Foto: " + data[1] + ". Tipo de archivo: PNG.");
                        break;

                    default:
                        Console.WriteLine("Cosas raras en 'data': " + data.ToString()); // Por si hal algún error.
                        break;
                }

                int contador = 0;
                byte[] datosArray = new byte[cantidadBytes];

                switch (indata)
                {
                    case "17729A1":
                        Thread.Sleep(100); // Retardo.
                        byte[] miBuffer = Encoding.ASCII.GetBytes("OK1"); // Codificación ASCII.
                        sp.Write(miBuffer, 0, miBuffer.Length); // Envía OK1 al puerto serie.
                        break;

                    case "2065A2":
                        Thread.Sleep(100); // Retardo.
                        byte[] miBuffer2 = Encoding.ASCII.GetBytes("OK2"); // Codificación ASCII.
                        sp.Write(miBuffer2, 0, miBuffer2.Length); // Envía OK2 al puerto serie.
                        break;

                    default:
                        Console.WriteLine("Cosas raras en 'indata': " + indata.ToString()); // Por si hal algún error.
                        break;
                }

                while (true)
                {

                    contador += sp.Read(datosArray, contador, datosArray.Length - contador);

                    Console.SetCursorPosition(10, 6);
                    Console.Write("Datos recibidos:  {0}", contador + " Bytes.");
                    Console.WriteLine("                   ");

                    if ((contador == cantidadBytes) && (contador == 17729))
                    {
                        Mensaje1();
                        File.WriteAllBytes("fotón.jpg", datosArray); // Crear archivo en el disco duro.
                        Mensaje2();
                        Process.Start("fotón.jpg"); // Ejecutar visualizador de imágenes.
                        Mensaje3();
                        break; // Garantiza que el ciclo termine.
                    }

                    if ((contador == cantidadBytes) && (contador == 2065))
                    {
                        Mensaje1();
                        File.WriteAllBytes("fotón.png", datosArray); // Crear archivo en el disco duro.
                        Mensaje2();
                        Process.Start("fotón.png"); // Ejecutar visualizador de imágenes.
                        Mensaje3();
                        break; // Garantiza que el ciclo termine.
                    }
                }

                void Mensaje1()
                {
                    Console.WriteLine();
                    Console.WriteLine("Creando archivo al disco duro...");
                }

                void Mensaje2()
                {
                    Console.WriteLine();
                    Console.WriteLine("Archivo creado. Ejecutando imagen.");
                }

                void Mensaje3()
                {
                    Console.WriteLine();
                    Console.WriteLine("Imagen ejecutada.");
                    Console.WriteLine();
                    Console.WriteLine("Cabecera recibida: " + indata + "\n");
                    Console.ForegroundColor = ConsoleColor.Yellow; // Letras amarillas.
                    Console.WriteLine("FIN DE PROGRAMA.");
                    Console.ForegroundColor = ConsoleColor.Gray; // Letras grises otra vez.
                }
            }

            catch (FormatException)
            {
                // System.FormatException: 'La cadena de entrada no tiene el formato correcto.'
            }
        }
    }
}


En estos momentos estoy instalando la librería RxTx de 64 bits para Windwos 10 de 64 bits que es el que uso actualmente. El código de C# arriba fucniona de maravilla.

Esto de Java para adaptarme tardaré una eternidad, al menos se que el Hola mundo es Console.WriteLine("Hola mundo"); de C# es el equivalente a System.out.println("Hola mundo"); de Java.

Cualquier ayuda es bienvenida.
#450
Hola:

Quiero cerrar y abrir la bandeja del lector de DVD con el botón manualmente, y que lo sepa C#. Estoy usando Visual Studio Community 2017.

En otro momento hicimos desde C#, controlar la bandeja abrirla y cerrarla pulsando los botones como indica en la interfaz de abajo.



Código fuente sencillo de C#:
Código (csharp) [Seleccionar]
using System;
using System.Runtime.InteropServices; // No olvidar.
using System.Text;
using System.Windows.Forms;

namespace Lector_discos_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("winmm.dll")]
        public static extern Int32 mciSendString(string lpstrCommand, StringBuilder lpstrReturnString,
            int uReturnLength, IntPtr hwndCallback);
       
        StringBuilder rt = new StringBuilder(127);

        private void button_Abrir_Click(object sender, EventArgs e)
        {
            label_Mensaje.Text = "Abriendo...";
            Application.DoEvents();
            mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero);
            label_Mensaje.Text = "Abierto";
        }

        private void button_Cerrar_Click(object sender, EventArgs e)
        {
            label_Mensaje.Text = "Cerrando...";
            Application.DoEvents();
            mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero);
            label_Mensaje.Text = "Cerrado";
        }
    }
}


Hasta aquí todo bien.

Ahora quiero hacer, saber antes que nada, si es posible que al meter la bandeja con la mano o pulsar el botón físicamente del lector, C# puede saber su estado, cunado está abierto y cuando está cerrado.

En este caso, no hay botones para Windows Form de C#, solo un label que indica el estado "ABIERTO" y "CERRADO".

¿Es posible hacerlo?

Si es así. ¿Cómo se hace?

Lo único que pensé que este enlace valdría la pena o te daba información, pero es otra cosa.

Que tengan buena semana. ;)