Resultados da busca - %E3%80%90%E2%94%83%E5%B8%82%E5%9C%BA%E9%83%A82%E2%92%8F7%E2%92%8F01705%5B%E6%89%A3%5D%E3%80%91%E3%80%91%E6%81%92%E8%BE%BE%E5%BD%A9%E7%A5%A8%E5%B9%B3%E5%8F%B0%E5%AE%98%E6%96%B9%E7%BD%91%E7%AB%99
cas Auxiliares ---#include <LiquidCrystal.h> //Biblioteca para o display LCD
// --- Mapeamento de Hardware ---#define butUp 10 //Botão para selecionar tela acima no digital 12//#define butDown 11 //Botão para selecionar tela abaixo no digital 11#define butP 9 //Botão de ajuste mais no digital 10#define butM 8 //Botão de ajuste menos no digital 9#define Lamp1 A0 //Saída para lâmpada 1 no A0 (será usado como digital)#define Lamp2 A1 //Saída para lâmpada 2 no A1 (será usado como digital)#define sensor A3 //define o pino do sensor (que será usado para ler o sensor)
const int sensoragua = 2; //ler sinal do sensor Temperaturafloat valorsensor = 0.0;float ValorTempMax = -150,ValorTempMin = 300; //valor ue vai receber int val= 0;
// --- Protótipo das Funções Auxiliares ---void changeMenu(); //Função para modificar o menu atualvoid dispMenu(); //Função para mostrar o menu atualvoid sonda_lambda(); //Função do menu1, data e horavoid temperatura_agua(); //Função do menu2, temperaturavoid lights(); //Função do menu3, acionamento de lampadasvoid temperatura_ar(); //Função do menu4
// --- Variáveis Globais ---char menu = 0x01; //Variável para selecionar o menuchar set1 = 0x00, set2 = 0x00; //Controle das lâmpadasboolean t_butUp, t_butDown, t_butP, t_butM; //Flags para armazenar o estado dos botõesconst int valorsensoragua = 0;// --- Hardware do LCD ---LiquidCrystal disp(12, //RS no digital 7 11, //EN no digital 6 5, //D4 no digital 5 4, //D5 no digital 4 3, //D6 no digital 3 2); //D7 no digital 2
// --- Configurações Iniciais ---void setup(){ disp.begin(16,2); //Inicializa LCD 16 x 2 for(char i=7; i<10; i++) pinMode(i, INPUT_PULLUP); //Entrada para os botões (digitais 9 a 12) com pull-ups internos pinMode(Lamp1, OUTPUT); //Configura saída para lâmpada 1 pinMode(Lamp2, OUTPUT); //Configura saída para lâmpara 2 t_butUp = 0x00; //limpa flag do botão Up //t_butDown = 0x00; //limpa flag do botão Down t_butP = 0x00; //limpa flag do botão P t_butM = 0x00; //limpa flag do botão M digitalWrite(Lamp1, LOW); //Lâmpada 1 inicia apagada digitalWrite(Lamp2, LOW); //Lâmpada 2 inicia apagada
} //end setup
// --- Loop Infinito ---void loop(){ changeMenu(); dispMenu();
} //end loop
// --- Desenvolvimento das Funções Auxiliares ---void changeMenu() //Modifica o menu atual{ if(!digitalRead(butUp)) t_butUp = 0x01; //Botão Up pressionado? Seta flag // if(!digitalRead(butDown)) t_butDown = 0x01; //Botão Down pressionado? Seta flag if(digitalRead(butUp) && t_butUp) //Botão Up solto e flag setada? { //Sim... t_butUp = 0x00; //Limpa flag disp.clear(); //Limpa display menu++; //Incrementa menu if(menu > 0x04) menu = 0x01; //Se menu maior que 4, volta a ser 1 } //end butUp /* if(digitalRead(butDown) && t_butDown) //Botão Down solto e flag setada? { //Sim... t_butDown = 0x00; //Limpa flag disp.clear(); //Limpa display menu--; //Decrementa menu if(menu < 0x01) menu = 0x04; //Se menu menor que 1, volta a ser 4 } //end butDown */
} //end changeMenu
void dispMenu() //Mostra o menu atual{ switch(menu) //Controle da variável menu { case 0x01: //Caso 1 sonda_lambda(); //Chama a função de relógio break; //break case 0x02: //Caso 2 temperatura_agua(); //Chama a função do termômetro break; //break case 0x03: //Caso 3 lights(); //Chama função para acionamento de lâmpadas break; //break case 0x04: //Caso 4 temperatura_ar(); //Chama função para o menu4 break; //break } //end switch menu
} //end dispMenu
void sonda_lambda() //Data e Hora (menu1){ disp.setCursor(2,0); //Posiciona cursor na coluna 1, linha 1 disp.print("Sonda Lambda"); //Imprime mensagem disp.setCursor(6,1); //Posiciona cursor na coluna 1, linha 2 // Desenvolver uma função de data e hora... disp.print("0.89"); //Mostrador (apenas ilustrativo......)
} //end Sonda
void temperatura_agua() //Temperatura (menu2){ val = analogRead(sensoragua); valorsensor = (val * 358.0)/1024; Serial.println(valorsensor);
disp.setCursor(3,0); //Posiciona cursor na coluna 1, linha 1 disp.print("Temp: Agua"); //Imprime mensagem disp.setCursor(0,1); //Posiciona cursor na coluna 2, linha 2
if (valorsensor > ValorTempMax){ ValorTempMax = valorsensor; } disp.setCursor(0,1); disp.print(valorsensor); disp.write(B11011111); //disp.print(" C "); disp.setCursor(11,1); disp.print(ValorTempMax); disp.write(B11011111);
if (valorsensor >= 27)
{ digitalWrite (A3,HIGH); }
else if (valorsensor <= 25 ) { digitalWrite (A3,LOW); }
// Desenvolver uma função de data e hora... //Mostrador (apenas ilustrativo......)
// disp.print(valorsensor); //disp.write(B11011111); //disp.setCursor(11,1);
delay (1000);
} //end temperatura() void lights() //Acionamento de lâmpadas (menu3){ disp.setCursor(0,0); //Posiciona cursor na coluna 1, linha 1 disp.print("Acionar Lampadas"); //Imprime mensagem do menu 3 if(!digitalRead(butP)) t_butP = 0x01; //Botão P pressionado? Seta flag if(!digitalRead(butM)) t_butM = 0x01; //Botão M pressionado? Seta flag if(digitalRead(butP) && t_butP) //Botão P solto e flag setada? { //Sim... t_butP = 0x00; //Limpa flag set1++; //Incrementa set1 if(set1 > 2) set1 = 0x01; //Se maior que 2, volta a ser 1 switch(set1) //Controle do set1 { case 0x01: //Caso 1 disp.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2 disp.print("L1 on "); //Imprime mensagem digitalWrite(Lamp1, HIGH); //Liga lâmpada 1 break; //Break case 0x02: //Caso 2 disp.setCursor(0,1); //Posiciona cursor na coluna 1, linha 2 disp.print("L1 off"); //Imprime mensagem digitalWrite(Lamp1, LOW); //Desliga lâmpada 1 break; //Break } //end switch set1 } //end butP if(digitalRead(butM) && t_butM) //Botão D solto e flag setada? { //Sim... t_butM = 0x00; //Limpa flag set2++; //Incrementa set2 if(set2 > 2) set2 = 0x01; //Se maior que 2, volta a ser 1 switch(set2) //Controle do set2 { case 0x01: //Caso 1 disp.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2 disp.print("L2 on "); //Imprime mensagem digitalWrite(Lamp2, HIGH); //Liga lâmpada 2 break; //Break case 0x02: //Caso 2 disp.setCursor(8,1); //Posiciona cursor na coluna 8, linha 2 disp.print("L2 off"); //Imprime mensagem digitalWrite(Lamp2, LOW); //Liga lâmpada 1 break; //Break } //end switch set1 } //end butM
} //end lights
void temperatura_ar() //Função genérica para um quarto menu...{ disp.setCursor(3,0); //Posiciona cursor na coluna 1, linha 1 disp.print("Temp: AR "); //Imprime mensagem disp.setCursor(4,1); //Posiciona cursor na coluna 8, linha 2 // Desenvolver uma função de data e hora... disp.print("30 graus"); //Créditos
} //end menu4
//pode-se implementar quantos menus quiser //............
Então ele funciona perfeitamente, só que quando mudo o menu (a função para acender o led não funciona).
Quando está acesa ela não apaga e quando está desligada ela não acende, o que ta de errado no codigo ai, vc poderia me umas dicas.
…
OPROTECT,NOBROWNOUT#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,errors,stream=pc)void verificacao(){ char est1,est2,est3,est4,est5; //Estado da Sala if(!input(pin_b0)) est1 ='Q'; else est1 ='q'; //Estado do Quarto if(!input(pin_b1)) est2 ='Z'; else est2 ='z'; //Estado da Cozinha if(!input(pin_b2)) est3 ='S'; else est3 ='s'; //Estado da Panela if(!input(pin_b3)) est4 ='E'; else est4 ='e'; //Estado do Abajur if(!input(pin_b4)) est5 ='C'; else est5 ='c'; //Imprimindo a Resposta fprintf(pc,"%c%c%c%c%c\n\r",est1,est2,est3,est4,est5); delay_ms(150);}void main (void){ char dir; //variaveis de controle das lampadas int a0,a1,a2,a3,opc; //variaveis de controle dos motores e switch-case //Inicializa��o das Variveis a0=a1=a2=a3=opc=0; while(true){ while(!kbhit()); //aguarda at� que seja recebido um dado na porta serial dir=getc(); //armazena em c o caracter recebido na porta serial //SALA if (dir == 'q') //Liga a Sala opc=1; else if (dir == 'Q') // Desliga a Sala opc=2; //QUARTO if (dir == 'z') //Liga o Quarto opc=3; else if (dir == 'Z') // Desliga o Quarto opc=4; //COZINHA if (dir == 's') //Liga a Cozinha opc=5; else if (dir == 'S') // Desliga a Cozinha opc=6; //PANELA if (dir == 'e') //Liga a Panela opc=7; else if (dir == 'E') // Desliga a Panela opc=8; //Abajur if(dir == 'c') //Liga o Abajur opc=9; else if (dir == 'C') // Desliga o Abajur opc=10; //Tabela de verifica��o else if (dir == 'p') opc=12; switch(opc) { case 1: //Liga SALA output_high(pin_b0); delay_ms(100); verificacao(); break; case 2: //Desliga SALA output_low(pin_b0); delay_ms(100); verificacao(); break; case 3: //Liga Quarto output_high(pin_b1); delay_ms(100); verificacao(); break; case 4: //Desliga Quarto output_low(pin_b1); delay_ms(100); verificacao(); break; case 5: //Liga Cozinha output_high(pin_b2); delay_ms(100); verificacao(); break; case 6: //Desliga Cozinha output_low(pin_b2); delay_ms(100); verificacao(); break; case 7: //Liga Panela output_high(pin_b3); delay_ms(100); verificacao(); break; case 8: //Desliga Panela output_low(pin_b3); delay_ms(100); verificacao(); break; case 9: //Liga Abajur output_high(pin_b4); delay_ms(100); verificacao(); break; case 10: //Desliga Abajur output_low(pin_b4); delay_ms(100); verificacao(); break; case 12: delay_ms(100); verificacao(); delay_ms(100); break; } //Fim do Switch-case } // Fim do While True}//Fim do Void"No compilador do Windows está funcionando perfeitamente, só quando tento compilar pelo Linux retorna o seguinte erro:will@will-laptop:~/Área de trabalho$ sdcc --debug -mpic14 -p16f877a Serial.cSerial.c:2:20: error: 16f877.h: No such file or directorySerial.c:3:2: error: invalid preprocessing directive #useSerial.c:4:2: error: invalid preprocessing directive #fusesSerial.c:5:2: error: invalid preprocessing directive #useSerial.c:12: warning 112: function 'input' implicit declarationSerial.c:18: warning 112: function 'input' implicit declarationSerial.c:24: warning 112: function 'input' implicit declarationSerial.c:30: warning 112: function 'input' implicit declarationSerial.c:36: warning 112: function 'input' implicit declarationSerial.c:44: warning 112: function 'fprintf' implicit declarationSerial.c:46: warning 112: function 'delay_ms' implicit declarationSerial.c:12: error 101: too many parameters Serial.c:18: error 101: too many parameters Serial.c:24: error 101: too many parameters Serial.c:30: error 101: too many parameters Serial.c:36: error 101: too many parameters Serial.c:44: error 101: too many parameters Serial.c:46: error 101: too many parameters Serial.c:62: warning 112: function 'kbhit' implicit declarationSerial.c:63: warning 112: function 'getc' implicit declarationSerial.c:104: warning 112: function 'output_high' implicit declarationSerial.c:105: warning 112: function 'delay_ms' implicit declarationSerial.c:110: warning 112: function 'output_low' implicit declarationSerial.c:111: warning 112: function 'delay_ms' implicit declarationSerial.c:116: warning 112: function 'output_high' implicit declarationSerial.c:117: warning 112: function 'delay_ms' implicit declarationSerial.c:122: warning 112: function 'output_low' implicit declarationSerial.c:123: warning 112: function 'delay_ms' implicit declarationSerial.c:128: warning 112: function 'output_high' implicit declarationSerial.c:129: warning 112: function 'delay_ms' implicit declarationSerial.c:134: warning 112: function 'output_low' implicit declarationSerial.c:135: warning 112: function 'delay_ms' implicit declarationSerial.c:140: warning 112: function 'output_high' implicit declarationSerial.c:141: warning 112: function 'delay_ms' implicit declarationSerial.c:146: warning 112: function 'output_low' implicit declarationSerial.c:147: warning 112: function 'delay_ms' implicit declarationSerial.c:152: warning 112: function 'output_high' implicit declarationSerial.c:153: warning 112: function 'delay_ms' implicit declarationSerial.c:158: warning 112: function 'output_low' implicit declarationSerial.c:159: warning 112: function 'delay_ms' implicit declarationSerial.c:166: warning 112: function 'delay_ms' implicit declarationSerial.c:168: warning 112: function 'delay_ms' implicit declarationSerial.c:60: error 20: Undefined identifier 'true'Serial.c:104: error 101: too many parameters Serial.c:105: error 101: too many parameters Serial.c:110: error 101: too many parameters Serial.c:111: error 101: too many parameters Serial.c:116: error 101: too many parameters Serial.c:117: error 101: too many parameters Serial.c:122: error 101: too many parameters Serial.c:123: error 101: too many parameters Serial.c:128: error 101: too many parameters Serial.c:129: error 101: too many parameters Serial.c:134: error 101: too many parameters Serial.c:135: error 101: too many parameters Serial.c:140: error 101: too many parameters Serial.c:141: error 101: too many parameters Serial.c:146: error 101: too many parameters Serial.c:147: error 101: too many parameters Serial.c:152: error 101: too many parameters Serial.c:153: error 101: too many parameters Serial.c:158: error 101: too many parameters Serial.c:159: error 101: too many parameters Serial.c:166: error 101: too many parameters Serial.c:168: error 101: too many parameters Já procurei alguns exemplos e nada de conseguir fazer funcionar, alguma sugestão??…
Adicionado por William Lima para PIC ao 20:51 em 19 junho 2012
um modulo, que esta ligado ao motor.
O Primeiro código, é apenas um contador, que se der para adaptar esse, eu não precisaria mudar os outros abaixo.
Esse código abaixo, ele apresenta apenas no monitor serial, o numero de pulsos, que no meu caso, ( mas vou modificar para apenas um pulso por volta ) são 4 pulsos, se eu puder modificar esse código, para que o motor pare em 700 voltas, ele teria que parar o motor, 2800 pulsos.( sendo 4 pulsos ) é isso que eu preciso fazer, como faze-lo parar, quando o monitor serial apresentar 2800 pulsos?
CODIGO 1 - contador de pulsos
boolean anterior = 0;
boolean actual = 0;
int contador = 0;
void setup()
{
Serial.begin(9600);
pinMode(2,INPUT);
}
boolean debounce(boolean dato_anterior)
{
boolean dato_actual = digitalRead(2);
if (dato_anterior != dato_actual)
{
delay(10);
dato_actual = digitalRead(2);
}
return dato_actual;
}
void loop()
{
actual = debounce(anterior);
if ( anterior == 0 && actual == 1)
{
contador++;
delay (100);
Serial.println(contador);
}
anterior = actual;
}
Esse código abaixo, é do Rui, daqui do fórum, ele foi muito gentil e o fez para mim, mas tenho que acrescentar o relé. O motor vai diminuindo aos poucos a velocidade ate parar, mas tenho duvidas.
Onde conectar o Relé? e testei o código sem o rele, e era para o motor ir diminuindo a velocidade, mas isso não aconteceu,
CODIGO 2 - do Rui com Relé
//Programa: Sensor de velocidade Arduino LM393
//http://www.arduinoecia.com.br/2016/02/sensor-de-velocidade-lm393-arduino.html
//Autor: Arduino e Cia Modificado por Rui
#define sensor 2 //Pino ligado ao pino D0 do sensor
#define motor 6 //Pino de saída para controle do motor ( nao ligar ditero no motor, use driver)
#define rele 7 //Pino de saída para o rele
volatile byte pulsos = 0;
unsigned int pulsos_por_volta = 63; //Altere o numero abaixo de acordo com o seu disco encoder
unsigned int voltas = 12; //Numero de voltas
unsigned int Fase = 0;
//------------------------------
void contador()
{
pulsos++; //Incrementa contador
}
//------------------------------
void setup()
{
Serial.begin(9600);
pinMode(motor, OUTPUT); //Pino do motor como saida (PWM)
pinMode(rele, OUTPUT); //Pino do rele HIGH desligado LOW ligado
pinMode(sensor, INPUT); //Pino do sensor como entrada
attachInterrupt(0, contador, FALLING); //Interrupcao 0 - pino digital 2 Aciona o contador a cada pulso
}
//------------------------------
void loop()
{
Fase = (pulsos / pulsos_por_volta); //Calculo de voltas
if (Fase >= 6) //Se faltam + q 6 voltas
{
digitalWrite(rele, HIGH); //Libera o motor
analogWrite(motor, 255); //Velocidade máxima
}
if (Fase < 6 & Fase > 3) //Se faltam 6 voltas
{
digitalWrite(rele, HIGH); //Libera o motor
analogWrite(motor, 127); //Reduz Velocidade para 1/2
}
if (Fase < 3) //Se faltam 3 voltas
{
digitalWrite(rele, HIGH); //Libera o motor
analogWrite(motor, 63); //Reduz Velocidade para 1/4
}
if (F
ase = 0) //Se terminaram as voltas
{
digitalWrite(rele, LOW); //Freia o motor
}
}
E Por fim, vem o código 3, que peguei de um tutorial de uma Bobinadora, no tutorial, ele dá poucas explicações,
#include AQUI eu preciso mudar para i2c, isso eu fiz
#include Esse LCDKeypad é um modulo, e eu tenho que trocar por um LCD que ja vem com o i2c, tenho que trocar os nomes? mas esse modulo vem com botões, ai preciso implementar os botões separados, como?
#define MODE_MENU 0 - Aqui o 0 é a porta A0 ? seria um botão?
#define MODE_WIND 1 - Aqui, é mais um botão que eu teria que implementar? como localizar e ele no restante do programa.?
#define PIN_MOTOR 2 - Aqui o A2 é a porta? seria + um botão?
#define PIN_SENSOR 3 - Aqui o A3 + um botão? esse é do ENCODER
#define INTER_SENSOR 1 - E esse, é mais um encoder, pois ele colocou dois, um do lado do outro.
MAS, não adianta aquele amigo daqui, me diga, faça isso ou aquilo, eu preciso que alguem modifique o codigo e me entregue ele pronto, talvez eu saiba modificar, talvez não.
CODIGO 3 - Bobinadora
#include
#include
#define MODE_MENU 0
#define MODE_WIND 1
#define PIN_MOTOR 2
#define PIN_SENSOR 3
#define INTER_SENSOR 1
#define MAX_SPEED 255
#define MIN_SPEED 127
#define SPEED_RANGE (MAX_SPEED - MIN_SPEED)
/** should have been 8 but 3 works ?? **/
#define TICKS_PER_REV 3
LCDKeypad lcd;
int numberOfWindings = 100;
int windingsLeft = 0;
int decimal = 1;
int ticks = 0;
char speed = 125;
int mode = MODE_MENU;
/**
* react on coil revolution
*/
void pinChangeInt() {
if (mode == MODE_WIND) {
ticks++;
if (ticks == TICKS_PER_REV) {
windingsLeft--;
ticks = 0;
if (windingsLeft == 0) {
lcd.clear();
digitalWrite(PIN_MOTOR, LOW);
mode = MODE_MENU;
speed = 0;
}
}
}
}
/**
* wait until button has been pressed
* returns the button number
*/
int waitButton(){
int buttonPressed;
lcd.blink();
while(lcd.button()!=KEYPAD_NONE); // wait for button release
delay(50);
while((buttonPressed=lcd.button())==KEYPAD_NONE); // wait for button hit
delay(50);
lcd.noBlink();
while(lcd.button()!=KEYPAD_NONE); // and wait until released again
return buttonPressed;
}
/**
* make digits from decimal places
*/
void makeDigits(int number, int *m, int *c, int *x, int *i) {
int a = number;
(*m) = a / 1000;
a = a % 1000;
(*c) = a / 100;
a = a % 100;
(*x) = a / 10;
a = a % 10;
(*i) = a;
}
/**
* fazer uma série de quatro casas decimais
*/
void makeNumber(int *number, int m, int c, int x, int i) {
(*number) = 1000 * m + 100 * c + 10 * x + i;
}
/**
* increment a digit until it's zero
*/
void incDigit(int *x, int max) {
int m = *x;
m ++;
if (m > max) {
m = max;
}
(*x) = m;
}
/**
* decrement a digit until it's zero
*/
void decDigit(int *x) {
int m = *x;
m --;
if (m < 0) {
m = 0;
}
(*x) = m;
}
/**
* increment the number at position "decimals"
*/
void incWindings(int decimals) {
int m, c, x, i;
makeDigits(numberOfWindings, &m, &c, &x, &i);
switch (decimals) {
case 3:
incDigit(&m, 9);
break;
case 2:
incDigit(&c, 9);
break;
case 1:
incDigit(&x, 9);
break;
case 0:
incDigit(&i, 9);
break;
default:
break;
}
makeNumber(&numberOfWindings, m, c, x, i);
}
/**
* decrement the number at position "decimals"
*/
void decWindings(int decimals) {
int m, c, x, i;
makeDigits(numberOfWindings, &m, &c, &x, &i);
switch (decimals) {
case 3:
decDigit(&m);
break;
case 2:
decDigit(&c);
break;
case 1:
decDigit(&x);
break;
case 0:
decDigit(&i);
break;
default:
break;
}
makeNumber(&numberOfWindings, m, c, x, i);
}
/*
* setup the system
*/
void setup() {
// show splash
lcd.begin(16,2);
lcd.clear();
lcd.print("TecDroiD's");
lcd.setCursor(0,1);
lcd.print(" Coil Winder");
// setup sensor pin
pinMode(PIN_SENSOR, INPUT);
attachInterrupt(INTER_SENSOR, pinChangeInt, RISING);
// setup motor pin
pinMode(PIN_MOTOR, OUTPUT);
//analogWrite(PIN_MOTOR,0);
digitalWrite(PIN_MOTOR, LOW);
// delay splash and clear
delay(1000);
lcd.clear();
}
void show_number(int number) {
int m,c,x,i;
makeDigits(number, &m, &c, &x, &i);
lcd.print(m,DEC);
lcd.print(c,DEC);
lcd.print(x,DEC);
lcd.print(i,DEC);
}
/**
* menu para selecionar os enrolamentos da bobina
*/
void loop_menu() {
// int m,c,x,i;
int buttonPressed;
/* show text */
lcd.setCursor(0,0);
lcd.print("Windings: ");
/* show number of windings */
lcd.setCursor(0,1);
show_number(numberOfWindings);
lcd.setCursor(3-decimal,1);
lcd.cursor();
buttonPressed = waitButton();
switch(buttonPressed) {
case KEYPAD_SELECT:
windingsLeft = numberOfWindings;
mode = MODE_WIND;
lcd.clear();
break;
case KEYPAD_LEFT:
incDigit(&decimal, 3);
break;
case KEYPAD_RIGHT:
decDigit(&decimal);
break;
case KEYPAD_UP:
/* number increase */
incWindings(decimal);
break;
case KEYPAD_DOWN:
decWindings(decimal);
break;
default:
break;
}
}
/**
* wind the coil - enrolar a bobina
*/
void loop_wind() {
int buttonPressed;
/* set motor speed */
//analogWrite(PIN_MOTOR, speed);
digitalWrite(PIN_MOTOR,HIGH);
lcd.setCursor(0,0);
lcd.print("Windings: ");
lcd.print(numberOfWindings, DEC);
lcd.setCursor(0,1);
lcd.print("To Do: ");
show_number(windingsLeft);
//lcd.print(windingsLeft, DEC);
buttonPressed = lcd.button();
if (buttonPressed == KEYPAD_SELECT) {
lcd.clear();
digitalWrite(PIN_MOTOR, LOW);
mode = MODE_MENU;
}
}
/**
* Select looping mode
*/
void loop() {
switch(mode) {
case MODE_MENU:
loop_menu();
break;
case MODE_WIND:
loop_wind();
break;
default:
lcd.print("Mode ERROR!? ");
lcd.print(mode, DEC);
break;
}
}
enrolador de bobina automática - Abaixo, tem o link dos arquivos. Esse é o de cima.
por tecdroid , publicada 21 de março de 2016
http://www.thingiverse.com/thing:1431330
Muito obrigado…
de motor funciona depois que pára. Depois que pára, continua a ler as chaves e mostrar o lado e continua ver com o ultrassom, mas não decide / funciona qto aos motores. PS: custei pra acertar as posições das chaves e a rotina de zerar para reler.
Veja como ficou (agara vou copiar todo o sketch,ok?):
//--------------- Programa JABUTINO sketch 20140510 -----------#include <Servo.h>#include <AFMotor.h>
//Instancia o objeto referente aos motores DCAF_DCMotor motorEsquerdo(1); //Motor esquerdo na conexão "M1"AF_DCMotor motorDireito(2); //Motor direito na conexão "M2"
//Definições de velocidade em PWM de 0 a 255const char VEL_MAX = 255;const char VEL_MIN = 0;const char VEL_MED = 200;
//Pinos para controle do Ultrassom HC-SR04//usar as portas analógicas A0 e A1 como digitaisconst int pinoTrigger = 14; // A0 = 14const int pinoEcho = 15; // A1 = 15
//Servo MotorServo meuServo;const int pinoServo = 10; //o pino 10 é o pino de sinal da conexão "SERVO_2"
//Define as posições de calibragem do servo//Valores para conseguir um melhor alinhamento do servo, cada motor responde de forma diferente.//Os valores devem variar de 0 a 180 graus, ajuste de acordo com seu motor na tentativa e erro.
const int OLHA_ESQ = 180;const int OLHA_DIR = 0;const int OLHA_FRT = 90;
// Pino em que o BUZZER está conectado: const int pinoBuzzer = 9;
// PINOS que vão conectar as 2 CHAVES (sensores de colisão):const int ChaveE = 18;const int ChaveD = 19;
//Método obrigatório//Realiza as definições dos pinos e faz a inicialização da biblioteca de servo.
void setup(void){ // Inicializa os motores com velocidade máximamotorEsquerdo.setSpeed(VEL_MAX);motorDireito.setSpeed(VEL_MAX); //atribui os pinos do ultrassompinMode(pinoTrigger, OUTPUT);pinMode(pinoEcho, INPUT);
Serial.begin(9600); /* função provisória, para controle da rotina das chaves.*/ /* define os pinos como entrada ligando um resistor pullup a eles */pinMode(ChaveE, INPUT_PULLUP); // MUITO IMPORTANTEpinMode(ChaveD, INPUT_PULLUP);
//inicia o ServomeuServo.attach(pinoServo); //Coloca o servo virado para posicao frontalmeuServo.write(OLHA_FRT);
} // fim do setup//================================================//Corpo principal do programa, repete infinitamentevoid loop(){ // Inicia andando para frente
andarpFrente(VEL_MAX); int lerChaveE = LOW; // Garante que a chave Esq estará em LOW. int lerChaveD = LOW; // Garante que a chave Dir estará em LOW.
//Enquanto não encontrar um obstáculo a menos de 10cm while(medeDistancia() > 10) { // Lê a Chave Esquerda: int lerChaveE = digitalRead(ChaveE); int lerChaveD = digitalRead(ChaveD);
if (lerChaveE == HIGH) { Serial.println("Esquerda"); tone(pinoBuzzer, 840); //envia um sinal de 740Hz para o pino 9 delay(100); //aguarda 0,1 segundo noTone(pinoBuzzer); //interrompe o som no pino 9 girarpDireita(VEL_MED); delay(500); //aguarda 0,5 segundo } else // Lê chave Direita: if (lerChaveD == HIGH) { Serial.println("Direita"); tone(pinoBuzzer, 840); //envia um sinal de 840Hz para o pino 9 delay(100); //aguarda 0,1 segundo noTone(pinoBuzzer); //interrompe o som no pino 9 girarpEsquerda(VEL_MED); delay(500); //aguarda 0,5 segundo } delay(100); //Faz uma leitura da distancia a cada 0,1 segundo } //Se encontrou um obstáculo recua por 1 segundo e pára andarpTras(VEL_MED); delay(1000); pararMotores();
//Verifica qual lado tem maior distância até um obstáculo int esquerda = 0, direita = 0; meuServo.write(OLHA_ESQ); //vira o servo para a esquerda delay(500); //aguarda o servo completar o movimento esquerda = medeDistancia(); //mede a distância na esquerda meuServo.write(OLHA_DIR); //vira o servo para a direita delay(500); //aguarda o servo completar o movimento
direita = medeDistancia(); //mede a distância na direita meuServo.write(OLHA_FRT); //olha pra frente novamente delay(500); //aguarda o servo completar o movimento
if(esquerda > direita) /*se a distancia do obstáculo na esquerda for maior que na direita vira para esquerda */ { girarpEsquerda(VEL_MAX); } else /* se a distância do obstáculo na direita for maior ou igual que na esquerda vira para a direita */ { girarpDireita(VEL_MAX); } //Aguarda alguns instantes para o robô virar delay(500); //<< modifique esse tempo se desejar que ele vire por mais ou menos tempo // Fim da rotina de obstáculos // aguarda minimamente para eliminar ruídos das chaves: delay(5);
} // Fim do LOOP
//Utiliza o sensor de Ultrassom HC-SR04 para medir a distância em centímetros int medeDistancia() { //Garante que o pino de Trigger está LOW digitalWrite(pinoTrigger, LOW); delayMicroseconds(2); //cria um pulso de 5 microssegundos no Trigger digitalWrite(pinoTrigger, HIGH); delayMicroseconds(5); digitalWrite(pinoTrigger, LOW);
//aguarda o echo long microssegundos = pulseIn(pinoEcho, HIGH); // A velocidade do som é 340 m/s ou aproximadamente 29 microssegundos por centimetro. // O pulso faz uma viagem de ida e volta do sensor até o obstáculo // assim, para calcular a distancia temos que dividir esse tempo pela metade // desta forma... return int(microssegundos / 29 / 2); } // Fim do medeDistancia
// ======== void's dos motores: =============
//Gira as duas rodas para frente //Como os motores estão virados para lados opostos eles devem //girar em sentidos opostos para que as rodas girem na mesma direção void andarpFrente(char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(FORWARD); motorDireito.run(BACKWARD); }
//Gira as duas rodas para trás //Como os motores estão virados para lados opostos eles devem //girar em sentidos opostos para que as rodas girem na mesma direção void andarpTras(char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(BACKWARD); motorDireito.run(FORWARD); }
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpEsquerda (char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(BACKWARD); motorDireito.run(BACKWARD); }
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpDireita(char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(FORWARD); motorDireito.run(FORWARD); }
//Pára os motores definindo os dois pinos Enable em estado Low void pararMotores() { motorEsquerdo.run(RELEASE); motorDireito.run(RELEASE); }
…
upon: * Arduino Frequency Detection * created October 7, 2012 * by Amanda Ghassaei * * This code is in the public domain. */
//data storage variablesbyte newData = 0;byte prevData = 0;unsigned int time = 0;//keeps time and sends vales to store in timer[] occasionallyint timer[10];//storage for timing of eventsint slope[10];//storage for slope of eventsunsigned int totalTimer;//used to calculate periodunsigned int period;//storage for period of wavebyte index = 0;//current storage indexfloat frequency;//storage for frequency calculationsint maxSlope = 0;//used to calculate max slope as trigger pointint newSlope;//storage for incoming slope data
//variables for deciding whether you have a matchbyte noMatch = 0;//counts how many non-matches you've received to reset variables if it's been too longbyte slopeTol = 3;//slope tolerance- adjust this if you needint timerTol = 10;//timer tolerance- adjust this if you need
//variables for amp detectionunsigned int ampTimer = 0;byte maxAmp = 0;byte checkMaxAmp;byte ampThreshold = 20;//raise if you have a very noisy signal
//variables for tuningint correctFrequency;//the correct frequency for the string being played
void setup(){ Serial.begin(9600); //LED pins pinMode(7,OUTPUT); pinMode(6,OUTPUT); pinMode(5,OUTPUT); pinMode(4,OUTPUT); pinMode(3,OUTPUT); pinMode(2,OUTPUT); pinMode(A3,OUTPUT); pinMode(A4,OUTPUT); pinMode(A5,OUTPUT); pinMode(A1,OUTPUT); pinMode(A2,OUTPUT); pinMode(8,OUTPUT); pinMode(9,OUTPUT); //Beginning LED sequence digitalWrite(7,1); digitalWrite(6,1); digitalWrite(5,1); digitalWrite(4,1); digitalWrite(3,1); digitalWrite(2,1); digitalWrite(8,1); analogWrite(A1,255); delay(500); digitalWrite(9,1); analogWrite(A2,255); delay(500); digitalWrite(A5,255); analogWrite(A3,255); delay(500); analogWrite(A4,255); delay(500); cli();//disable interrupts //set up continuous sampling of analog pin 0 at 38.5kHz //clear ADCSRA and ADCSRB registers ADCSRA = 0; ADCSRB = 0; ADMUX |= (1 << REFS0); //set reference voltage ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz ADCSRA |= (1 << ADATE); //enabble auto trigger ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete ADCSRA |= (1 << ADEN); //enable ADC ADCSRA |= (1 << ADSC); //start ADC measurements sei();//enable interrupts}
ISR(ADC_vect) {//when new ADC value ready PORTB &= B11101111;//set pin 12 low prevData = newData;//store previous value newData = ADCH;//get value from A0 if (prevData < 127 && newData >=127){//if increasing and crossing midpoint newSlope = newData - prevData;//calculate slope if (abs(newSlope-maxSlope)<slopeTol){//if slopes are == //record new data and reset time slope[index] = newSlope; timer[index] = time; time = 0; if (index == 0){//new max slope just reset PORTB |= B00010000;//set pin 12 high noMatch = 0; index++;//increment index } else if (abs(timer[0]-timer[index])<timerTol && abs(slope[0]-newSlope)<slopeTol){//if timer duration and slopes match //sum timer values totalTimer = 0; for (byte i=0;i<index;i++){ totalTimer+=timer[i]; } period = totalTimer;//set period //reset new zero index values to compare with timer[0] = timer[index]; slope[0] = slope[index]; index = 1;//set index to 1 PORTB |= B00010000;//set pin 12 high noMatch = 0; } else{//crossing midpoint but not match index++;//increment index if (index > 9){ reset(); } } } else if (newSlope>maxSlope){//if new slope is much larger than max slope maxSlope = newSlope; time = 0;//reset clock noMatch = 0; index = 0;//reset index } else{//slope not steep enough noMatch++;//increment no match counter if (noMatch>9){ reset(); } } } time++;//increment timer at rate of 38.5kHz ampTimer++;//increment amplitude timer if (abs(127-ADCH)>maxAmp){ maxAmp = abs(127-ADCH); } if (ampTimer==1000){ ampTimer = 0; checkMaxAmp = maxAmp; maxAmp = 0; } }
void reset(){//clean out some variables index = 0;//reset index noMatch = 0;//reset match couner maxSlope = 0;//reset slope}
//Turn off 5 out the 6 LEDs for the guitar stringsvoid otherLEDsOff(int LED1, int LED2,int LED3,int LED4,int LED5){ digitalWrite(LED1,0); digitalWrite(LED2,0); digitalWrite(LED3,0); digitalWrite(LED4,0); digitalWrite(LED5,0);}
//Determine the correct frequency and light up //the appropriate LED for the string being played void stringCheck(){ if(frequency>70&frequency<90){ otherLEDsOff(2,3,5,6,7); digitalWrite(2,1); correctFrequency = 82.4; } if(frequency>100&frequency<120){ otherLEDsOff(2,3,4,5,6); digitalWrite(3,1); correctFrequency = 110; } if(frequency>135&frequency<155){ otherLEDsOff(2,3,4,6,7); digitalWrite(4,1); correctFrequency = 146.8; } if(frequency>186&frequency<205){ otherLEDsOff(2,3,5,6,7); digitalWrite(5,1); correctFrequency = 196; } if(frequency>235&frequency<255){ otherLEDsOff(2,4,5,6,7); digitalWrite(6,1); correctFrequency = 246.9; } if(frequency>320&frequency<340){ otherLEDsOff(3,4,5,6,7); digitalWrite(7,1); correctFrequency = 329.6; }}
//Compare the frequency input to the correct //frequency and light up the appropriate LEDSvoid frequencyCheck(){ if(frequency>correctFrequency+1){ analogWrite(A3,255); } if(frequency>correctFrequency+4){ analogWrite(A2,255); } if(frequency>correctFrequency+6){ analogWrite(A1,255); } if(frequency<correctFrequency-1){ analogWrite(A5,255); } if(frequency<correctFrequency-4){ digitalWrite(9,1); } if(frequency<correctFrequency-6){ digitalWrite(8,1); } if(frequency>correctFrequency-1&frequency<correctFrequency+1){ analogWrite(A4,255); }}
void allLEDsOff(){ digitalWrite(2,0); digitalWrite(3,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); digitalWrite(8,0); digitalWrite(9,0); analogWrite(A1,0); analogWrite(A2,0); analogWrite(A3,0); analogWrite(A4,0); analogWrite(A5,0);}
void loop(){ allLEDsOff(); if (checkMaxAmp>ampThreshold){ frequency = 38462/float(period);//calculate frequency timer rate/period } stringCheck(); frequencyCheck(); delay(100); }
…