Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
la nube
Interrupciones
Contenidos :
● Interrupciones
● Manejo de intervalos de Tiempo
● Interrupciones por timer y Control de periodos de tiempo
● Codigo ejemplo de leer dos sensores:uno cada medio segundo procesar los datos y
acumularlos el segundo sensor se leera cada 15 minutos. Ambos datos se enviaran cada
15 minutos
● Codigo ejemplo de enviar datos de dos sensores a base de datos via wifi :uno cada medio
segundo procesar los datos y acumularlos el segundo sensor se leera cada 15 minutos.
Ambos datos se enviaran cada 15 minutos . los datos tambien se enviaran a hoja de
excell via wifi
Las interrupciones
https://tecmikro.com/content/68-interrupciones-microcontroladores-pic
Las interrupciones son eventos que hacen que el microcontrolador deje de realizar la tarea
actual y pase a efectuar otra actividad. Al finalizar la segunda actividad retorna a la primera
y continúa a partir del punto donde se produjo la interrupción. Las interrupciones permiten
que un solo microcontrolador ejecute varias tareas (no exactamente al mismo tiempo)
dependiendo del evento que desencadene la interrupción. Estos dispositivos tienen desde
10 hasta 15 fuentes de interrupción dependiendo del tipo específico de microcontrolador. El
manejo de las interrupciones se programa por medio de registros especiales que controlan
el comportamiento del microcontrolador bajo determinadas circunstancias.
Cuando se activa una interrupcion se ejecuta un pedazo de codigo llamada manejador de
la interrupcion o Interrupt handler.
Interrupciones por Timer
https://www.electrontools.com/Home/WP/como-usar-las-interrupciones-en-arduino/#:~:text=Inter
rupciones%20por%20Timer,alimentar%20motores%20de%20corriente%20continua.
Los timers tienen algo que se conoce como prescaler, son divisores de la
frecuencia de clock, cuando dividimos la frecuencia ganamos en tiempo pero
perdemos en precisión, la frecuencia del cristal se puede dividor por 1,8,64,256
El siguiente ejemplo ejecuta una interrupcion por timer cada 250ms y prende y
apaga un led cada vez que se la atiende.
#include <TimerOne.h>
const int led = 13; // the pin with a LED
int ledState = LOW; // El LED empieza apagado
volatile unsigned long blinkCount = 0; // La definimos como volatile
void setup(void)
{
pinMode(led, OUTPUT);
Timer1.initialize(250000); // Dispara cada 250 ms
Timer1.attachInterrupt(ISR_Blink); // Activa la interrupcion y la asocia
a ISR_Blink
Serial.begin(9600);
}
void ISR_Blink()
{ ledState = !ledState ;
blinkCount++ ; // Contador veces se enciende el LED
}
void loop(void)
{
unsigned long N; // Haremos copia del blinkCount
digitalWrite(led, ledState); // Asignamos el valor del
// status a la salida
noInterrupts(); // Suspende las interrupciones
N = blinkCount;
interrupts(); // Autoriza las interrupciones
Serial.print("Ciclos = ");
Serial.println(N);
delay(100);
Cuando se necesita controlar con precisión el tiempo se pueden usar los timers de los
microcontroladores. Existen dos metodos :
La función millis() permite obtener la cantidad de milisegundos que han pasado desde
que comenzó la ejecución del código, es decir, que toma el registro de pulsos generados por
el contador y los emplea para calcular el tiempo en milisegundos.
La sintaxis de la función es muy simple:
void setup() {
Serial.begin(9600);
pinMode( pinLED, OUTPUT );
}
void toggleLed(){
if( digitalRead( pinLED ) )
digitalWrite(pinLED, LOW);
else
digitalWrite(pinLED, HIGH);
}
void sensor(){
int raw = analogRead(A0);
float temp = ((float)raw)* 5.0 * 100.0 / 1024;
void loop() {
unsigned long actual = millis();
// otras acciones
Interrupt Function
Timer1.attachInterrupt(function);
Run a function each time the timer period finishes. The function is run as an interrupt, so special care is needed to share any
variables beteen the interrupt function and your main program.
Timer1.detachInterrupt();
Disable the interrupt, so the function no longer runs.
Example Program
#include <TimerOne.h>
// This example uses the timer interrupt to blink an LED
// and also demonstrates how to share a variable between
// the interrupt and the main program.
void setup(void)
{
pinMode(led, OUTPUT);
Timer1.initialize(150000);
Timer1.attachInterrupt(blinkLED); // blinkLED to run every 0.15 seconds
Serial.begin(9600);
}
void blinkLED(void)
{
if (ledState == LOW) {
ledState = HIGH;
blinkCount = blinkCount + 1; // increase when LED turns on
} else {
ledState = LOW;
}
digitalWrite(led, ledState);
}
Serial.print("blinkCount = ");
Serial.println(blinkCopy);
delay(100);
}
Variables usually need to be "volatile" types. Volatile tells the compiler to avoid optimizations
that assume variable can not spontaneously change. Because your function may change
variables while your program is using them, the compiler needs this hint. But volatile alone is
often not enough.
When accessing shared variables, usually interrupts must be disabled. Even with volatile, if
the interrupt changes a multi-byte variable between a sequence of instructions, it can be read
incorrectly. If your data is multiple variables, such as an array and a count, usually interrupts
need to be disabled for the entire sequence of your code which accesses the data.
Código ejemplo
leer dos sensores:uno cada medio segundo procesar los datos y acumularlos el segundo
sensor se leera cada 15 minutos. Ambos datos se enviaran cada 15 minutos . Para facilidad
leeran cada 9 segundos descomentar intervalo según el caso
#include <TimerOne.h>
const int led = LED_BUILTIN; // the pin with a LED
//interrupcion es cada .1 segundo para generar un
//ciclo de 15 minutos
//necesito 10 interrpciones*60*15=9000 interrupciones
//const int intervalo=9000;//par 15 min
const int intervalo=90;//para prueba
void setup(void)
{
pinMode(led, OUTPUT);
Timer1.initialize(100000);
Timer1.attachInterrupt(blinkLED); // blinkLED to run every 0.1 seconds
Serial.begin(9600);
}
void blinkLED(void)
{
sensorValue = analogRead(sensorPin);
potencia=float(sensorValue)*127; // suponer correinte es igual a sensorvalue
demanda=demanda+(potencia*0.1)/(3600000); //
wattsegundo(1kw/1000watt)(1hora/3600seg)
sensor2 = analogRead(sensor2Pin);
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
blinkCount = blinkCount + 1;
if(blinkCount>=intervalo )
{
blinkCount=0;
Serial.print("demanda=");
Serial.print(demanda);
Serial.print("\t"); // simbolo para tabulador
Serial.print("sensor2=");
Serial.println(sensor2);
}
digitalWrite(led, ledState);
}
void loop(void)
{
unsigned long blinkCopy; // holds a copy of the blinkCount
noInterrupts();
blinkCopy = blinkCount;
interrupts();
// Serial.print("blinkCount = ");
// Serial.println(blinkCopy);
delay(100);
}
Codigo ejemplo de enviar datos de dos sensores a base de
datos via wifi
https://drive.google.com/drive/folders/1qtJ-bwdFuTxyR4-anJ
DIhONf3j1y9qLg?usp=sharing
Codigo principal
#include <TimerOne.h>
pinMode(led, OUTPUT);
Timer1.initialize(100000);
Timer1.attachInterrupt(blinkLED); // blinkLED to run every 0.10 seconds
Serial.begin(9600);
Serial2.begin(9600);
Serial2.println(F("AT"));
if(Serial2.find("OK"))
Serial2.println(F("Respuesta AT correcto"));
else
Serial2.println(F("Error en ESP8266"));
//-----Configuración de red-------//Podemos comentar si el ESP ya está configurado
void blinkLED(void)
{
sensorValue = analogRead(sensorPin);
potencia=float(sensorValue)*127; // suponer correinte es igual a sensorvalue
demanda=demanda+(potencia*0.1)/(3600000); //
wattsegundo(1kw/1000watt)(1hora/3600seg)
sensor2 = analogRead(sensor2Pin);
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
blinkCount = blinkCount + 1;
if(blinkCount>=intervalo )
{
blinkCount=0;
Serial.print("demanda=");
Serial.print(demanda);
Serial.print("\t"); // simbolo para tabulador
Serial.print("sensor2=");
Serial.println(sensor2);
}
digitalWrite(led, ledState);
}
void loop(void)
{
unsigned long blinkCopy; // holds a copy of the blinkCount
noInterrupts();
blinkCopy = blinkCount;
interrupts();
delay(100);
}
void enviowifi(void){
//--- programa-------
//Nos conectamos con el servidor:
if( Serial2.find("OK"))
{
Serial.println("\r\n\r\n\r\n ESP8266 conectado con el servidor...");
peticionHTTP=peticionHTTP+"Host: api.pushingbox.com\r\n\r\n";
peticionHTTP=peticionHTTP+"Connection: close\r\n\r\n" ;
///
boolean fin_respuesta=false;
long tiempo_inicio=millis();
cadena="";
while(fin_respuesta==false)
{
while(Serial2.available()>0)
{
char c=Serial2.read();
Serial.write(c);
cadena.concat(c); //guardamos la respuesta en el string "cadena"
}
//finalizamos si la respuesta es mayor a 500 caracteres
if(cadena.length()>500) //Pueden aumentar si tenen suficiente espacio en la
memoria
{
Serial.println("La respuesta a excedido el tamaño maximo");
Serial2.println("AT+CIPCLOSE");
if( Serial2.find("OK"))
Serial.println("Conexion finalizada");
fin_respuesta=true;
}
if((millis()-tiempo_inicio)>10000) //Finalizamos si ya han transcurrido 10 seg
{
Serial.println("Tiempo de espera agotado");
Serial2.println("AT+CIPCLOSE");
if( Serial2.find("OK"))
Serial.println("Conexion finalizada");
fin_respuesta=true;
}
if(cadena.indexOf("CLOSED")>0) //si recibimos un CLOSED significa que ha
finalizado la respuesta
{
Serial.println();
Serial.println("Cadena recibida correctamente, conexion finalizada");
fin_respuesta=true;
}
}
}
else
{
Serial.println("No se ha podido enviar HTTP.....");
////
}
}
}
else
{
Serial.println("No se ha podido conectarse con el servidor");
}
//-------------------------------------------------------------------------------