Orange Pi разширителна платка

Orange Pi разширителна платка

Orange Pi разширителна платка
базирана на контролера Аtmega328p.

С развитието на технологиите и произвеждането на все по-нови ARM – Linux базирани платформи, AVR контролоерите останаха на заден план. Основен проблем на ARM платформите е, че на gpio хедъра няма ADC/АЦП и PWM/ШИМ gpio-та, или ако има PWM/ШИМ то ще е един максимум два пина. За тази цел се продават допълнителни разширителни платформи. Тази разработката показва, че един контролер като Atmega328p или Atmega2560 може да свърши работата на интерфейсен чип между ADC/АЦП или изчитане на различни сензори и датчици базирани на Arduino. В този случай използвам сериина комуникация между ARM платформата Orange Pi PC-2 и AVR контролера Atmega328p.След изчитане на информацията от разширителната платформа с малко HTML и PHP код може да генерираме WEB среда за управление или да събираме логове в HTML таблици. Това става лесно и ще го покажа кодовете малко по надолу в статията.

Снимка на разширителната платформа.

Платката за това устройство е начертана на Fritzing.

Софтуер на Orange Pi разширителна платка

Разширителната платформа може да изчита три напрежения (до 50v , 20v , 10v , и ROW вход 0-1023). Снабдена е с четири релета, две захранващи от външен източник (захранващата букса на платката), едно захранвано с 5v (взема го от Orange Pi платформата), и едно комутиращо външни напрежения. На програмната SPI рейка до контролера може да се закачат различни сензори и датчици, както в единия случай съм закачил DHT22, сензор за температура и влажност. I2C порта съм оставил за бъдещи разработки.

int R1 = 2;
int R2 = 3;
int R3 = 4;
int R4 = 5;

int delaySoft = 50;

int R1out = 0;
int R2out = 0;
int R3out = 0;
int R4out = 0;

long a3 = 0;
//float Vout_x1 = 0.0;
int Vout_x1 = 0;

long a2 = 0;
float Vin_x2 = 0.0;
float Vout_x2 = 0.0;
float R1_x2 = 9.9900;
float R2_x2 = 9.8600;

long a1 = 0;
float Vin_x4 = 0.0;
float Vout_x4 = 0.0;
float R1_x4 = 9.8000;
float R2_x4 = 3.2500;

long a0 = 0;
float Vin_x10 = 0.0;
float Vout_x10 = 0.0;
float R1_x10 = 47.000;
float R2_x10 = 5.1000;


void setup() {
 Serial.begin(9600);

 pinMode(R1 , OUTPUT);
 pinMode(R2 , OUTPUT);
 pinMode(R3 , OUTPUT);
 pinMode(R4 , OUTPUT);

}

void A3_x1() {
 for (int i = 0 ; i < 100 ; i++) {
  a3 = a3 + analogRead(A3);
 }
// Vout_x1 = ((a3 * 5.0) / 1024) / 100;
 Vout_x1=a3 / 100;
 a3 = 0;
 
// Serial.print(Vout_x1);
// Serial.print(",");
//  delay(delaySoft);
}

void A2_x2() {
  for (int i = 0 ; i < 100 ; i++) {
    a2 = a2 + analogRead(A2);
  }
  Vin_x2 = ((a2 * 5.0) / 1024) / 100;
  Vout_x2 = Vin_x2 / (R2_x2/(R1_x2+R2_x2));
  a2 = 0;

//  Serial.print(Vout_x2);
//  Serial.print(",");
//   delay(delaySoft);
}

void A1_x4() {
  for (int i = 0 ; i < 100 ; i++) {
    a1 = a1 + analogRead(A1);
  }
  Vin_x4 = ((a1 * 5.0) / 1024) / 100;
  Vout_x4 = Vin_x4 / (R2_x4/(R1_x4+R2_x4));
  a1 = 0;

//  Serial.print(Vout_x4);
//  Serial.print(",");
//   delay(delaySoft);
}

void A0_x10() {
  for (int i = 0 ; i < 100 ; i++) {
    a0 = a0 + analogRead(A0);
  }
  Vin_x10 = ((a0 * 5.0) / 1024) / 100;
  Vout_x10 = Vin_x10 / (R2_x10/(R1_x10+R2_x10));
  a0 = 0;

//  Serial.print(Vout_x10);
//  Serial.print(",");
//   delay(delaySoft);
}

void sendData() {
  
  Serial.print(Vout_x1);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(Vout_x2);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(Vout_x4);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(Vout_x10);
   Serial.print(",");
    delay(delaySoft);

  Serial.print(R1out);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(R2out);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(R3out);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(R4out);
    delay(delaySoft);
  
  Serial.println();
   delay(delaySoft);
  
}

void loop() {

  if ( Serial.available() > 0) {
//   String Rcommand = Serial.readStringUntil('\n');
    char Rcommand = Serial.read();
    
    if (Rcommand == 'e') {
        sendData();
    }

    if (Rcommand == 'a') {
      digitalWrite(R1 , LOW);
       R1out = 0;
    }
    if (Rcommand == 'A') {
      digitalWrite(R1 , HIGH);
       R1out = 1;
    }

    if (Rcommand == 'b') {
      digitalWrite(R2 , LOW);
       R2out = 0;
    }
    if (Rcommand == 'B') {
      digitalWrite(R2 , HIGH);
       R2out = 1;
    }

    if (Rcommand == 'c') {
      digitalWrite(R3 , LOW);
       R3out = 0;
    }
    if (Rcommand == 'C' ) {
      digitalWrite(R3 , HIGH);
       R3out = 1;
    }

    if (Rcommand == 'd' ) {
      digitalWrite(R4 , LOW);
       R4out = 0;
    }
    if (Rcommand == 'D' ) {
      digitalWrite(R4 , HIGH);
       R4out = 1;
    }
  }

  A3_x1();
  A2_x2();
  A1_x4();
  A0_x10();
  
  delay(delaySoft);

}

В следващия пример ще покажа как се извежда лог в HTML таблица за зареждане на акумулатор ( от соларен панел ).

Bash скрипт за изчитане на данните от разширителната AVR платформа

#!/bin/bash

chmod 777 /dev/ttyS1
stty -F /dev/ttyS1 9600 -echo

devide=0.25

while true
 do

  Time=$(date)

  echo "e" > /dev/ttyS1
  serial=$(head -n1 /dev/ttyS1)

  soilSensor=$(echo $serial | cut -d',' -f 3)
  volt="$(echo "(( $soilSensor - $devide ))" | bc -l)"

  echo $volt >> volt.txt;
  echo $Time >> date.txt
  echo $soilSensor;

  sleep 1;
 done

HTML и PHP код

<html>
 <head>
 </head>

 < ?php

  function comment() {

    if(!file_exists("SoilHumidity.txt")) {
        echo "Comment text file is not exist!!!";
        exit;
    }

    if(!file_exists("date.txt")) {
        echo "Comment Name files is not exist!!!";
        exit;
    }

    $fsoilHum = fopen("SoilHumidity.txt" , r );
    $fdate = fopen("date.txt" , r );

    if(!$fsoilHum) {
        echo "file comentar not opened!";
        exit;
    }

    if(!$fdate) {
      echo "file comentar not opened!";
      exit;
    }

    echo "<table width=100% border=4>";
    $counter = 1;

    while(!feof($fsoilHum) && !feof($fdate)) {

        $soilHumidity = fgets($fsoilHum);
        $date = fgets($fdate);
        echo "<tr>";
        echo "<td width=3%><font color=black size=5><b> $counter </b></font></td>";
        echo "<td width=35%><font color=green size=5><b> $date </b></font></td>";
        echo "<td width=60%><font color=red size=5><b> $soilHumidity </b></font></td>";
        echo "<td width=2%><font color=blue size=5><b> V </b></font><td>";
        echo "</tr>";
        $counter++;
    }
    echo "</table>";
    fclose($fsoilHum);
    fclose($date);
   }
? >
 <body>
  < ?php
   comment();
  ? >
 </body>
</html>

Изходен резултат в Web страница

Orange Pi разширителна платка HTML изходящ код: час, напрежение на акомулатор

Следващия пример е за следене на хомеостазата на растение. В кода ще следим температурата и влажността на въздуха както и почвената влажност. Резултатите за улеснение отново ще извеждаме в HTML таблица.

Софтуер на Orange Pi разширителна платка

#include "DHT.h"
#define DHTPIN 9
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

int R1 = 2;
int R2 = 3;
int R3 = 4;
int R4 = 5;

int delaySoft = 50;

int R1out = 0;
int R2out = 0;
int R3out = 0;
int R4out = 0;

long a3 = 0;
//float Vout_x1 = 0.0;
int Vout_x1 = 0;

long a2 = 0;
float Vin_x2 = 0.0;
float Vout_x2 = 0.0;
float R1_x2 = 9.9900;
float R2_x2 = 9.8600;

long a1 = 0;
float Vin_x4 = 0.0;
float Vout_x4 = 0.0;
float R1_x4 = 9.8000;
float R2_x4 = 3.2500;

long a0 = 0;
float Vin_x10 = 0.0;
float Vout_x10 = 0.0;
float R1_x10 = 47.000;
float R2_x10 = 5.1000;


void setup() {
 Serial.begin(9600);
 
 dht.begin();

 pinMode(R1 , OUTPUT);
 pinMode(R2 , OUTPUT);
 pinMode(R3 , OUTPUT);
 pinMode(R4 , OUTPUT);

}

void A3_x1() {
 for (int i = 0 ; i < 100 ; i++) {
  a3 = a3 + analogRead(A3);
 }
// Vout_x1 = ((a3 * 5.0) / 1024) / 100;
 Vout_x1=a3 / 100;
 a3 = 0;
 
// Serial.print(Vout_x1);
// Serial.print(",");
//  delay(delaySoft);
}

void A2_x2() {
  for (int i = 0 ; i < 100 ; i++) {
    a2 = a2 + analogRead(A2);
  }
  Vin_x2 = ((a2 * 5.0) / 1024) / 100;
  Vout_x2 = Vin_x2 / (R2_x2/(R1_x2+R2_x2));
  a2 = 0;

//  Serial.print(Vout_x2);
//  Serial.print(",");
//   delay(delaySoft);
}

void A1_x4() {
  for (int i = 0 ; i < 100 ; i++) {
    a1 = a1 + analogRead(A1);
  }
  Vin_x4 = ((a1 * 5.0) / 1024) / 100;
  Vout_x4 = Vin_x4 / (R2_x4/(R1_x4+R2_x4));
  a1 = 0;

//  Serial.print(Vout_x4);
//  Serial.print(",");
//   delay(delaySoft);
}

void A0_x10() {
  for (int i = 0 ; i < 100 ; i++) {
    a0 = a0 + analogRead(A0);
  }
  Vin_x10 = ((a0 * 5.0) / 1024) / 100;
  Vout_x10 = Vin_x10 / (R2_x10/(R1_x10+R2_x10));
  a0 = 0;

//  Serial.print(Vout_x10);
//  Serial.print(",");
//   delay(delaySoft);
}

void sendData() {
  
  Serial.print(Vout_x1);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(Vout_x2);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(Vout_x4);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(Vout_x10);
   Serial.print(",");
    delay(delaySoft);

  Serial.print(R1out);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(R2out);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(R3out);
   Serial.print(",");
    delay(delaySoft);
  Serial.print(R4out);
    delay(delaySoft);

   Serial.print(",");
  Serial.print(dht.readTemperature());
   delay(delaySoft);
   Serial.print(",");
  Serial.print(dht.readHumidity());
    delay(delaySoft);
  
  Serial.println();
   delay(delaySoft);
  
}

void loop() {

  A3_x1();
  A2_x2();
  A1_x4();
  A0_x10();

  if ( Serial.available() > 0) {
//   String Rcommand = Serial.readStringUntil('\n');
    char Rcommand = Serial.read();
    
    if (Rcommand == 'e') {
        sendData();
    }

    if (Rcommand == 'a') {
      digitalWrite(R1 , LOW);
       R1out = 0;
    }
    if (Rcommand == 'A') {
      digitalWrite(R1 , HIGH);
       R1out = 1;
    }

    if (Rcommand == 'b') {
      digitalWrite(R2 , LOW);
       R2out = 0;
    }
    if (Rcommand == 'B') {
      digitalWrite(R2 , HIGH);
       R2out = 1;
    }

    if (Rcommand == 'c') {
      digitalWrite(R3 , LOW);
       R3out = 0;
    }
    if (Rcommand == 'C' ) {
      digitalWrite(R3 , HIGH);
       R3out = 1;
    }

    if (Rcommand == 'd' ) {
      digitalWrite(R4 , LOW);
       R4out = 0;
    }
    if (Rcommand == 'D' ) {
      digitalWrite(R4 , HIGH);
       R4out = 1;
    }
  }


  
  delay(delaySoft);

}

Shell script за изчитане на данните от разширителната AVR платформа

#!/bin/bash

chmod 777 /dev/ttyS1
stty -F /dev/ttyS1 9600 -echo

min=0     # for map
max=1023  # for map
Nmin=0    # for map
Nmax=100  # for map

function serialRead() {

  echo "e" > /dev/ttyS1   # send command to send bach data

  serial=$(head -n1  /dev/ttyS1)
#   echo $serial

  soilHum=$(echo $serial | cut -d',' -f 1)      # get result ROW data
   val1="$(echo "(( $soilHum-$min ))" | bc -l)"     # map function
   val2="$(echo "(( $max-$min ))" | bc -l)"     # map function
   val3="$(echo "(( $Nmax-$Nmin ))" | bc -l)"     # map function
   soilHum="$(echo "(( ($val1/$val2)*$val3+0 ))" | bc -l)"      # result from map function

   echo "SoilHum = " $soilHum | cut -b 1-15       # console print
   echo $soilHum | cut -b 1-4 >> soilHumLog.txt   # write to log file

#  x2=$(echo $serial | cut -d',' -f 2)
#   echo "x2 = " $x2
#  x4=$(echo $serial | cut -d',' -f 3)
#   echo "x4 = " $x4
#  x10=$(echo $serial | cut -d',' -f 4)
#   echo "x10 = " $x10
#  R1=$(echo $serial | cut -d',' -f 5)
#   echo "R1_state = " $R1
#  R2=$(echo $serial | cut -d',' -f 6)
#   echo "R2_state = " $R2
#  R3=$(echo $serial | cut -d',' -f 7)
#   echo "R3_state = " $R3
#  R4=$(echo $serial | cut -d',' -f 8)
#   echo "R4_state = " $R4

  temp=$(echo $serial | cut -d',' -f 9)
   echo "DHT_Temp = " $temp
   echo $temp >> tempLog.txt
  hum=$(echo $serial | cut -d',' -f 10)
   echo "DHT_Hum = " $hum
   echo $hum >> humLog.txt

  echo "================"

}

function sendData() {
 echo "e" > /dev/ttyS1;
}


while true
 do

  serialRead;
   Time=$(date);
    echo $Time >> timeLog.txt;

  sleep 600;

 done

HTML и PHP код

<html>
 <head>
 </head>

 < ?php

  function data() {

// проверка отваряне на файл timeLog.txt
    if(!file_exists("timeLog.txt")) {
        echo "timeLog.txt file is not exist!!!";
        exit;
    }

    $ftimeLog = fopen("timeLog.txt" , r );

    if(!$ftimeLog) {
      echo "file timeLog not opened!";
       exit;
    }


// проверка отваряне на файл tempLog.txt
    if(!file_exists("tempLog.txt")) {
        echo "tempLog.txt files is not exist!!!";
        exit;
    }

    $ftempLog = fopen("tempLog.txt" , r );

    if(!$ftempLog) {
      echo "file tempLog not opened!";
       exit;
    }

// проверка отваряне на файл humLog.txt
    if(!file_exists("humLog.txt")) {
        echo "humLog.txt files is not exist!!!";
        exit;
    }

    $fhumLog = fopen("humLog.txt" , r );

    if(!$fhumLog) {
      echo "file fhumLog not opened!";
       exit;
    }

// проверка отваряне на файл soilHumLog.txt
    if(!file_exists("soilHumLog.txt")) {
        echo "soilHumLog.txt files is not exist!!!";
        exit;
    }

    $fsoilHumLog = fopen("soilHumLog.txt" , r );

    if(!$fsoilHumLog) {
      echo "file fsoilHumLog not opened!";
       exit;
    }


//====================================================
//----------- Generate Table -----------------------//

    echo "<table width=100% border=4>";
    $counter = 1;

    while(!feof($timeLog) && !feof($ftempLog) && !feof($fhumLog) && !feof($fsoilHumLog)) {

        $timeLog = fgets($ftimeLog);
        $tempLog = fgets($ftempLog);
        $humLog = fgets($fhumLog);
        $soilHumLog = fgets($fsoilHumLog);

        echo "<tr>";
        echo "<td width=3%><font color=black size=5><b> $counter </b></font></td>";
        echo "<td width=35%><font color=green size=5><b> $timeLog </b></font></td>";
        echo "<td width=12%><font color=red size=5><b> $tempLog </b></font></td>";
        echo "<td width=3%><font color=blue size=5><b> *C </b></font></td>";
        echo "<td width=12%><font color=blue size=5><b> $humLog </b></font></td>";
        echo "<td width=10%><font color=blue size=5><b> % airHum </b></font></td>";
        echo "<td width=12%><font color=red size=5><b> $soilHumLog </b></font></td>";
        echo "<td width=10%><font color=blue size=5><b> % soilHum</b></font></td>";
 //       echo "<td width=2%><font color=blue size=5><b> V </b></font><td>";
        echo "</tr>";
        $counter++;
    }
    echo "</table>";
    fclose($fsoilHum);
    fclose($date);
   }
?>
 <body>
  < ?php
   data();
  ? >
 </body>
</html>

Изходен резултат в Web страница

Orange Pi разширителна платка - HTML изходящ код: час, температура, влажност, влажност на почвата

Надявам се тази идея за хардуерна платформа да ви хареса. Тя е лесна за изработка и може да се ползва като част от домашна автоматизация.