Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.

solanocaiano

Membros Plenos
  • Total de itens

    23
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

0

Sobre solanocaiano

Informações gerais

  • Cidade e Estado
    Dourados/Mato grosso do sul
  • Sexo
    Masculino
  1. Arduino rogramação de MENU em uma chocadeira

    Ele está funcionando normal agora galera, ta mais ajeitado também
  2. Arduino rogramação de MENU em uma chocadeira

    Ah vou largar mão desse processo de choca, tenho nem ideia de como vou fazer isso e vai me dar mt trabalho... Vou deixar só os displays mesmo e talvez fazer uns modos de temperatura a partir de buttons, por exemplo.. Modo 1 set point com 37.5, modo 2 com set point para do dia 15-17 e modo 3 para temperatua pro final da eclosão.. Um problema que eu to tendo, é que com o arduino conectado ao computador via USB, quando eu carrego o código ele funciona normalmente.. Pelo ambiente de visualização o processing ele funciona normalmente quando eu inicio por ele. Porém já com o código já carregado no arduino, quando eu conecto e desconecto o cabo usb a programação não funciona corretamente, nem o PID acontece nem o Display liga! Alguem sabe porque isso pode ta acontecendo?
  3. Olá amigos, estou desenvolvendo uma chocadeira com PID via DIMMER PWM.. Eu estou conseguindo bons resultados. Mas meu nível de programação não permite eu desenvolver apenas uma parte do MENU.. Que seria criar um processo de choca, com o RTC contar os dias a partir do momento que a pessoa inicia o processo.. Um jeito de cancelar o processo atual para iniciar um novo! Eu fiz um menu com 4 buttons, um UP e DOWN responsável por navegar pelos menus, e dois que estão sem uso ainda, para o processo de choca. Menus: Mostrar data e hora (RTC), Temperatura (ds18b20), Umidade (DHT11) e "processo de choca" (não está pronto ainda), estão funcionando normalmente junto ao PID. Porque depois do décimo quinto dia de incubação, o ovo começa a produzir seu próprio calor, e eu gostaria de ir diminuindo o SET point de temperatura gradualmente ao longo de cada dia depois desse período. Ou seja, tem que ter uma lógica com os dias! // --- Bibliotecas Auxiliares --- #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Time.h> #include <DS3232RTC.h> #include <DHT.h> // --- Definições e Objetos --- #define butUp 12 //Botão para selecionar tela acima no digital 12 #define butDown 11 //Botão para selecionar tela abaixo no digital 11 #define butP 10 //Botão de ajuste mais no digital 10 #define butM 9 //Botão de ajuste menos no digital 9 #define DHTPIN A1 // pino que estamos conectado #define DHTTYPE DHT11 // DHT 11 #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); //objeto para o OLED #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); // ======================================================================================================== DHT dht(DHTPIN, DHTTYPE); // --- Protótipo das Funções Auxiliares --- void changeMenu(); //Função para modificar o menu atual void dispMenu(); //Função para mostrar o menu atual void data_hora(); //Função do menu1, data e hora void temperatura(); //Função do menu2, temperatura void lights(); //Função do menu3, acionamento de lampadas void menu4(); //Função do menu4 // --- Variáveis Globais --- int temp; float hum; char menu = 0x01; //Variável para selecionar o menu char set1 = 0x00, set2 = 0x00; //Controle das lâmpadas boolean t_butUp, t_butDown, t_butP, t_butM; //Flags para armazenar o estado dos botões // ======================================================================================================== void setup () // --- Função setup --- { Serial.begin(9600); //serial em 9600 baud rate setSyncProvider(RTC.get); // the function to get the time from the RTC for(char i=9; i<13; i++) pinMode(i, INPUT_PULLUP); //Entrada para os botões (digitais 9 a 12) com pull-ups internos 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 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Inicializa OLED com endereço I2C 0x3C (para 128x64) display.clearDisplay(); display.display(); } // ======================================================================================================== // --- Função Loop --- void loop () { temp = sensors.getTempCByIndex(0); hum = dht.readHumidity(); sensors.requestTemperatures(); changeMenu(); dispMenu(); } // ======================================================================================================== // --- Desenvolvimento das Funções --- 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 display.clearDisplay(); //limpa o display OLED //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 display.clearDisplay(); //limpa o display OLED //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 disp_data(); //Chama a função de relógio break; //break case 0x02: //Caso 2 disp_temp(); //Chama a função do termômetro break; //break case 0x03: //Caso 3 disp_umid(); ; //Chama função para acionamento de lâmpadas break; //break case 0x04: //Caso 4 choca(); //Chama função para o menu4 break; //break } //end switch menu } //end dispMenu void disp_temp() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.print("Temp."); display.setTextSize(2); display.setCursor(3, 12); display.setTextColor(WHITE); display.print(temp); display.print(" C"); display.display(); display.clearDisplay(); } //end disp_temp void disp_umid() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(40, 0); display.print("Umid."); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(40, 12); display.print(hum); display.print(" %"); display.display(); display.clearDisplay(); } void disp_data() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.print("Hora"); display.setTextSize(1.75); display.setTextColor(WHITE); display.setCursor(3, 15); display.print(hour()); display.print(":"); display.print(minute()); display.print(":"); display.print(second()); display.setTextSize(1.5); display.setTextColor(WHITE); display.setCursor(65, 0); display.print("Data"); display.setTextSize(1.75); display.setTextColor(WHITE); display.setCursor(65, 15); display.print(day()); display.print("-"); display.print(month()); display.print("-"); display.print(year()); display.display(); display.clearDisplay(); } void choca() { } // ========================================================================================================
  4. Olá amigos, estou desenvolvendo uma chocadeira de TCC e preciso de um MENU legal pra ela, sou fraco de programação mas ja fiz algo.. Tem um código PID que vou implementar o menu depois, então provavelmente eu vou ter que mexer com os Delays.. Porque da forma que tá ele não vai funcionar com o PID, fiz um post anteriormente falando sobre isso, mas de toda forma o que eu preciso é: Um iniciador de processo de incubação via buttons.. Pois pretendo diminuir o set point gradativamente depois do decimo quinto dia o valor de temperatura, pois depois, o embrião ja produz seu próprio calor. Eu ja tenho um mostrador da umidade, temperatura e data e hora! Utilizando display OLED I2C, ds18b20 para temperatura e htud21 para umidade // --- Bibliotecas Auxiliares --- #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Time.h> #include <DS3232RTC.h> #include "cactus_io_HTU21D.h" // --- Definições e Objetos --- #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); //objeto para o OLED #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); HTU21D htu; //objeto para o htu21d // ======================================================================================================== // --- Variáveis Globais --- int temp; int hum; // ======================================================================================================== // --- Função setup --- void setup () { Serial.begin(9600); //serial em 9600 baud rate setSyncProvider(RTC.get); // the function to get the time from the RTC display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Inicializa OLED com endereço I2C 0x3C (para 128x64) display.clearDisplay(); display.display(); } // ======================================================================================================== // --- Função Loop --- void loop () { temp = sensors.getTempCByIndex(0); hum = htu.getHumidity(); sensors.requestTemperatures(); htu.readSensor(); disp_temp(); delay (4000); display.clearDisplay(); //limpa o display OLED disp_umid(); delay (4000); display.clearDisplay(); //limpa o display OLED disp_data(); delay (4000); display.clearDisplay(); //limpa o display OLED } // ======================================================================================================== // --- Desenvolvimento das Funções --- void disp_temp() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.print("Temp."); display.setTextSize(2); display.setCursor(3, 12); display.setTextColor(WHITE); display.print(temp); display.print(" C"); display.display(); delay (2000); } //end disp_temp void disp_umid() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(40, 0); display.print("Umid."); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(40, 12); display.print(hum); display.print(" %"); display.display(); } void disp_data() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.print("Hora"); display.setTextSize(1.75); display.setTextColor(WHITE); display.setCursor(3, 15); display.print(hour()); display.print(":"); display.print(minute()); display.print(":"); display.print(second()); display.setTextSize(1.5); display.setTextColor(WHITE); display.setCursor(70, 0); display.print("Data"); display.setTextSize(1.75); display.setTextColor(WHITE); display.setCursor(70, 15); display.print(day()); display.print("-"); display.print(month()); display.print("-"); display.print(year()); display.display(); } // ======================================================================================================== adicionado 3 minutos depois #include <PID_v1.h> #include <OneWire.h> #include <DallasTemperature.h> // Temp. sensor on PIN 2 on the Arduino #define ONE_WIRE_BUS 2 //Define Variables we'll be connecting to double Setpoint, Input, Output; int inputPin=0, outputPin=3; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); //Specify the links and initial tuning parameters PID myPID(&Input, &Output, &Setpoint,2,5,0, DIRECT); unsigned long serialTime; //this will help us know when to talk with processing void setup() { //initialize the serial link with processing Serial.begin(9600); //initialize the variables we're linked to // Input = analogRead(inputPin); Setpoint = 144; //turn the PID on myPID.SetMode(AUTOMATIC); } void loop() { //pid-related code sensors.requestTemperatures(); float ftemp= sensors.getTempCByIndex(0); Input = (double)ftemp; delay (500); myPID.Compute(); analogWrite(outputPin,Output); //send-receive with processing if it's time if(millis()>serialTime) { SerialReceive(); SerialSend(); serialTime+=500; } } /******************************************** * Serial Communication functions / helpers ********************************************/ union { // This Data structure lets byte asBytes[24]; // us take the byte array float asFloat[6]; // sent from processing and } // easily convert it to a foo; // float array // getting float values from processing into the arduino // was no small task. the way this program does it is // as follows: // * a float takes up 4 bytes. in processing, convert // the array of floats we want to send, into an array // of bytes. // * send the bytes to the arduino // * use a data structure known as a union to convert // the array of bytes back into an array of floats // the bytes coming from the arduino follow the following // format: // 0: 0=Manual, 1=Auto, else = ? error ? // 1: 0=Direct, 1=Reverse, else = ? error ? // 2-5: float setpoint // 6-9: float input // 10-13: float output // 14-17: float P_Param // 18-21: float I_Param // 22-245: float D_Param void SerialReceive() { // read the bytes sent from Processing int index=0; byte Auto_Man = -1; byte Direct_Reverse = -1; while(Serial.available()&&index<26) { if(index==0) Auto_Man = Serial.read(); else if(index==1) Direct_Reverse = Serial.read(); else foo.asBytes[index-2] = Serial.read(); index++; } // if the information we got was in the correct format, // read it into the system if(index==26 && (Auto_Man==0 || Auto_Man==1)&& (Direct_Reverse==0 || Direct_Reverse==1)) { Setpoint=double(foo.asFloat[0]); //Input=double(foo.asFloat[1]); // * the user has the ability to send the // value of "Input" in most cases (as // in this one) this is not needed. if(Auto_Man==0) // * only change the output if we are in { // manual mode. otherwise we'll get an Output=double(foo.asFloat[2]); // output blip, then the controller will } // overwrite. double p, i, d; // * read in and set the controller tunings p = double(foo.asFloat[3]); // i = double(foo.asFloat[4]); // d = double(foo.asFloat[5]); // myPID.SetTunings(p, i, d); // if(Auto_Man==0) myPID.SetMode(MANUAL);// * set the controller mode else myPID.SetMode(AUTOMATIC); // if(Direct_Reverse==0) myPID.SetControllerDirection(DIRECT);// * set the controller Direction else myPID.SetControllerDirection(REVERSE); // } Serial.flush(); // * clear any random data from the serial buffer } // unlike our tiny microprocessor, the processing ap // has no problem converting strings into floats, so // we can just send strings. much easier than getting // floats from processing to here no? void SerialSend() { Serial.print("PID "); Serial.print(Setpoint); Serial.print(" "); Serial.print(Input); Serial.print(" "); Serial.print(Output); Serial.print(" "); Serial.print(myPID.GetKp()); Serial.print(" "); Serial.print(myPID.GetKi()); Serial.print(" "); Serial.print(myPID.GetKd()); Serial.print(" "); if(myPID.GetMode()==AUTOMATIC) Serial.print("Automatic"); else Serial.print("Manual"); Serial.print(" "); if(myPID.GetDirection()==DIRECT) Serial.println("Direct"); else Serial.println("Reverse"); } Esse é o código do PID que eu fiz para o d218b20.. Obtive boas respostas, mas preciso implementar o MENU LCD nele, com sistema de rolamento de ovo feito por relé ponte H e motor de microondas, sistema de umidificação feito por cooler 12v em relé e sistema de exaustão..
  5. Códio PID e Menu juntos (Arduino)

    Entendi, obrigado pessoal. Tem coisas que eu tenho que terminar no meu MENU antes de tentar adapta-lo ao PID. Quando eu melhorara ele eu já posto aqui pra vocês derem uma olhada no código do menu e no PID para juntarmos os 2.
  6. Boa noite! Estou desenvolvendo uma chocadeira controlada por PID, ela funciona da seguinte maneira: Desenvolvi um Dimmer PWM que controla a luminosidade da lâmpada incandescente, implementei em um código que utilizava entrada analógia (tipo lm35) porém não consegui boas respostas com esse sensor, modifiquei para digital e implementei o DS18b20 na programação, tive ótimasrespostas. Problemas: Rodar o menu e o controle PID em um microcontrolador. Eu estou rodando separado, em dois arduinos, um para controle e o outro para menu. Eu tentei implementar em um arduino só e não tive boas respostas por causa dos Delays do menu. Tem como o arduino rodar as duas funções juntas? Controle e o menu? Ou devemos adapta-la para ajustar os Delays? Lembrando que as funções do menu são: Mostrar temperatura, mostrar umidade, controlar relay de motor para rolagem dos ovos, controlar relay de coolers para exaustão e manter a umidade com um umidificador caseiro, iniciar processo de incubação, contando os dias.. Após 18 dias devo mudar o set point pra diminuir a temperatura, já que depois desse tempo o ovo consegue produzir seu próprio calor.. O que eu tenho feito do menu é o RTC mostrando data e hora, mostra temperatura e umidade.. Mas preciso implementar essas outras funções ao mesmo.
  7. Gente vou desistir do LM35 e vou partir pro DS18b20 Com ele eu acho que consigo as medidas.. Eu tentei fazer o que o amigo test man falou e não deu certo. double Temperatura; (tentei com double, tentei com int, float) void loop() { Temperatura = (5.0 * analogRead(tempPin) * 100.0) / 1024; Input = Temperatura; myPID.Compute(); analogWrite(outputPin,Output); if(millis()>serialTime) { SerialReceive(); SerialSend(); serialTime+=500; } }
  8. Então amigo, boa ideia em.. É exatamente o que eu vou fazer! Eu comecei assim, LDR e LED.. Depois parti pro dimmer, quebrei a cabeça com dimmer feito com disparador triac e moc4021, foi um fracasso no PID também porque ele controlava o tempo de disparo e não era PWM. Achei outro dimmer, um PWM deu muito certo. Dai do LDR foi pro LM35 e to me ferrando. Achei que era só implementar o LM35 q era analógico e GGWP.. Mas ta ai uma boa ideia para tentar solucionar o problema =>1° passo: Apenas ler o LM35; 2° passo: Converter a leitura para temperatura; 3° passo: Fazer o PWM controlar o brilho do LED; 4° passo: Controlar o aquecimento do resistor com o PWM (esses passos ja estão executados e funcionando perfeito).
  9. Amigo, na verdade sou eu o culpado. Eu não consegui orientador pro meu projeto, consegui de ultima hora e um orientador que ja estava com muito trabalho.. Então não culpo ele, apesar de ele poder se preocupar um pouco mais só. Porém não é esse meu problema, é de obter sinais de temperatura pro PID. Eu consegui outro lm35 para teste e deu a mesma *****. Para testes eu acrescentei um delay de 50ms no loop. Olha o que o sinal virou!
  10. Eu testei o código e não deu certo, não aparece nenhuma entrada. EU tentei fazer algumas modificações: No void setup eu troquei "Input = analogRead(inputPin);" por Input = TemperaturaCelsius * 20.46; não funcionou também. reparei que na linha "PID myPID(&Input, &Output, &Setpoint,0.01,0.2,0, DIRECT);" havia um Input e tentei trocar pela variavel TemperaturaCelsius. deu o seguinte erro: adicionado 1 minuto depois Codigo (1).docx
  11. Entendi. Estou desenvolvendo um projeto de TCC, meu orientador nao esta me ajudando nada nessa parte, apenas vai revisar meu trabalho. Por isso estou com essas dificuldades. Entendi, acho que assim vai funcionar, só tem que adicionar uma linha no loop. O "htu.readSensor();" pois essa função precisa ser executada sempre que ele chamar a função getTemp e no caso remover a linha Input = analogRead(inputPin); do seu código certo? Porque eu não vou mais estar fazendo leitura analógica do sensor e sim via I2C (A4 e A5) no meu arduino.
  12. LM35 Pin 1 - + 9v (bateria duracel) Pin 2 - A0 (arduino) (com e sem filtro) Pin 3 - GND 9v Arduino (estou alimentando via serial) A0 - pin 2 LM35dz D3 - Sai pwm do dimmer GND - GND dimmer Dimmer ligado ao 110v e lâmpada, circuito do dimmer segue em anexo.
  13. Eu testei com bateria de 9v sem filtro e segue em anexo o sinal doido.. testei com filtro da forma da imagem que você postou iza, utilizei um resistor de 10k e capacitor de 1uF e depois 10uF.. Não me deram sinais precisos também. Acho que ou o LM35 ta danificado, ou ele n ta funcionando no PID mesmo. adicionado 30 minutos depois Acho que acabei danificando o LM35 ou a matemática do pid não funciona com ele..Minha situação é a seguinte, ou eu espero o LM35 novo que eu pedi pela net chegar e faço novamente os testes. Ou faço a implementação do HTU21D (de precisão e eu ja tenho aqui) ou o DHT11 que está chegando com o lm35. Eu tentei já implementar o HTU21D mas não consegui, ele utiliza comunicação i2C e eu precisaria fazer um jogo de variaveis talvez, e não tenho ideia de como fazer isso.. Preciso muito ter o sinal preciso de temperatura, o dimmer PWM já está ajustado e funcionando bem.. Só falta isso pra testar a chocadeira e ver como ela se sai.
  14. 100nF eu não encontro aqui, hoje vou testar com bateria 9V e com essa ligação de um resistor de 10k e 1uF

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×