Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed Adafruit_GFX DS1820
main.cpp
- Committer:
- daniferca
- Date:
- 2021-12-16
- Revision:
- 3:b05574b98b47
- Parent:
- 2:20c2d39d5902
- Child:
- 4:c691dac74f1b
File content as of revision 3:b05574b98b47:
#include "mbed.h"
#include "hcsr04.h"
#include "DS1820.h"
#include "Adafruit_SSD1306.h"
class I2CPreInit : public I2C
{
public:
I2CPreInit(PinName sda, PinName scl) : I2C(sda, scl)
{
frequency(100000);
start();
};
};
I2CPreInit gI2C(PB_9,PB_8);
Adafruit_SSD1306_I2c gOled(gI2C,NC,0x78,64,128);
Serial pc(USBTX, USBRX);
Ticker tickerMideDistancia;
unsigned distancia=20;
AnalogIn adc_temp(ADC_TEMP);
HCSR04 usensor(D7,D8); //(PinName TrigPin,PinName EchoPin):
DigitalIn finalDer(D2); //Final de carrera DERECHA
DigitalIn finalIzq(D3); //Final de carrera IZQUIERDA
DigitalIn boton(D5); //Boton para iniciar el programa seleccionado
DigitalIn switcher(D9); //Interruptor para indicar que programa usar
DigitalOut step(D13);
DigitalOut dir(D12);
DigitalOut enable(D11);
DigitalOut led(LED1);
DigitalOut myLed1 (D4); //Indicador programa Taladro seleccionado
DigitalOut myLed2 (D6); //Indicador programa Transportador de Piezas seleccionado
DS1820 ds1820(D10); //Substitute PA_9 with actual mbed pin name connected to the DS1820 data pin
float temp = 0;
int contador=0; //Contador de Piezas e Impactos del Taladro
int FUNCIONAR=0; //Variable que de comienzo al programa en funcion del boton
int x=0; //Variable abilitadora programa Transportador de Piezas, en funcion del interruptor
int y=0; //Variable abilitadora programa Taladro, en funcion del interruptor
Timer tiempo; //Temprizador para las acciones del taladro
enum estados {cerrada, abriendose, cerrandose, abierta};
estados estado;
void paso(int d)
{
dir=d;
step=1;
wait_us(100); // Cambio de paso
step=0;
wait_us(900); //Este hay que cambiar
}
void estadoCerrada()
{
if (x==1) { //Entrada al Transportador de Piezas
if((finalIzq == 1) && (FUNCIONAR==1) && contador==0) { //Inicio en funcion del Final de Carrera de la Izquierda y del Boton
wait(0.5); //Tiempo de espera para descargar la Pieza
enable=1;
estado=abriendose;
gOled.clearDisplay();
gOled.printf("Programa Transporte");
gOled.display();
gOled.setTextCursor(0,0);
}
else if (contador>0){
wait(0.5); //Tiempo de espera para descargar la Pieza
enable=1;
estado=abriendose;
}
}
if(y==1) { //Entrada al Taladro
if((finalIzq == 1) && (FUNCIONAR==1)) { //Inicio en funcion del Final de Carrera de la Izquierda y del Boton
enable=1;
estado=abriendose;
gOled.clearDisplay();
gOled.printf("Programa Taladro");
gOled.display();
gOled.setTextCursor(0,0);
}
else if (contador>0){ //Una vez se alcanza la posicion para taladrar, el contador es mayor de 0 y no parara/cumplira esta condicion hasta que al final del programa se iguale el contador a 0
estado=abriendose;
}
tiempo.reset();
tiempo.start();
}
}
void estadoAbriendose()
{
if(x==1) { //Entrada al Transportador de Piezas
if((finalDer==1)) {
estado=abierta;
enable=0;
}
else if (FUNCIONAR>1){
estado=abierta;
}
else {
gOled.clearDisplay();
paso(1);
}
}
if(y==1) { //Entrada al Taladro
if(tiempo.read() > 4 ){
contador++;
estado=abierta;
enable=0;
}
else if ((contador>0) && (tiempo.read() > 0.6)){
contador++;
estado=abierta;
enable=0;
}
else {
paso(1);
}
}
}
void estadoCerrandose()
{
if(x==1) { //Entrada al Transportador de Piezas
if(finalIzq==1 && contador<3 && FUNCIONAR==1) { //Bucle hasta hasta que el contador alcance 3
estado=cerrada;
enable=0;
}
else if ((finalIzq==1)&& contador>2) { //Cuando el contador alcance 3, se terminara el programa
estado = cerrada;
enable = 0;
contador=0;
FUNCIONAR=0;
}
else if ((finalIzq==1) && (FUNCIONAR>1)) { //
estado = cerrada;
enable = 0;
contador=0;
FUNCIONAR=0;
}
else { //Activar/Mantener movimiento
paso(0);
}
}
if (y==1){ //Entrada al Taladro
if((tiempo.read() > 0.6) && contador<7 ){ //Recorrido limitado por tiempo y contador(menor que 7) para taladro
estado=cerrada;
}
else if ((contador>6)&& (finalIzq==1)){ //Cuando el contador alcance 7 se pulse el final de carrera de la izquierda, se terminara el programa
estado = cerrada;
enable = 0;
contador=0;
FUNCIONAR=0;
}
else {
paso(0); //Activar/Mantener movimiento
}
}
}
void estadoAbierta()
{
if(x==1){ //Entrada al Transportador de Piezas
contador++; //Contador Piezas
gOled.clearDisplay();
gOled.printf("Piezas Transportadas = %d\n",contador);
gOled.display();
gOled.setTextCursor(0,0);
}
if (y==1){ //Entrada al Taladro
gOled.clearDisplay();
gOled.printf("Impactos Taladro = %d\n",contador);
gOled.printf("temp = %3.1f C\r\n", adc_temp.read()*100);
gOled.display();
gOled.setTextCursor(0,0);
pc.printf("ADC Temp = %f\n", (adc_temp.read()*100));
}
tiempo.reset();
tiempo.start();
enable=1;
estado=cerrandose;
}
//void estadoSEGURIDAD(){
// if(FUNCIONAR>1){
// if(finalIzq==1){
// FUNCIONAR==0;
// estado==cerrada;
// }
// else{
// contador==1000;
// paso(0);
// }
// }
// }
int main()
{
pc.baud(115200);
estado=cerrada;
gOled.begin();
gOled.clearDisplay();
gOled.printf("Hola\n");
gOled.display();
ds1820.begin();
ds1820.startConversion();
if (boton == 1){
FUNCIONAR=1;
}
if(x==1) {
gOled.clearDisplay();
gOled.printf("Programa: Transporte de Piezas\n");
gOled.display();
}
if(y==1) {
gOled.clearDisplay();
gOled.printf("Programa: Taladro\n");
gOled.display();
}
tiempo.reset();
pc.baud(115200);
while(1) {
if (switcher ==0){ //Programa Transportador de Piezas
y=0;
x=1;
myLed1=1;
myLed2=0;
}
else if (switcher==1){ //Programa Taladro
y=1;
x=0;
myLed1=0;
myLed2=1;
}
if (boton==1){
FUNCIONAR++;
}
switch ( estado ) {
case cerrada:
estadoCerrada();
break;
case abriendose:
estadoAbriendose();
break;
case abierta:
estadoAbierta();
break;
case cerrandose:
estadoCerrandose();
break;
//case SEGURIDAD:
// estadoSEGURIDAD();
// break;
default:
break;
}
}
}