Memória
● Memória SRAM(memória de acesso aleatório estático):é onde os sketchs criam e manipulam as variáveis quando estão em execução.
● Memória Flash(espaço do programa): é onde o sketch do Arduino é armazenado.
● Memória EEPROM (Memória Somente de Leitura Programável Apagável Eletricamente): é o espaço de memória que os programadores podem usar para armazenar informações de longo termo.
RAM x SRAM
● RAM: É um tipo de memória volátil, pois perde dados após o desligamento da energia. Ele
contém dados e processos por um período limitado de tempo, apenas até que a CPU os solicite. As operações de Leitura e Escrita atuam muito rapidamente em uma RAM.
● SRAM: É um tipo de RAM, de atualização constante e construído com transistores. ○ Mais rápido;
○ Ocupa mais espaço físico;
○ Pouca quantidade de memória(2 kbyte no Arduino uno R3); ■ Lembrando que 1 Byte são 8 bits;
Flash
● Memoria de Programa
○ Armazena o sketch compilado;
● Memória não volátil (a informação persiste mesmo depois que a energia é desligada); ● 32kb de armazenamento, onde .5kb são para o bootload;
EEPROM
● Memoria para o programador
○ Armazena dados que o programador desejar;
● Memória não volátil (a informação persiste mesmo depois que a energia é desligada); ● 1kb (1024 Bytes) de armazenamento;
● Aproximadamente 100000 escritas;
EEPROM
● Usado para armazenar dados, exemplo: ○ Configurações;
○ Dados de difícil obtenção; ○ Dados estáticos;
● 100000 escritas, nesse caso, pode ser considerado pouco, tome cuidado!!!! ● Usado também para aumento de memória usando a comunicação I2C;
● 01 - Arduino; ● 04 - Resistores: ○ 01 - 125kΩ ○ 01 - 100kΩ ○ 02 - 1kΩ ● 02 - Botões; ● 01 - Bateria 9v; ● 01 Sensor de temperatura TMP36;
Circuito 1 EEPROM:
Código:
#include <EEPROM.h> #define AMOSTRAS 12 #define pinoTensao A0 #define pinoTermostato A1 #define botaoGravar 7 #define botaoLer 3 float Temperatura; int temp; float tensao; float VRef=5; float relacao=1.8; Continua...Código:
void setup() { Serial.begin(9600); pinMode(botaoGravar, INPUT); pinMode(botaoLer, INPUT); }float ValorTensao(uint8_t portaAnalogica);
float ValorTemperatura(uint8_t portaAnalogica);
void GravarTemperatura();
void LerTemperatura();
void mostraTensao();
Código:
void loop() {tensao = ValorTensao(pinoTensao); mostraTensao();
Temperatura = ValorTemperatura(pinoTermostato); mostraTemperatura();
if(tensao < 1 || digitalRead(botaoGravar) == HIGH){ GravarTemperatura();
}
if(digitalRead(botaoLer) == HIGH){ LerTemperatura(); } delay(500); } Continua...
Código:
float ValorTensao(uint8_t portaAnalogica) { float total = 0;for (int i = 0; i<AMOSTRAS; i++) { total += analogRead(portaAnalogica); delay(5);
}
total /= (float)AMOSTRAS;
total = (total* VRef * relacao) / 1024.0; return total;
}
float ValorTemperatura(uint8_t portaAnalogica){ float total = analogRead(portaAnalogica); total *= 5;
total /= 1024; total -= 0.5;
return total *= 100; }
Código:
void GravarTemperatura(){ temp = Temperatura; byte negativo = B1; Serial.println(tensao); if( temp >= 0 ){ EEPROM.write(0, 0); EEPROM.write(1, temp); } else{ EEPROM.write(0, negativo); EEPROM.write(1, temp*-1); }Serial.print("Valor Gravado na EEPROM com sucesso..."); }
Código:
void LerTemperatura(){
Serial.println(tensao); if( EEPROM.read(0) == 0){
Serial.println(EEPROM.read(1), DEC); } else{
Serial.println(EEPROM.read(1) * -1, DEC); }
Serial.print("Valor gravado na EEPROM: "); }
Código:
void mostraTensao() { Serial.print("Tensao: "); Serial.print(tensao); Serial.println ("V || "); } void mostraTemperatura(){ Serial.print("Temperatura: "); Serial.print(Temperatura); Serial.println ("C"); }Interrupções:
attachInterrupt()
● Interrupção:
○ Permite a interrupção do programa atual para dar atenção a um comando, exemplo, na comunicação é usado a interrupção de forma que, quando o microcontrolador recebe um sinal, a prioridade é que ele seja interpretado e armazenado;
○ Funções de interrupções são pequenas; ○ Várias interrupções podem ser dadas;
○ Se duas ou mais interrupções acontecerem ao mesmo tempo, pode estabelecer uma prioridade entre as funções;
○ Uma interrupção começa quando outra termina; ○ cuidado onde for usar o delay();
Interrupções:
● Interrupção(valores possíveis para interrupção):○ LOW: acionar a interrupção quando o estado do pino for LOW,
○ CHANGE: acionar a interrupção quando o sempre estado do pino mudar
○ RISING: acionar a interrupção quando o estado do pino for de LOW para HIGH apenas, ○ FALLING: acionar a interrupção quando o estado do pino for de HIGH para LOW apenas.
● 01 - Arduino; ● 04 - Resistores:
○ 03 - 220Ω ○ 01 - 330Ω ● 01 - Botões;
● 01 - LED RGB Catodo Comum;
Código:
#include <EEPROM.h>
int LED[3] = {9, 10, 11}; // Vermelho, azul, verde;
volatile const byte interruptPin = 3;
volatile int COR[3] = {0,0,0};
int corR, corG, corB;
void LerEEPROM();
void inicializaCores();
void setup(){ LerEEPROM();
inicializaCores();
for (int i = 0; i < 3; i++) { pinMode(LED[i], OUTPUT); }
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), interrupcao, FALLING); Serial.begin(9600);
void loop(){
if(corR != 255)
while(corR != 255){ corR+=15;
analogWrite(LED[0], corR); delay(1500);
}
else analogWrite(LED[1], 255);
if(corB != 255)
while(corB != 255){ corB+=15;
analogWrite(LED[1], corB); delay(1500);
}
else analogWrite(LED[2], 255); if(corG != 255)
while(corG != 255){ corG+=15;
analogWrite(LED[2], corG); delay(1500);
}
else analogWrite(LED[2], 255);
corR = 0; corG = 0; corB = 0; analogWrite(LED[0], LOW); analogWrite(LED[1], LOW); analogWrite(LED[2], LOW); }
void interrupcao() { Serial.print("Valor cores: R:"); Serial.print(corR); Serial.print("|| G: "); Serial.print(corG); Serial.print("|| B: "); Serial.println(corB); EEPROM.write(0,corR); EEPROM.write(1,corB); EEPROM.write(2,corG); } Continua...
void LerEEPROM(){ if(EEPROM.read(0)!= 0){ COR[0]=EEPROM.read(0); } if(EEPROM.read(1)!= 0){ COR[1]=EEPROM.read(1); } if(EEPROM.read(2)!= 0){ COR[2]=EEPROM.read(2); } }
void inicializaCores(){ corR = COR[0];
corB = COR[1]; corG = COR[2]; }
Controle PID
P =
Proporcional = Kp * e(t)
I =
Integral = Ki * Integral(e(t)*dt)
Controle PID
● Set point (Valor desejado);
● off-set (diferença entre Set point e o valor atual); ● Kp: Ganho proporcional.
● Ki: Ganho integral.
● Kd: Ganho derivativo.
Controle PID
Controle Proporcional: Trabalha em cima do erro. Faz com que o sistema trabalhe progressivamente para que o sistema chegue no set point, entretanto, o sistema nunca vai chegar nele. Exemplo: deseja-se encher um balde de 10L com água abrindo uma torneira, mas a medida que o tempo passe, vai-se fechando a torneira aos poucos, de forma que depois de x min, a torneira tem uma vazão entre 0<x<1 e o balde não está completamente cheio.
Controle PID
Controle Integral: usa-se junto com o P. Ele trabalha o tempo de forma que o resultado do valor Proporcional se aproxima mais do setPoint, diminuindo o off-set. Quanto maior o tempo de atraso, mais chances do sistema apresentar erros.
Controle PID
Controle Derivativo: Normalmente usado com o P+I e alguma vezes com o P. Ele irá trabalhar variações de erros grandes. A função dele é prever o erro num intervalo de tempo maior. o controle é pouco usado, mais normal a se usar é o controles P+I. Seu uso é menos de 5%.
Controle PID
Cálculo do Kp, Ki, KdControle PID
Controle PID
●
01 - Arduino;
●
04 - Resistores:
○
02 - 330Ω
●
01 - Potenciômetro - 250kΩ;
●
02 - LED;
Circuito 3 PID:
Código:
#define Resfriador 6 #define Aquecedor 3 #define TempPino A0 #define PotenPino A1 float Temperatura = 0; float SetPoint = 0; float PID=0; float PID_p=0; float PID_i=0; float kp = 2; float ki = 0.001;Código:
void setup(){ pinMode(Resfriador, OUTPUT); pinMode(Aquecedor, OUTPUT); Serial.begin(9600); } Continua...Código:
void loop(){ SetPoint = map(analogRead(PotenPino), 0, 1023, 0, 100); Temperatura = analogRead(TempPino); Temperatura *= 5; Temperatura /= 1024; Temperatura -= 0.5; Temperatura *= 100;float Erro = SetPoint - Temperatura; if(Erro==0){
analogWrite(Aquecedor, 0); analogWrite(Resfriador, 0); }
Código:
PID_p = kp * Erro;PID_i = PID_i + (ki * Erro);
PID = PID_p + PID_i; if(Erro>0){ analogWrite(Aquecedor, PID); analogWrite(Resfriador, 0); } else{ analogWrite(Resfriador, PID*-1); analogWrite(Aquecedor, 0); } Continua...