Low Pass Filter

Se prezintă schema unui filtru de joasa frecventa. Este necesar când folosim integrate electronice in prezenta parazitilor care apar pe cabluri.

Un exemplu de valori pentru Arduino. Filtru este aplicat pe pinul de intrare:

R=1k - 4k

C=100n - 1micro /63v

Configurare termistor 10k

Senzor temperatura termistor 10k



Izolare Galvanică Simplă


Se prezintă schema unui izolator galvanic simplu construit cu un led și un fotorezistor.




Voltage Divider

Se prezintă o schemă a unui divizor de tensiune


Arduino Switch Toggle


Model de cod Switch Toggle.
Cu acest cod se poate aprinde/stinge un led prin apăsarea unui buton push fără reținere conectat la o intrare.
La intrare vom avea o rezistență de 10k conectată la masă. Butonul este conectat între pin arduino și +5v.
Varianta toggle reprezintă aprinderea și menținerea ledului la apăsarea butonului. Pentru stingerea ledului este necesară o nouă apăsare a butonului. Ciclul se repetă la infinit.
În cod este adăugat și un debounce pentru evitarea apariției paraziților când este apăsat butonul.

Arduino Switch Toggle 1

int inPin = 8;         // the number of the input pin
int outPin = 13;       // the number of the output pin

boolean reading;           // the current reading from the input pin
boolean previous = LOW;    // the previous reading from the input pin

unsigned long debounce = millis();   // the debounce time

void setup()
{
  pinMode(inPin,  INPUT);
  pinMode(outPin, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  reading = digitalRead(inPin);
  Serial.println(reading);
 
  if (reading == HIGH && previous == LOW && millis()-debounce > 1000){ // debounce 1 sec.
        Serial.println("inside debounce if - Toggle Active"); //for test only
        digitalWrite(outPin, !digitalRead(outPin)); // toggle out pin
        debounce = millis(); // reset millis
  }
  previous = reading; // save previous reading
}

Arduino Switch Toggle 2


int inPin = 8;         // the number of the input pin
int outPin = 13;       // the number of the output pin

boolean previous = false;    // define state

unsigned long debounce = millis();   // the debounce time

void setup()
{
  pinMode(inPin,  INPUT);
  pinMode(outPin, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(inPin)==LOW){previous = false;}

  if (digitalRead(inPin)==HIGH && previous == false && millis()-debounce > 1000)  // debounce 1 sec.
  {
    Serial.println("inside debounce if - Toggle Active"); //for test only
    digitalWrite(outPin, !digitalRead(outPin)); // toggle out pin
    debounce = millis(); // reset millis
    previous = true; // save previous reading
  }
  delay(10); //wait
}

Arduino Switch Debounce


Model de cod Switch Debounce. În cazul apariției unor paraziți la intrările arduino, ceea ce vor duce la citirea unor erori gen circuit închis/deschis, se poate folosi în cod un debouncer.

Arduino Debounce

const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin

unsigned long debounce = millis(); // store millis for debounce

void setup() {
 pinMode(buttonPin, INPUT);
 pinMode(ledPin, OUTPUT);
}

 void loop() {
 if (digitalRead(buttonPin) == HIGH && (millis() - debounce) > 500){
 digitalWrite(ledPin, HIGH); //switch on led
}
 if (digitalRead(buttonPin) == LOW){
 digitalWrite(ledPin, LOW); //switch on led
 debounce = millis(); // reset millis
 }
 }

Server ESP8266 (ESP-01)


Model Server ESP-01 accesat din browser. Led ON/OFF conectat la pinul 2 (GPIO2)

Server ESP-01

/*
ESP-01 Server
 */
// include library
#include <ESP8266WiFi.h>
// end include library

const char* ssid = "ssid";  //set wifi id
const char* password = "password"; //set wifi password

WiFiServer androidServer(2563);              // set port number for android netIO

// setup
void setup(){
 Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
 
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.config(IPAddress(192,168,1,122), IPAddress(255,255,255,0), IPAddress(192,168,1,1)); // static ip,dns,gateway
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  androidServer.begin();    // start the server for android netIO
Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());

}
// end setup

// main loop


void loop() {

  WiFiClient client = androidServer.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }

  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  // Match the request

  int value = LOW;
  if (request.indexOf("/LED=ON") != -1) {
                              digitalWrite(2, HIGH);
                              Serial.print("LED ON");
    value = HIGH;
  }
  if (request.indexOf("/LED=OFF") != -1){
                              digitalWrite(2, LOW);  
                              Serial.print("LED OFF");
    value = LOW;
  }
 
  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");

  client.print("Led pin is now: ");
  if(value == HIGH) {
    client.print("On");
  } else {
    client.print("Off");
  }
  client.println("<br><br>");
  client.println("Click <a href=\"/LED=ON\">here</a> Turn relay ON<br>");
  client.println("Click <a href=\"/LED=OFF\">here</a> Turn relay OFF<br>");
  client.println("</html>");

  delay(1);
  Serial.println("Client disconnected");
  Serial.println("");
}

Se poate lega ieșirea GPIO la un releu

Model schemă electronică pentru legarea unui releu la ieșirea GPIO1

Legături N-Mosfet Logic Level

Implementare N-Mosfet Logic Level într-un circuit. PWM Arduino pentru Leduri, Motoare......
Mosfetul Logic Level se deschide la maxim cu 5v pe Gate)



Mai multe informații

PushBox - Arduino


PushingBox este un site intermediar care direcționează notificările venite de la o placă de dezvoltare, spre un dispozitiv smart sau un cont de mail, cu ajutorul unor servicii plătite sau gratuite. Aici se pot face diferite scenarii a căror identități (deviceID) se vor introduce în codul prezentat mai jos.

PushingBox Sketch for Arduino

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   // Be sure address is unique in network
IPAddress ip(192, 168, 1, 110); // IP address, may need to change depending on network

//Your secret DevID from PushingBox.com. You can use multiple DevID  on multiple Pin if you want
char DEVID1[] = "v9DD50EF7F2E6671";        //Scenario : "The mailbox is open"

//Numeric Pin where you connect your switch
uint8_t pinDevid1 = 3; // Example : the mailbox switch is connect to the Pin 3

char serverName[] = "api.pushingbox.com";

boolean DEBUG = true;  // Debug mode
boolean pinDevid1State = false;                // Save the last state of the Pin for DEVID1
boolean lastConnected = false;                 // State of the connection last time through the main loop

EthernetClient client;  // Initialize the Ethernet client library

void setup() {
 
  // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
   
  Serial.begin(9600);       // for debugging
   
  pinMode(pinDevid1, INPUT);
     
  Ethernet.begin(mac, ip);  // initialize Ethernet device
}

void loop()
{
 // Listening for the pinDevid1 state

      if (digitalRead(pinDevid1) == HIGH && pinDevid1State == false) // switch on pinDevid1 is ON
      {
        if(DEBUG){Serial.println("pinDevid1 is HIGH");}
        pinDevid1State = true;
        //Sending request to PushingBox when the pin is HIGHT
        sendToPushingBox(DEVID1);
      }
      if (digitalRead(pinDevid1) == LOW && pinDevid1State == true) // switch on pinDevid1 is OFF
      {
        if(DEBUG){Serial.println("pinDevid1 is LOW");}
        pinDevid1State = false;
        //Sending request to PushingBox when the pin is LOW
        //sendToPushingBox(DEVID1);    //Here you can run other scenario by creating a DEVID2
      }
     
     
      //DEBUG part
      // this write the respons from PushingBox Server.
      // You should see a "200 OK"
      if (client.available()) {
        char c = client.read();
        if(DEBUG){Serial.print(c);}
      }
     
      // if there's no net connection, but there was one last time
      // through the loop, then stop the client:
      if (!client.connected() && lastConnected) {
        if(DEBUG){Serial.println();}
        if(DEBUG){Serial.println("disconnecting.");}
        client.stop();
      }
      lastConnected = client.connected();
}

//Function for sending the request to PushingBox
void sendToPushingBox(char devid[]){
  client.stop();
  if(DEBUG){Serial.println("connecting...");}

  if (client.connect(serverName, 80)) {
    if(DEBUG){Serial.println("connected");}

    if(DEBUG){Serial.println("sendind request");}
    client.print("GET /pushingbox?devid=");
    client.print(devid);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(serverName);
    client.println("User-Agent: Arduino");
    client.println();
  }
  else {
    if(DEBUG){Serial.println("connection failed");}
  }
}

WatchDog - Reset a system



WatchDog Hardware

Circuitul prezentat este realizat în jurul integratului 555 și folosit ca timer pentru resetarea unui dispozitiv. Sistemul este denumit "WatchDog". În această situație circuitul este folosit pentru placa de dezvoltare Arduino.
Varianta hardware reprezintă aplicarea unui semnal pe pinul de reset al dispozitivului, cea ce duce la resetarea sistemului.

Circuitul funcționează ca un astabil. La punerea în funcțiune, ieșirea 555 este pozitivă și datorită diodei nu poate trece spre Reset. Condensatorul C1 se încarcă prin R1 și R2 până când linia Discharge 555 se deschide, cea ce duce la descărcarea C1 și apariția unei tensiuni negative la ieșirea 555 și implicit la pinul Reset prin D1, rezultând Resetarea Sistemului. După descărcarea C1 ciclul se reaia.
În această configurație, fără  să conectam pinul Digital I/O, ciclul se repetă după aprox. 80 secunde (avem un Reset la fiecare 80 sec.). Dacă dorim controlul Resetului, trebuie aplicat la pinul Digital I/O un semnal negativ scurt în intervalul de 80 sec pentru a reinițializa circuitul (mai exact, punerea la masă prin R3 duce la reîncărcarea C1).



Programare Arduino pentru control 555 prin pin Digital I/O:

Reinițializare WatchDog la un interval de 5 secunde folosind funcția Delay
>> (Această variantă întârzie ciclul programului cu 5 sec. !!!)

int dog = 12;                                     // set pin for harware watchdog (Digital I/O)

void loop()
{
  // set harware watchdog circuit
  pinMode(dog, OUTPUT);             // set dog pin
  digitalWrite(dog, LOW);               // reset dog
  delay(200);
  pinMode(dog, INPUT);                 // release dog
  Serial.println("WatchDog Hardware restarted...");
  delay(5000);                                  // wait 5 sec before run again
}

Reinițializare WatchDog la un interval de 10 secunde folosind funcția millis

int dog = 12;                                                    // set pin for harware watchdog (Digital I/O)
unsigned long timedelay = millis();             // store last time update for harware watchdog
const int interval = 10000;                           // set 10 sec. interval for restart harware watchdog

void loop()
{
    // set harware watchdog circuit
  if ((millis()-timedelay) > interval) {
  pinMode(dog, OUTPUT);                      // set dog pin
  digitalWrite(dog, LOW);                        // reset dog
  delay(200);
  pinMode(dog, INPUT);                          // release dog
  Serial.println("WatchDog Hardware restarted...");
  timedelay = millis();
}

WatchDog Software

 Varianta software constă doar în programarea plăcii de dezvoltare și nu necesită alte circuite periferice. Timerul intern variază între 15milisec și 8sec. Pentru programare este necesară includerea unor librării.

Programare Arduino pentru reset:

Reset dacă sistemul staționează mai mult de 2 secunde
 
#include <avr/wdt.h>  // include library
 
void setup() {
  wdt_disable(); // disable reset function at startup
  wdt_enable(WDTO_2S); // set reset for 2 sec
}
 
void loop() {
  wdt_reset(); // restart reset function
}

 
Reset folosind funcția de chemare și funcția millis la un interval de 60 sec
 
#include <avr/wdt.h>  // include library
unsigned long resetsys = millis();  // store millis for system reset
void loop() {
// millis function trigger on every 60 sec   
  if ((millis()-resetsys) > 60000) {
    reset(); // call reset function
    resetsys = millis(); // reset millis   
  }
}
 
void reset() {
  wdt_enable(WDTO_250MS);
  while(1);
}