BASIC4MCU | 질문게시판 | 압력센서에 따른 진동모터를 버튼으로 제어
페이지 정보
작성자 유케이 작성일2018-11-07 16:21 조회1,037회 댓글5건본문
안녕하세요 압력센서에 3분이상 데이터 입력이 없으면 진동이 출력되고 진동이 울릴때 버튼을 누르면 진동이 완전히 멈추고(제가 하는 코드는 누를때만 멈추고 다시 때면 진동이 울립니다. 그렇지않고 한번만 누르면 멈출수있도록) 버튼을 눌렀을때를 1로 누르지 않으면 0으로 계속해서 출력이 될 수 있도록 하는 코딩을 하는방법이 도저히 감이 안잡혀서 글을 올립니다 .
void setup() {
pinMode(11, OUTPUT);
pinMode(8, INPUT);
int i;
}void loop() {
if(digitalRead(8)==1) { //8번에 연결된 버튼이 눌리면
digitalWrite(11, LOW); //진동이 멈춘다
delay(100);
}
else { //버튼을 누르지 않으면
digitalWrite(11, HIGH); //진동이 생긴다.
}
}
댓글 5
조회수 1,037유케이님의 댓글
유케이 작성일
추가적으로 압력이 3분전에 입력이 될경우는 압력 값을 출력하고 싶습니다.
센서에 압력에 따른 데이터를 출력하는것과 진동을 버튼으로 제어하는 것은 모두 해보았는데 위의 설명처럼 할려고 하니 잘모르겠습니다.
master님의 댓글
master
코드에 압력센서는 안보이는데요?
유케이님의 댓글
유케이
#include <Phpoc.h>
#include <SPI.h>
#include <ThingSpeak.h>
#include <OneWire.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 10, TXPin = 11;
static const uint32_t SIOBaud = 9600;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
PhpocClient client;
unsigned long myChannelNumber = 616998;
const char* myWriteAPIKey = "YSI1NAR6VG1C3655";
PhpocServer server(80);
int DS18S20_Pin = 2;
int SensorPin = A0;
OneWire ds(DS18S20_Pin);
void setup()
{
Serial.begin(SIOBaud);
ss.begin(GPSBaud);
Serial.print(F("Latitude Longitude Date "));
Serial.begin(9600);
while(!Serial);
Phpoc.begin(PF_LOG_SPI | PF_LOG_NET | PF_LOG_APP);
Serial.println("Phpoc test");
Serial.println("");
Phpoc.begin();
ThingSpeak.begin(client);
}
void loop()
{
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
printDateTime(gps.date);
unsigned long distanceKmToLondon =
(unsigned long)TinyGPSPlus::distanceBetween(
gps.location.lat(),
gps.location.lng(),
LONDON_LAT,
LONDON_LON) / 1000;
double courseToLondon =
TinyGPSPlus::courseTo(
gps.location.lat(),
gps.location.lng(),
LONDON_LAT,
LONDON_LON);
const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);
Serial.println();
smartDelay(1000);
if (millis() > 5000 && gps.charsProcessed() < 10)
Serial.println(F("No GPS data received: check wiring"));
float temperature = getTemp();
int SensorReading = analogRead(SensorPin);
int mfsr_r18 = map(SensorReading, 0, 1024, 0, 255);
Serial.println(temperature);
Serial.println(mfsr_r18);
ThingSpeak.setField(1,temperature);
ThingSpeak.setField(2, mfsr_r18);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
delay(30000);
}
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
static void printFloat(float val, bool valid, int len, int prec)
{
if (!valid)
{
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
Serial.print(' ');
}
smartDelay(0);
}
static void printDateTime(TinyGPSDate &d)
{
if (!d.isValid())
{ }
else
{
char sz[32];
sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
Serial.print(sz);
}
}
float getTemp() {
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1);
delay(750);
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for (int i = 0; i < 9; i++) {
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB);
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}
현재 다음과같이 여러가지 센서를 통합적으로 사용중입니다 . 여기서 추가하고싶습니다
master님의 댓글
master 작성일
int SensorReading=analogRead(SensorPin);
int mfsr_r18=map(SensorReading,0,1024,0,255); Serial.println(mfsr_r18);
압력센서가 이 코드죠?
유케이님의 댓글
유케이 작성일네 맞습니다 ~~~~ㅎㅎ